动态分配stdlib堆栈?

时间:2012-02-29 17:29:54

标签: c++ stack std dynamic-memory-allocation

我正在尝试在我创建的类中使用stdlib堆栈,但是我在动态创建它时遇到了问题。

以下是我的头文件“matcher.h”中的相关代码:

    private:

        stack<char> opens;

这里是我创建的只分配堆栈的构造函数:

#include "matcher.h"
using namespace std;
//Creates a matcher object with the default values.
matcher::matcher()
{
    opens = new stack<char>;
}

我得到的错误如下:

matcher.cpp:19:17: error: no match for ‘operator=’ in ‘((matcher*)this)->matcher::opens = ((*(const std::deque<char, std::allocator<char> >*)(& std::deque<char, std::allocator<char> >())), (operator new(40u), (<statement>, ((std::stack<char>*)<anonymous>))))’

这告诉我std::stack不包含赋值运算符,这引出了我的问题:

如果不包含赋值运算符,我应该使用什么方法来获取将在我的匹配器对象中保留的堆栈?

感谢您的时间。

5 个答案:

答案 0 :(得分:3)

opens是类中的一个对象,因此不需要使用new进行分配。

如果您希望它是默认构造的,那么这将自动发生 - 您不需要编写任何代码来执行此操作。如果所有类成员都可以默认构造,那么您根本不需要为该类编写默认构造函数。

如果您的成员不能(或不应该)默认构造,那么您可以在构造函数的初始化列表中执行此操作,例如:

class matcher {
public:
    matcher() :
        number(42) // initialise with a value
    {}             // nothing else to do - "opens" is automatically initialised

private:
    stack<char> opens;
    int number;
};

当你真的需要一个动态分配的对象时才使用new,并确保在你完成它之后它被删除 - 最好是使用RAII,因为它通常很难让它完全正确另一种方式。如果你希望它与另一个对象的生命周期联系起来,那么只需将它作为一个成员放在该类中,不要为动态分配而烦恼。

答案 1 :(得分:2)

new始终将指针返回到您指定的类型。 opens必须是stack<char> *

但是你确定需要动态分配堆栈吗?您可以在构造函数中创建的私有成员变量很少需要动态分配。如果你动态地分配它,你应该在析构函数中delete

答案 2 :(得分:1)

您正在分配new的结果,该结果将是指向堆栈的指针。换句话说,您正在尝试将堆栈*分配给堆栈。

其次,你为什么要这样做呢?无论如何,堆栈都会在堆上分配它的元素。不需要新的。

答案 3 :(得分:1)

您无法将stack<char>*返回的new stack<char>分配给stack<char>变量。相反,您应该使用以下构造函数:

// look ma, no need for new!
matcher::matcher()
{
}

并且只依赖于opens的默认初始化。当matcher对象为。

时,堆栈将被适当地销毁

答案 4 :(得分:0)

这里至少有两个问题。

private:
    stack<char> opens;

这意味着你的标题中有一个using namespace std;(非常糟糕的形式),或者你需要在包含标题之前有一个using namespace std;语句(更糟糕的形式)。

另一个问题是编译器错误的直接原因。你不应该分配那个opens堆栈。为了能够分配opens,需要将其声明为std::stack<char>* opens; - 这也是您通常不想做的事情。声明为std::stack<char> opens;,变量已经存在。它只需要构建。如果未在构造函数的初始化列表中指定如何构造对象,则默认情况下将使用默认构造函数。