Cllass 函数不解析嵌套类实例或函数

Cllass functions not resolving nested-class instances or functions

本文关键字:函数 实例 嵌套 Cllass      更新时间:2023-10-16

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

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

我尝试在privatepublic成员指定之间切换嵌套类。我还尝试将嵌套类(LL)与其封闭/父类(Stack)连接起来,方法是使封闭类成为嵌套类的成员,如上一个问题/响应所示:

嵌套类成员函数无法访问封闭类的功能。为什么?

两者都没有效果

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

你主要有两个问题!

  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. 其次,数组的可变长度不是标准的一部分 C++。意思是,构造函数中的代码stack

    string stack[height];
    

    应该改变。更好的选择是std::vectorstd::string

含义,更改为

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

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

结构器中有一个名为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
};

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