我遇到过这几次,最后我删除了最初的构造函数。我搜索过谷歌,但我甚至不知道这叫做什么......
class you {
private:
string name;
int number;
COLORREF color;
drinks favoriteDrink; // here
public:
you(string Name, int Number, COLORREF Color);
string GetName();
int GetNumber();
COLORREF GetColor();
};
Drinks是另一个类,它的构造函数如下:(int x,bool y)。我想进一步初始化它。再次,通常我只是删除构造函数并编写一个函数ex:init(w / e)。有没有办法做到这一点?
答案 0 :(得分:5)
定义构造函数时,它可以包含成员初始化列表。这是初始化成员和基类的正确方法。所以你要像这样实现you
的构造函数:
you::you(string Name, int Number, COLORREF Color) :
name(Name),
number(Number),
color(Color),
drink(whatever_arguments, you_want)
{
// body as usual
}
请注意,这是仅方式初始化类的数据成员。如果你这样做:
you::you(string Name, int Number, COLORREF Color)
{
name = Name;
number = Number;
color = Color;
}
然后你初始化成员,你为他们分配。空成员初始化列表将首先默认初始化它们。这意味着调用类的默认构造函数,并为原始类型保留未初始化的值。然后,构造函数体通过分配它们来覆盖它们。
使用成员初始化列表总是更好,因为您跳过了(无用的)默认初始化。有时,它也是唯一的方法,如果你有一个不可赋值的成员(例如const
成员,引用,或者只是一个没有可访问赋值运算符的对象)。
答案 1 :(得分:1)
根据您对使用new和delete的看法,以下内容可以实现您的要求。
Angew的方法是最好的方法,如果你足够早地知道x和y的值,如果你需要稍后构建favoriteDrink,你可以考虑以下内容:
class drinks; // Forward declare class rather than #including it
class you
{
private:
string name;
int number;
COLORREF color;
drinks* favoriteDrink; // Constructor will not be called
public:
you(string Name, int Number, COLORREF Color);
~you();
void someFunction(void);
string GetName();
int GetNumber();
COLORREF GetColor();
};
然后在实施中:
#include "drinks.h" // Include it now we need it's implementation
you::you(string Name, int Number, COLORREF Color) :
name(Name),
number(Number),
color(Color),
favoriteDrink(NULL) // Important to ensure this pointer is initialised to null
{
// body as usual
}
you::~you()
{
delete favoriteDrink; // Ok to delete even if it was never newed, because we initialised it to NULL
favoriteDrink = NULL; // Always set your pointer to null after delete
}
void you::someFunction(void)
{
favoriteDrink = new drinks(3, 6) // Then once you know your values for x and y
// Always check if the pointer is null before using
if (favoriteDrink)
{
// Use the pointer
}
}
编辑:正如Angew所指出的那样,有更好的方法来管理C ++ 11中的指针,如果您已经选择使用现代编译器,他的建议会带来更好的外观更安全的代码。