1
4

4 回答 4

2

要初始化类的字段,请使用初始化列表语法:

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)不会创建三个ints 的数组(我认为您认为),但它会创建一个int初始化为3. 你的意思可能是new int[3].

但是:new int[3]需要delete[]释放 a ,但auto_ptr使用 plain delete,即它不打算管理数组。这是因为标准库提供的用于管理数组的解决方案是std::vector,您可能应该使用它来代替自制解决方案,因为std::vector与“普通”动态数组相比几乎没有开销。

于 2012-04-05T00:07:41.293 回答
1

您的麻烦不在于auto_ptr,而在于 C++ 中的构造函数。您需要在构造函数初始化列表中初始化类成员:

Toy() : line(new int(3)) { }

请注意,这会创建一个int带有 value的动态3

于 2012-04-05T00:04:37.573 回答
0

您没有调用构造函数。相反,您尝试调用一个不存在的函数调用运算符。这些将调用构造函数:

Toy() : line(new int(3)) {

或(不完全是你想要的)

Toy() {
    auto_ptr<int> line(new int(3));

或(如上,不是你想要的)

Toy() {
    auto_ptr<int>(new int(3));
于 2012-04-05T00:04:06.810 回答
0

那不是您构造成员变量的地方。您想使用初始化列表。

Toy() 
    : line(new int(3))
{ }

成员是在您的类构造函数代码运行之前构造的。您可以在构造函数代码中分配它们。它们是按照它们在类定义中出现的顺序构造的,而不是按照它们在这个列表中出现的顺序。如果这个列表有问题,大多数编译器都会警告你,只是因为这样可以避免混淆。你也可以用同样的方式构造父对象,使用父类的类型(因为它没有名字)

class Toy : public Thing {
   Toy() : Thing("APPLE") {}
};
于 2012-04-05T00:05:35.577 回答