如何使用孩子的成员初始化父母?

时间:2015-07-26 22:08:13

标签: 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:
    Child(int c);
private:
    Camera childCamera;
}

//Child.cpp
Child::Child(int c) : Parent(this->childCamera.getImage()), childCamera(c) {}

在从中检索图像之前,需要初始化CameraParent存储来自相机的图像,const,孩子存储Camera。如何创建Child?我无法更改Parent,因为还有其他子类以其他方式初始化Parent。我可以更改Child,但Camera无法复制,Child确实需要存储Camera

编辑:我可以向Parent添加构造函数,如果这是最干净的解决方案。

3 个答案:

答案 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的东西。