Есть ли способ создать экземпляр класса, который находится в другом классе?

0

Есть ли способ создать экземпляр класса, который находится в другом классе? Например:

class foo
{
public:
    foo()
    {
        //Constructor stuff here.
    }

    class bar
    {
       bar()
       {
           //Constructor stuff here.
       }
       void action(foo* a)
       {
           //Code that does stuff with a.
       }
    }

    void action(bar* b)
    {
        //Code that does stuff with b.
    }
}

Теперь я просто хочу создать экземпляр бара в моей главной(), например:

foo* fire;
bar* tinder;

Но бар не объявляется в этой области. Причина, по которой я использую класс внутри класса, заключается в том, что они оба используют методы, которые принимают другой класс в качестве параметра, но мне нужен экземпляр каждого класса в моей main(). Что я могу сделать?

  • 0
    Пропустил точку с запятой после определения класса.
Теги:

5 ответов

2
Лучший ответ

Вы можете использовать оператор разрешения области видимости: foo::bar* tinder; , Это даст вам указатель на bar, а не на объект- bar. Если вы этого хотите, вы должны сделать foo::bar tinder.

Однако у вас нет веских оснований для использования вложенного класса. Вы должны просто поставить один перед другим, а затем использовать форвардную декларацию. Что-то вроде:

class foo; // Forward declares the class foo

class bar
{
   bar()
   {
       //Constructor stuff here.
   }
   void action(foo* a)
   {
       //Code that does stuff with a.
   }
};

class foo
{
public:
    foo()
    {
        //Constructor stuff here.
    }

    void action(bar* b)
    {
        //Code that does stuff with b.
    }
};
  • 0
    Потрясающие. ты только что научил меня чему-то новому и полезному.
  • 1
    Обратите внимание, что вы не можете делать что-то с определением foo. Вместо этого определите этот член после foo. class bar {public: bar() {...} inline void action(foo *a);}; потом: void bar::action(foo *a) {...}
Показать ещё 1 комментарий
2

Теперь я просто хочу создать экземпляр бара в моей main()...

Вот как вы это сделаете:

int main()
{
  foo::bar tinder;
}

bar объявляется в области foo. Непонятно, почему это так, поэтому, если у вас нет веских оснований для этого, не используйте вложенный класс. Также обратите внимание, что вы пытались объявить указатели на foo и foo::bar, а не на экземпляры.

1

класс класса объявляется в классе класса foo. Поэтому вам нужно написать

foo::bar* tinder;

Также вы забыли разместить точки с запятой после определений класса bar и foo. :)

1

Вложенные классы объявляются внутри класса другого класса. Поэтому, чтобы использовать их из основного, вам нужно сообщить компилятору, где найти этот класс.

Вот синтаксис:

foo::bar *tinder;

foo является родительской областью и bar вложенный класс.

Надеюсь, что это помогло

0

То, что вы хотите, это так называемый "вложенный класс".

Вы можете найти все, что вы хотите знать об этом здесь: зачем использовать вложенные классы в C++?

например:

class List
{
    public:
        List(): head(NULL), tail(NULL) {}
    private:
        class Node
        {
          public:
              int   data;
              Node* next;
              Node* prev;
        };
    private:
        Node*     head;
        Node*     tail;
};
  • 0
    Я уже использовал вложенный класс, и это было частью моей проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню