使用堆上的成员在 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
的构造函数。
如果您使用的是 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.
请注意,您可以使用大括号或等号(不是圆括号)。这就是您的代码编译失败的原因。另请注意,成员初始化按声明顺序进行。
我需要一些指导。我正在尝试构建一个 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
的构造函数。
如果您使用的是 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.
请注意,您可以使用大括号或等号(不是圆括号)。这就是您的代码编译失败的原因。另请注意,成员初始化按声明顺序进行。