我需要一些指导。我正在尝试构建一个类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建议的成员初始化器列表的原因
答案 0 :(得分:2)
您不能在成员声明中使用N
;请使用初始化程序列表。
以下是解决B2
定义的方法:
class B2{
int N;
public:
A2 obj;
B2(int N_) : N(N_), obj(N_) {};
~B2(){};
};
在构建obj(N_)
时,N_
向obj
的构造函数提供B2
。
答案 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)通过默认的成员初始化程序,它只是一个大括号或 等于成员声明中包含的初始化程序,用于 如果成员初始化程序列表中省略了该成员
如果成员具有默认的成员初始值设定项,并且也出现在 构造函数中的成员初始化列表,默认成员 初始化程序将被忽略。
请注意,您可以使用大括号或等号(而不是括号)。这就是您的代码编译失败的原因。还请注意,成员初始化按声明顺序进行。