【问题标题】:Cllass functions not resolving nested-class instances or functions类函数不解析嵌套类实例或函数
【发布时间】:2019-10-25 22:25:40
【问题描述】:

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

但是,当我编写 Stack 成员函数时,eclipse 不再解析在 Stack 构造函数中生成的 LL 实例,也无法解析我试图调用的 LL 成员函数。

我尝试在 privatepublic 成员名称之间切换嵌套类。我还尝试将嵌套类 (LL) 与它的封闭/父类 (Stack) 连接起来,方法是使封闭类成为嵌套类的成员,就像在上一个问题/响应中一样:

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()没有问题,而下一个定义抱怨相同的函数并且无法识别实例化的LLstack_map

stack_mappush_front 都带有红色下划线

Symbol 'stack_map' could not be resolved

Method 'push_front' could not be resolved

【问题讨论】:

  • string stack[height] 是无效的 C++(使用 VLA 扩展)。
  • LL stack_map; 是构造函数中的局部变量,它不是类成员。

标签: c++ class c++11 inner-classes member-functions


【解决方案1】:

你主要有两个问题!

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

    你有

    LL stack_map;
    

    在类的构造函数范围内(即Stack::Stack(int size) {...})而不是在类Stack的成员函数void Stack::push(string data)中。

    因此,当你这样做时

       stack_map.push_front(stack);
    

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

    如果你想访问 LL 类的同一个对象(即 stack_map) 在Stack 类的其他成员函数中,需要作为类的成员变量保存。

  2. 其次,variable length of arrays are not part of the standard 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`
      }
   }
};

【讨论】:

  • 谢谢。迟到的回复,但如果我将 Stack 成员 height 设置为常数,我不能用它作为数组大小吗?它是一个整数。要求堆栈的大小由用户确定,并且我还需要在用户填充数组时生成更多的堆栈(数组)。出于这个原因,我没有使用向量,否则您的建议将非常有意义。不管怎样,谢谢你
  • @MagicGAT 你可以使用string stack[height];,只有当height编译时常量。 const itself is not sufficient 为此。 “当用户填充数组时,我还需要生成更多的堆栈(数组)”:表示数组的大小是在运行时确定的。您绝对可以使用string stack = new string[height]; 进行额外的内务处理来管理您手动分配的内存。但是,当我们有 std::vector 时,我们是否更愿意在 C++ 中这样做?
【解决方案2】:

第二个块是演示构造函数实例化LL并调用push_front()没有问题,而下一个定义抱怨相同的函数并且无法识别实例化的LLstack_map

在 onstructor 中有一个名为 stack_map 的变量,但它只是一个函数局部变量。它不是类的成员。因此,它在push() 中不存在。

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

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
};

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

【讨论】:

  • 谢谢,R Sahu。我选择正确答案只是因为我必须选择一个并且它在最前面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 2011-01-02
  • 2021-09-10
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多