使用堆上的成员在 class 中初始化 class

Initialize class inside class with members on the heap

我需要一些指导。我正在尝试构建一个 class B2,它的成员中有一个来自 class A2 的对象。 Class A2 另一方面,通过成员指针 '*y' 以动态方式分配一些内存。这是我现在无法编译的代码。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

class A2{
int N;
public:
    double *y;
    A2(int N_);
    ~A2(){free(y);};
};

A2::A2(int N_){
    N = N_;
    y = (double*)calloc(N,sizeof(double));
}

class B2{
    int N;
    public:
        A2 obj(N);
        B2(int N_) : N(N_) {};
        ~B2(){};
};

int main(){
     int N = 10;
     B2 model(N);
     for(int i=0;i<N;i++) model.obj.y[i] = i;
     for(i=0;i<N;i++) printf("\ny[%d]=%d",i,model.obj.y[i]);
     return 1;
}

当我尝试初始化 model 时,我在 A2 obj(N) 的初始化中得到了 error: ‘N’ is not a type 这就是为什么我想使用这个 [=19 建议的成员初始化列表=].

A2 obj(N);
B2(int N_) : N(N_) {};

应该是

A2 obj;
B2(int N_) : obj(N_) {};

不能在成员声明中使用N;请改用 初始化程序列表

以下是修正您的 B2 定义的方法:

class B2{
    int N;
    public:
        A2 obj;
        B2(int N_) : N(N_), obj(N_) {};
        ~B2(){};
};

上面,obj(N_) 在构造 B2 时将 N_ 提供给 obj 的构造函数。

Demo.

如果您使用的是 c++11,您可以使用 {} 初始化器来初始化成员(以防构造函数成员初始化器列表中未提供它)。

class B2{
    int N;
    public:
        A2 obj{N};  // <<<=== change () to {}
        B2(int N_) : N(N_) {};
        ~B2(){};
};

cppreference.com 的相关部分是

2) Through a default member initializer, which is simply a brace or equals initializer included in the member declaration, which is used if the member is omitted in the member initializer list

If a member has a default member initializer and also appears in the member initialization list in a constructor, the default member initializer is ignored.

请注意,您可以使用大括号或等号(不是圆括号)。这就是您的代码编译失败的原因。另请注意,成员初始化按声明顺序进行。