4 回答
要初始化类的字段,请使用初始化列表语法:
class Toy {
public:
std::auto_ptr<int> line;
Toy() : line(new int(3))
{
}
};
否则,您可能会获得默认初始化line
并使用其reset
方法重新安装它:
class Toy {
public:
std::auto_ptr<int> line;
Toy()
{
line.reset(new int(3));
}
};
但是这段代码还有更多问题;首先,new int(3)
不会创建三个int
s 的数组(我认为您认为),但它会创建一个int
初始化为3
. 你的意思可能是new int[3]
.
但是:new int[3]
需要delete[]
释放 a ,但auto_ptr
使用 plain delete
,即它不打算管理数组。这是因为标准库提供的用于管理数组的解决方案是std::vector
,您可能应该使用它来代替自制解决方案,因为std::vector
与“普通”动态数组相比几乎没有开销。
您的麻烦不在于auto_ptr
,而在于 C++ 中的构造函数。您需要在构造函数初始化列表中初始化类成员:
Toy() : line(new int(3)) { }
请注意,这会创建一个int
带有 value的动态3
。
您没有调用构造函数。相反,您尝试调用一个不存在的函数调用运算符。这些将调用构造函数:
Toy() : line(new int(3)) {
或(不完全是你想要的)
Toy() {
auto_ptr<int> line(new int(3));
或(如上,不是你想要的)
Toy() {
auto_ptr<int>(new int(3));
那不是您构造成员变量的地方。您想使用初始化列表。
Toy()
: line(new int(3))
{ }
成员是在您的类构造函数代码运行之前构造的。您可以在构造函数代码中分配它们。它们是按照它们在类定义中出现的顺序构造的,而不是按照它们在这个列表中出现的顺序。如果这个列表有问题,大多数编译器都会警告你,只是因为这样可以避免混淆。你也可以用同样的方式构造父对象,使用父类的类型(因为它没有名字)
class Toy : public Thing {
Toy() : Thing("APPLE") {}
};