我对c ++对象感到困惑。如果一个对象必须用参数初始化(大多数对象都这样做),我应该创建一个带参数的构造函数,因此在存储时总是创建指向我的对象的指针,或者我应该有一个带有Init()方法的空构造函数初始化对象所需的参数,以便我可以为我的对象设置非指针字段?
编辑:我的意思是://A.h
class A
{
public:
A(int x);
}
//B.h
class B
{
private:
A myobject;
}
将抛出IntelliSense:类“A”
不存在默认构造函数所以我可以这样做:
//B.h
class B
{
private:
A* myobject;
}
OR
//A.h
class A
{
public:
A(void);
void Init(int x);
}
哪一项是正确的做法?
答案 0 :(得分:5)
初始化列表功能正好存在,因此您可以将参数传递给成员的构造函数。
class B {
A a;
public:
B();
};
B::B() : a(99) {}
答案 1 :(得分:3)
class A
{
public:
A(int x) {}
};
class B
{
public:
B(int x, double y) : a(x) {}
private:
A a;
};
int main()
{
B b(23, 78.6);
}
您可以使用初始化列表执行此操作。见http://en.cppreference.com/w/cpp/language/initializer_list
答案 2 :(得分:3)
你可以从B级调用构造函数,但是你必须为A的构造函数提供一个值。
一个例子可能是这样的:
class A{
public:
A( int x ){};
};
class B{
public:
B( void ) : _my(0){};
private:
A _my;
};
或者,您可以通过例如将B中的值传递给A
class A{
public:
A( int x ){};
};
class B{
public:
B( int x_b ) : _my(x_b){};
private:
A _my;
};
我不知道这是否能完全解决您的问题,但它会使您的类成为B的私有类,而无需创建指针以及随附的整个新/删除部分。
干杯
答案 3 :(得分:0)
您建议的两个选项中的任何一个都可以。您应该选择哪一个取决于您的用例。 一般来说,我更喜欢第一个选项,同时确保在B的析构函数中删除A.如果确保A在没有初始化的情况下使用它将正确报告错误,则应该只使用init()方法。