我正在尝试在我创建的类中使用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
不包含赋值运算符,这引出了我的问题:
如果不包含赋值运算符,我应该使用什么方法来获取将在我的匹配器对象中保留的堆栈?
感谢您的时间。
答案 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;
,变量已经存在。它只需要构建。如果未在构造函数的初始化列表中指定如何构造对象,则默认情况下将使用默认构造函数。