在具有堆上成员的类内初始化类
Initialize class inside class with members on the heap
我需要一些指导。我正在尝试构建一个类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
时,我在初始化A2 obj(N)
时得到了error: ‘N’ is not a type
,这就是为什么我想使用这篇文章所建议的成员初始值设定项列表。
不能在成员声明中使用N
;请改用初始值设定项列表。
以下是修复B2
定义的方法:
class B2{
int N;
public:
A2 obj;
B2(int N_) : N(N_), obj(N_) {};
~B2(){};
};
上面,obj(N_)
在构造B2
时向obj
的构造函数提供N_
。
演示。
A2 obj(N);
B2(int N_) : N(N_) {};
应该是
A2 obj;
B2(int N_) : obj(N_) {};
如果您使用的是 c++11,则可以使用 {} 初始值设定项来初始化成员(以防构造函数成员初始值设定项列表中未提供(。
class B2{
int N;
public:
A2 obj{N}; // <<<=== change () to {}
B2(int N_) : N(N_) {};
~B2(){};
};
cppreference.com 的相关部分是
2( 通过默认成员初始值设定项,它只是一个大括号或 等于成员声明中包含的初始值设定项,该初始值设定项使用 如果在成员初始值设定项列表中省略了该成员
如果成员具有默认成员初始值设定项,并且还显示在 构造函数中的成员初始化列表,默认成员 初始值设定项将被忽略。
请注意,您可以使用大括号或等号(不是括号(。这就是您的代码在编译中失败的原因。另请注意,成员初始化按声明顺序进行。
相关文章:
- 为什么在C++中首先初始化成员类
- 是否可以防止省略聚合初始化成员?
- 正在复制具有未初始化成员的结构
- 使用大括号或括号初始化成员变量
- C++结构:强制初始化成员?
- C++中未初始化成员布尔变量的默认值是多少?
- 使用默认值初始化成员引用
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- C++使用 { } 初始化成员变量
- 如何根据构造函数参数使用超类类型初始化成员变量?
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 有没有办法在Brace中初始化成员
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 通常应用方法,使用带有构造函数委托的 SFINAE 通过类模板的构造函数初始化成员
- 如何在嵌套类中初始化成员?C
- 是否可以在构造函数主体中初始化成员变量,而不是初始值设定项列表
- 编译器错误,因为构造函数必须显式初始化成员
- 如何使用成员函数初始化成员函数指针
- C 如何使用隐藏的默认构造函数初始化成员