Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++ - Fatal编程技术网

C++ 在基构造函数之前初始化成员。可能的

C++ 在基构造函数之前初始化成员。可能的,c++,C++,我有以下代码: class A{ public: A(int* i){ std::cout << "in A()" << i << std::endl; } }; class B: public A{ public: B(): i{new int{10}}, A{i}{ std::cout << "in B()" << std::endl; } private:

我有以下代码:

class A{
public:
    A(int* i){
        std::cout << "in A()" << i << std::endl;
    }
};

class B: public A{
public:
    B(): i{new int{10}}, A{i}{
        std::cout << "in B()" << std::endl; 
    }

private:
    int* i;
};

int main()
{
    B b;
}
A类{
公众:
A(整数*i){

std::cout
i
是类
B
的数据成员,因此为了创建,必须首先创建类
B
的对象。因此答案是否。

否,这是不可能的,因为基类初始化总是在派生类初始化之前

C++11,12.6.2 10在非委托构造函数中,初始化按以下顺序进行:

  • 首先,并且仅针对最派生类(1.8)的构造函数,虚拟基类按照它们在基类有向无环图的第一次从左到右遍历中出现的顺序进行初始化,其中“从左到右”是基类在派生类基类规范列表中的出现顺序

  • 然后,直接基类按照它们在基规范列表中出现的声明顺序进行初始化(无论mem初始值设定项的顺序如何)

  • 然后,按照类定义中声明的顺序初始化非静态数据成员(同样,与mem初始值设定项的顺序无关)

  • 最后,执行构造函数主体的复合语句

在基构造函数之前初始化成员。可能吗

不,这是不可能的。标准要求在初始化类的成员之前先初始化基类

B(): i{new int{10}}, A{i}{
    std::cout << "in B()" << std::endl; 
}
B():i{new int{10},A{i}{

std::难道你不清楚你想完成什么。但是,我想得太清楚了:A的构造函数和在其中执行的任何初始化都将在调用B的构造函数之前执行。强制初始化首先发生在B()中的唯一方法是在其中声明a没有的成员。即使如此,所有继承的成员都将首先在a()中初始化。你为什么不告诉我们你为什么要这样做,也许我们可以帮你。这就像在创建头骨之前请上帝为你的眼睛在头骨上创建眼窝一样。你不能在基类之前初始化成员,但你可以通过添加基类来容纳你想提前初始化的成员来近似它。基类是初始化的按顺序排列。
struct-Bi{int*i;};类B:private-Bi{,public-A{…};
问题已结束。因此,尝试在这里回答:我遇到了相同的问题,并通过不使用继承而将
A
作为成员放入
B
类A{/*base*/};
类B{int*i;A;…B():i{…},A来解决它{…}{};
(注意B成员的顺序-a在i之后)。当然,只有在A不是抽象的,继承不是强制性的情况下,这才有可能。在我的情况下,你也可以在B中添加一个转换运算符来转换为A。你的情况看起来是:A只持有一个引用,B应该从引用中分配和构造A。因此,它可能也适合你的情况。不过,有一种方法。你可以这样做:
 B():A{i=newint{10}{std::cout
B(): A{i}, i{new int{10}}{
    std::cout << "in B()" << std::endl; 
}