Классовые функции, не разрешающие экземпляры или функции вложенного класса - PullRequest
1 голос
/ 26 октября 2019

Я пишу функция-член s для класса Stack. У меня есть связанный список (LL) вложенного класса в качестве члена класса Stack. В конструкторе Stack я создаю новый связанный список, который вызывает конструктор LL. Используя функции-члены LL, я генерирую новый узел и указываю его на стек 1 st . Это разрешает нормально.

Однако, когда я кодирую функцию-член Stack, затмение больше не разрешает экземпляр LL, сгенерированный в конструкторе Stack, ни функцию-член LL, которую я пытаюсь выполнить. вызов.

Я попытался переключить вложенный класс между private и public обозначениями элементов. Я также попытался соединить вложенный класс (LL) с классом включения / родительским классом (Stack), сделав включающий класс членом вложенного класса, как в предыдущем вопросе / ответе:

Функция-член Nested Class не может получить доступ к функции включающего класса. Почему?

Ни один из них не имел эффекта

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_map и push_front подчеркнуты красным

Symbol 'stack_map' could not be resolved

и

Method 'push_front' could not be resolved

Ответы [ 2 ]

3 голосов
/ 26 октября 2019

У вас есть в основном две проблемы!

  1. У вас есть объект класса LL в конструкторе класса Stack, который является локальным для области и недоступен вфункция-член push!

    У вас есть

    LL stack_map;
    

    в области видимости конструктора класса (т.е. Stack::Stack(int size) {...}), а не в функциях-членах void Stack::push(string data) классаStack.

    Поэтому, когда вы делаете

       stack_map.push_front(stack);
    

    в функции-члене (т.е. Stack::push), она не известна компилятору и, следовательно, ошибка.

    Если вы хотите получить доступ к тому же объекту класса LL (т.е. stack_map) в других функциях-членах класса Stack, вам необходимо сохранить его как переменную-член класса.

  2. Во-вторых, переменной длины массивов не являются частью стандарта C ++ . Это означает, что код в конструкторе stack

    string stack[height];
    

    должен быть изменен. Лучшая альтернатива - std::vector из std::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`
      }
   }
};
1 голос
/ 26 октября 2019

Второй блок демонстрирует, что конструктор инстанцировал LL и вызвал push_front() без проблем, в то время как в следующем определении жаловались на ту же функцию и не могли распознать инстанцированные LL, stack_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
};

После того, как вы это сделаете, убедитесь, чтоудалить локальную переменную функции из конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...