类函数不解析嵌套-class 实例或函数

Cllass functions not resolving nested-class instances or functions

我正在为 Stack class 编写 成员函数 。我有一个链表(LL)嵌套-class作为Stackclass的成员。在 Stack 构造函数中,我实例化了一个调用 LL 构造函数的新链表。使用 LL 的成员函数,我生成了一个新节点并将其指向 1st 堆栈。这很好解决。

但是,当我编写 Stack 成员函数时,eclipse 不再解析在 Stack 构造函数中生成的 LL 实例,也不再解析我创建的 LL 成员函数我正在尝试打电话。

我试过在 privatepublic 成员名称之间切换嵌套的 class。我还尝试通过使封闭的 class 成为成员来将嵌套的 class (LL) 与其 enclosing/parent class (Stack) 连接起来嵌套的 class 就像之前的 question/response:

Nested Class member function can't access function of enclosing class. Why?

两者都没有效果

No problems here:
class Stack
{
private:
   int height, top_element;
   class LL
   {
      push_front(string* new_address)
      {
         // ... definition 
      }
      //...  more nested-class members
   };
public:
   Stack(); // constructor
   void push(string); // enclosing class member
};

Stack 构造函数也可以:

Stack::Stack(int size)
{
    height = size;
    top_element = 0;   

    string stack[height];    
    LL stack_map;
    stack_map.push_front(stack);
}

当我到达这里时遇到了我的问题:

void Stack::push(string data)
{
    if (top_element == height - 1)
    {
        string stack[height];           
        stack_map.push_front(stack); // <- PROBLEM
    }
}

希望我没有包含太多代码。第二块是证明构造函数实例化 LL 并调用 push_front() 没有问题,而下一个定义抱怨相同的函数并且无法识别实例化的 LL, stack_map

stack_mappush_front 都带有红色下划线

Symbol 'stack_map' could not be resolved

Method 'push_front' could not be resolved

你的问题主要有两个!

  1. 您在 Stack 的构造函数中有一个 LL class 的对象 class,在范围内是本地的,在成员中不可用 函数 push!

    你有

    LL stack_map;
    

    在class(即Stack::Stack(int size) {...})的构造函数范围内,不在classStack的成员函数void Stack::push(string data)内。

    因此,当您这样做时

       stack_map.push_front(stack);
    

    在成员函数中(即Stack::push),编译器不知道它,因此出错。

    如果您想访问 LL class 的相同对象(即 stack_map)在Stackclass的其他成员函数中,需要作为class.

  2. 的成员变量保存
  3. 其次,数组的可变长度不是标准的一部分 C++。意思是,stack

    的构造函数中的代码
    string stack[height];
    

    应该改变。更好的选择是 std::vector of std::string's.

意思,改成

#include <vector> // std::vector

class Stack
{
private:
   int height, top_element;
   class LL
   {
   public:
      void push_front(const std::vector<std::string>& new_address) { /* code here */ }
      //              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--->> vector of `std::string`
   };
   LL  stack_map; // >>>> `stack_map` member of `Stack`
public:
   Stack(int size)
      : height{ size }
      , top_element{ 0 }
   {
      std::vector<std::string> stack(height);
      stack_map.push_front(stack); //>>>> push_back to the member `stack_map`
   }

   void push(const std::string& str)
   {
      if (top_element == height - 1)
      {
         std::vector<std::string> stack(height);
         stack_map.push_front(stack); //>>>> push_back to the member `stack_map`
      }
   }
};

The second block is the demonstrate that the constructor instantiated the LL and called push_front() no problem while the very next definition complained about the same function and couldn't recognize the instantiated LL, stack_map.

您在构造函数中有一个名为 stack_map 的变量,但它只是一个函数局部变量。它不是 class 的成员。因此,它不存在于 push().

听起来您需要将其设为 class 的成员变量。

class Stack
{
  private:
    int height, top_element;
    class LL
    {
      push_front(string * new_address)
      {
        ... ; // definition 
      }
    };

    LL stack_map;

  public:
    Stack(); // constructor
    void push(string); // enclosing class member
};

完成后,确保从构造函数中删除函数局部变量。