C++ 动态分配stdlib堆栈?

C++ 动态分配stdlib堆栈?,c++,stack,std,dynamic-memory-allocation,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() { open

我试图在我创建的类中使用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不包含赋值运算符,这就引出了我的问题:

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

谢谢您的时间。

new始终返回指向您指定类型的指针。打开的文件必须是堆栈*

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

new始终返回指向您指定类型的指针。打开的文件必须是堆栈*


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

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


第二,你为什么要这样做?堆栈将在堆上分配它的元素。不需要new。

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

第二,你为什么要这样做?堆栈将在堆上分配它的元素。不需要新建。

不能将堆栈*(新堆栈返回的内容)分配给堆栈变量。相反,您应该使用以下构造函数:

// look ma, no need for new!
matcher::matcher()
{
}
只需依赖opens的默认初始化即可。当匹配器对象被激活时,堆栈将被适当地销毁。

不能将堆栈*(新堆栈返回的内容)分配给堆栈变量。相反,您应该使用以下构造函数:

// look ma, no need for new!
matcher::matcher()
{
}
只需依赖opens的默认初始化即可。当matcher对象是类中的对象时,堆栈将被适当地销毁。

opens是类中的对象,因此不需要分配新的

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

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

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,并确保在完成后将其删除—最好使用,因为通常很难以其他方式将其正确分配。如果您想将它绑定到另一个对象的生存期,那么只需将它作为成员放在该类中,而不必进行动态分配。

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,并确保在完成后将其删除—最好使用,因为通常很难以其他方式将其正确分配。如果您想将它绑定到另一个对象的生存期,那么只需将它作为成员放在该类中,而不必考虑动态分配。

这里至少有两个问题

private:
    stack<char> opens;
这意味着您可以使用名称空间std;在你的头极坏的形式,或你是要求一个使用名称空间std;语句之前包含更糟糕的标题形式


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

这里至少有两个问题

private:
    stack<char> opens;
这意味着您可以使用名称空间std;在你的头球非常糟糕的形式或 您需要一个使用名称空间std;语句之前包含更糟糕的标题形式


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

当你从Java或C转换时,你需要一个C++课程。当你从java或C++ java转换时,你需要一个C++课程。是的,谢谢。出于某种原因,我认为您在创建类时需要分配它。是的,谢谢。出于某种原因,我认为在创建类时需要分配它。