首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++成员在父构造函数和子构造函数之间更改值

c++成员在父构造函数和子构造函数之间更改值
EN

Stack Overflow用户
提问于 2015-03-10 16:49:08
回答 3查看 1.2K关注 0票数 1

在调用父类构造函数时和调用子构造函数时,基类受保护成员的值正在更改值时,我遇到了一个错误。简化后的代码版本如下:

代码语言:javascript
复制
Namespace A 
{
 class Parent
 {
  public:
   Parent (int a, int b, int c, int d);

  protected:
   std::vector<Eigen::Matrix<float, 3, 3, Eigen::RowMajor>> rmats_;
 }
}
A::Parent::Parent (int a, int b, int c, int d) {
 rmats_.reserve(3000);
 rmats_.clear ();
 Eigen::Matrix<float, 3, 3, Eigen::RowMajor> init_Rcam_ = Eigen::Matrix3f::Identity ();
 rmats_.push_back(init_Rcam_);
 std::cout << "size of rmats is " << rmats_.size() << std::endl;
}

Namespace B 
{
 class Child : public Parent
 {
  public:
   Child(int a, int b, int c, int d);
 }
}
B::Child::Child : A::Parent::Parent(a,b,c,d)
{
 std::cout << "size of rmats in the child is " << rmats_.size() << std::endl;
}

创建子对象时,父构造函数中的大小报告预期大小为1,但是子构造函数中的输出报告向量的大小现在为127101589483567331。在实际代码中还有其他几个类似对象的向量,所有这些向量都报告了不正确的矢量大小,包括尺寸1的另一个向量更改为0,以及大小3的向量更改为668637816。

我尝试使用更简单的代码版本,使用整数向量并获得预期的结果,但是,在两个打印cout语句之间不做任何附加操作的完整代码表明,向量的大小在父构造函数和子构造函数之间发生变化。此外,代码似乎在Linux下使用gcc正常工作,但在windows下使用visual studio中断。

在施工过程中是否有其他隐藏步骤会导致此错误?任何可能导致此类问题的编译器设置?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-10 17:17:08

根据C++中的构造规则,子构造函数将始终打印大小为1的子构造函数。在父构造函数完全完成之前,子构造函数的构造代码根本不执行(更多在C++:构造和初始化顺序保证上)。

看起来,Child类使用的是向量的垃圾内存地址。

Child.hppParent.cpp是否可能包含不同版本的Parent.hpp文件(您有二进制/头不匹配)?

票数 1
EN

Stack Overflow用户

发布于 2015-03-10 17:13:01

您的构造函数定义是错误的,在您的示例中有输入法,并且没有正确调用基本构造函数。

如果对父构造器定义使用正确的A::Parent::Parent(...) { }语法,对子构造函数使用B::Child::Child(...) : A::Parent(...) { },则示例将进行编译。

看到它在ideone.com中工作

票数 0
EN

Stack Overflow用户

发布于 2015-03-10 18:07:47

它只在windows上中断,使用类似于此的生产代码,但是这个测试片段在windows和posix上正确工作吗?

检查安装在windows框上的Eigen库版本。

在销毁init_Rcam_时,检查std::vector是否发生了任何奇怪的事情(这应该很好,因为std::载体应该有一个副本)。

检查在退出A::Parent::Parent()构造函数时可能损坏内存的无关错误,但在提取工作的简化代码时,这些错误似乎与此无关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28969481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档