我有一个我需要初始化的课程:
//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) {}
在从中检索图像之前,需要初始化Camera
。 Parent
存储来自相机的图像,const
,孩子存储Camera
。如何创建Child
?我无法更改Parent
,因为还有其他子类以其他方式初始化Parent
。我可以更改Child
,但Camera
无法复制,Child
确实需要存储Camera
。
编辑:我可以向Parent
添加构造函数,如果这是最干净的解决方案。
答案 0 :(得分:0)
你不能这样做。
根据标准(12.6.2 / 10),初始化顺序为:
- (...)
- 然后,直接基类在声明中初始化 它们出现在base-specifier-list中的顺序(无论是什么 mem-initializers的顺序。)
- 然后,非静态数据成员 按照它们在类定义中声明的顺序初始化 (再次无论mem-initializers的顺序如何)。
- 最后, 执行构造函数体的复合语句。
因此,在Child
构造函数内存初始化列表中,对于Parent
初始值设定项,不能使用任何依赖Child
成员变量的内容,因为这些在那一刻是单一的。
然而,您可以使用Child构造函数的参数,例如:
Child::Child(int c) : Parent(c.getImage()), childCamera(c) {}
当然提供Camera对象的每个副本都将返回与原始对象相同的图像。
另一种选择可能是使用辅助类的多重继承(使用上面标准引用的第二个破折号)。但是我觉得这很狡猾,无论如何还需要复制相机对象。
答案 1 :(得分:0)
考虑到你列出的所有设计约束,一个合理的解决方案是在Child外部构建一个Camera,然后将它传递给Child的构造函数。然后孩子将拥有它。
所以这个课可以写成:
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)
{}
然后用作:
Camera* camera = new Camera;
Child child(camera);
答案 2 :(得分:0)
不,你不能。你不能使用任何依赖Child for Parent的东西。