C++ 如何使用子元素的成员初始化父元素?
我有一个需要初始化的类:C++ 如何使用子元素的成员初始化父元素?,c++,inheritance,initialization,C++,Inheritance,Initialization,我有一个需要初始化的类: //Parent.h class Parent { public: Parent(Image image); private: const Image parentImage; } //Parent.cpp Parent::Parent(Image image) : parentImage(image) {} //Child.h #import "Parent.h" class Child : public Parent { public:
//Parent.h
class Parent {
public:
Parent(Image image);
private:
const Image parentImage;
}
//Parent.cpp
Parent::Parent(Image image) : parentImage(image) {}
//Child.h
#import "Parent.h"
class Child : public Parent {
public:
Child(int c);
private:
Camera childCamera;
}
//Child.cpp
Child::Child(int c) : Parent(this->childCamera.getImage()), childCamera(c) {}
需要初始化摄像机
,然后才能从中检索图像。父级
存储来自相机的图像,即常量
,子级存储相机
。如何创建子项
?我无法更改Parent
,因为还有其他子类以其他方式初始化Parent
。我可以更改Child
,但是Camera
无法复制,而且Child
确实需要存储Camera
编辑:如果这是最干净的解决方案,我可以将构造函数添加到父级
根据标准(12.6.2/10),初始化顺序为:
-(……)
-然后,在声明中初始化直接基类
按它们在基本说明符列表中的显示顺序排列(不考虑
mem初始值设定项的顺序)
-然后,创建非静态数据成员
按照类定义中声明的顺序初始化
(同样,无论mem初始值设定者的顺序如何)
-最后,,
执行构造函数主体的复合语句
因此,在Child
constructor mem initialization列表中,对于Parent
初始值设定项,您不能使用任何依赖于Child
成员变量的变量,因为此时这些变量是统一的
但是,您可以使用子构造函数的参数,例如:
Child::Child(int c) : Parent(c.getImage()), childCamera(c) {}
当然,前提是相机对象的每个副本都会返回与原始对象相同的图像
另一种选择是使用辅助类的多重继承(使用上面标准引用的第二个破折号)。但这是一个棘手的问题,而且无论如何也需要相机对象的副本 考虑到您列出的所有设计约束,一个合理的解决方案是在孩子的外部构造一个摄像头,然后将其传递给孩子的构造函数。然后,孩子将拥有它 所以这个类可以写成:
class Child : public Parent {
public:
Child(Camera* camera);
private:
std::unique_ptr<Camera> childCamera;
}
//Child.cpp
Child::Child(Camera* camera)
: Parent(camera->getImage()), childCamera(camera)
{}
不,你不能。您不能使用任何依赖子对象作为父对象的对象。这是什么->childDataSource.getImage()?您的代码在
childCamera
和Parent
之间没有显示依赖关系。对不起,应该是this->childCamera.getImage()
。实际情况有更多的成员,等等,我在简化时犯了一个错误。如果子构造函数采用唯一的ptr
会更好。
Camera* camera = new Camera;
Child child(camera);