C++ c++;在父构造函数和子构造函数之间更改值的成员
我遇到了一个错误,在调用父类构造函数和调用子构造函数之间,基类的受保护成员的值正在更改。 代码的精简版本如下所示:C++ c++;在父构造函数和子构造函数之间更改值的成员,c++,inheritance,vector,constructor,eigen,C++,Inheritance,Vector,Constructor,Eigen,我遇到了一个错误,在调用父类构造函数和调用子构造函数之间,基类的受保护成员的值正在更改。 代码的精简版本如下所示: 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::
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;
}
名称空间A
{
班级家长
{
公众:
父项(int a、int b、int c、int d);
受保护的:
std::向量rmats;
}
}
A::Parent::Parent(int A、int b、int c、int d){
准备金(3000);
rmats_uu.clear();
本征::矩阵init_Rcam_u2;=本征::矩阵x3f::恒等式();
返回(初始Rcam);
std::cout您的构造函数定义是错误的,您的示例中有拼写错误,并且没有正确调用基本构造函数
如果对父构造函数定义使用正确的A::Parent::Parent(…){}
语法,对子构造函数使用正确的B::Child::Child(…):A::Parent(…){}
,则示例将编译
< P>根据C++中的构造规则,子构造函数将总是打印1的大小。直到父构造函数完全完成(更多AT),子构造代码才执行。
看起来子类正在使用向量的垃圾内存地址
是否可能Child.hpp
和Parent.cpp
包含不同版本的Parent.hpp
文件(您有一个二进制/头不匹配)?它仅在windows上中断,使用与此类似的生产代码,但此测试snippit在windows和posix上正常工作
检查windows上安装的Eigen库版本
当您销毁init_Rcam_时,检查std::vector是否发生任何奇怪的情况(这应该可以,因为std::vector应该有一个副本)
退出A::Parent::Parent()时,检查是否存在可能损坏内存的无关错误构造器,但当您提取工作的简化代码时,它似乎无关紧要。也许我遗漏了什么。A::parent
?什么是A::parent::parent
?至少还有两个问题:child
vschild
和B::child
。此外,您定义了B::child
Ad使用B::Child
B::Child:Parent(a,B,c,d){不是声明的构造函数的定义。我为两个拼写错误道歉,这个代码是在Serval.CPP和.h文件中出现的代码的缩写版本。在清理代码时,它们应该被纠正,考虑丢失命名空间。实际上,它们会添加很多噪声和“可能”。不要助长问题。如果问题在名称空间消失时消失了,你就有了线索。如果它们没有消失,我们就可以看到更干净的代码。原始代码是按照你描述和编译的方式编写的,(我更正了上面的代码),问题发生在代码运行时。就像您发布的代码一样,我自己编写的一个简单版本工作得很好。我试图找出父级构造函数和子级构造函数之间是否发生了其他会影响正在使用的向量的事情。那么,bec,您的示例没有显示问题因为它工作并打印1和1(双倍向量不是特征矩阵向量,但向量本身的行为应该是一致的).我同意你的观点,但问题是我所经历的行为与简单代码不同,代码只是用简单的术语显示我正在尝试做的事情。我试图弄清楚为什么向量在父构造函数中看起来有效,但指向子构造函数中的垃圾数据,而子构造函数中的垃圾数据直接发生在后面。它似乎使用的是正确版本的父类,它确实来自另一个项目)。对父类所做的更改反映在我的代码的输出中。项目属性中的include目录也正确。是否有任何其他内容表明版本不匹配?如果您正在重建子项目t但不重建父项目,该项目将反映对子类中parent.hpp的更改,但仍会导致二进制兼容性问题。如果不仔细考虑,很难进行诊断。是否可以尝试添加cout我确实测试了父对象和子对象的地址,并且它们都使用相同的地址,因此必须但是奇怪的是,我使用的cout消息位于父构造函数的最后一行和子构造函数的第一行,我甚至从子构造函数中取出了所有内容,但是cout语句和问题仍然存在。我已经找到了问题的根源,这是内存跺脚,有一些错误在print out语句之前发生的ffer分配。我已尝试禁用分配,并且向量在子构造函数中的大小再次正确。我不确定为什么在父构造函数完成之前不会出现此错误。感谢您对此问题的帮助。请使用最新版本的E但是,igen删除init_Rcam_uu对象会由于堆栈损坏而导致崩溃。此外,在退出父类的构造函数(而不销毁init_Rcam_uu对象)后,没有可以看到的错误,是否有办法在visual studio中查看或检查它们?