使用堆中的成员初始化类内部的类

时间:2018-06-21 16:53:05

标签: c++ class pointers dynamic-arrays

我需要一些指导。我正在尝试构建一个类B2,该类中的成员中有一个来自类A2的对象。另一方面,类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时,我在error: ‘N’ is not a type的初始化中得到了A2 obj(N),这就是为什么我认为使用此post建议的成员初始化器列表的原因

3 个答案:

答案 0 :(得分:2)

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

以下是解决B2定义的方法:

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

在构建obj(N_)时,N_obj的构造函数提供B2

Demo.

答案 1 :(得分:1)

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

应该是

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

答案 2 :(得分:1)

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

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

cppreference.com的相关部分是

  

2)通过默认的成员初始化程序,它只是一个大括号或   等于成员声明中包含的初始化程序,用于   如果成员初始化程序列表中省略了该成员

     

如果成员具有默认的成员初始值设定项,并且也出现在   构造函数中的成员初始化列表,默认成员   初始化程序将被忽略。

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