Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用子元素的成员初始化父元素?_C++_Inheritance_Initialization - Fatal编程技术网

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);