【问题标题】:Stack accessible by all member functions of a class类的所有成员函数都可以访问的堆栈
【发布时间】:2012-01-14 11:10:24
【问题描述】:

我希望一个类的所有成员函数都可以访问同一个堆栈。每个成员函数都会将数据压入堆栈并从堆栈中弹出数据。

我很难声明堆栈。我有一个 cpp 文件和一个头文件,它不允许我在头文件中声明一个堆栈。有没有人可以举例说明如何做到这一点?

我需要使用堆栈作为 LIFO 数据结构更有意义,因为我只需要访问放置在堆栈上的最后一项。

我尝试在头文件中使用stack<int> items; 将其声明为受保护成员,但出现编译错误“堆栈未命名类型”。

亚当

【问题讨论】:

  • 这个堆栈对象是你班级的(私有)成员吗?
  • 任何有关您如何尝试执行此操作以及编译器抱怨的示例代码都会很有帮助。
  • @kol 不,它现在根本不是会员。我尝试将其声明为头文件中的受保护成员: stack items;但它不起作用,它给出了编译错误“堆栈不是类型”
  • 您是否在标题开头添加了#include <stack>

标签: c++ class stack member-functions


【解决方案1】:

好的,假设您使用的是 std::stack。

class MyClass
{
private:
    std::stack<int>& myStack_;
public:

    MyClass(std::stack<int>& stack) : myStack_(stack) { };
}; // eo MyClass

每次创建MyClass 的实例时,只需传递对堆栈的引用即可。这也避免了单例:

std::stack<int> globalStack;
MyClass class1(globalStack);
MyClass class2(globalStack);

【讨论】:

  • 想想在std::stack前面使用static,它告诉编译器在每个实例中使用same堆栈。
  • @EGOrecords,考虑一下将静态堆栈用作廉价全局变量的不当使用。
【解决方案2】:

一定要做一个

#include <stack>

另外做一个

using namespace std;

或者一个

std::stack<int> items;

在头文件中。

【讨论】:

  • 建议在头文件中使用using namespace std; 不是好建议!
  • 我会说这完全取决于。无论如何,它应该解决 OP 的问题。
【解决方案3】:

不要传递基本的数据结构。

你的堆栈代表了一些东西,可能是三明治店里的一堆Orders,或者是一堆Pancakes在光荣的5D中渲染。根据需要创建PancakesOrders 类型的对象,并将引用传递给需要了解它的对象。

// pancakes.h
#include <stack>    
class Pancake;

class Pancakes
{
public:
    void addPancake(const Pancake& pancake);
    Pancake& top() const;
    void pop();
private:
    std::stack<Pancake> m_pancakes;
};

// pancakes.cpp
#include "pancakes.h"
#include "pancake.h"

void Pancakes::addPancake(const Pancake& pancake)
{
    m_pancakes.push(pancake);
}

Pancake& Pancakes::top() const
{
    return m_pancakes.top();
}

void Pancakes::pop()
{
    m_pancakes.pop();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2021-06-21
    • 2016-03-08
    • 2013-07-15
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多