c++ - 动态分配 stdlib 堆栈?

标签 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 不包含赋值运算符,这引出了我的问题:

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

感谢您的宝贵时间。

最佳答案

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。 ,因为通常很难以任何其他方式正确处理。如果您希望它与另一个对象的生命周期相关联,那么只需将它作为成员放入该类中,而不必为动态分配而烦恼。

关于c++ - 动态分配 stdlib 堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9503820/

相关文章:

c++ - 我如何强制cmake在Linux中使用/usr/include中的C++头文件?

c++ - 初始化一个本身合法的引用成员?

c - 如何在Linux上的多线程下获取用户堆栈的底部

c++ - 解析字符串,其中 "separator"可以作为数据的一部分?

c++ - 在 C++ 中,Null 如何成为 "this"的可能值?

c++ - 重载运算符试图将另一个重载运算符作为参数

c - 尽管未对其进行任何更改,C 中的全局变量也会发生变化

c++ - 检查平衡分组字符时在线判断运行时错误

c++ - 为什么我的 C++ 到十六进制转换会导致不同的格式?

c++ - 获取插入 vector 中的对象的索引