Есть ли способ создать экземпляр класса, который находится в другом классе? Например:
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(). Что я могу сделать?
Вы можете использовать оператор разрешения области видимости: 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.
}
};
class bar {public: bar() {...} inline void action(foo *a);};
потом: void bar::action(foo *a) {...}
Теперь я просто хочу создать экземпляр бара в моей main()...
Вот как вы это сделаете:
int main()
{
foo::bar tinder;
}
bar
объявляется в области foo
. Непонятно, почему это так, поэтому, если у вас нет веских оснований для этого, не используйте вложенный класс. Также обратите внимание, что вы пытались объявить указатели на foo
и foo::bar
, а не на экземпляры.
класс класса объявляется в классе класса foo. Поэтому вам нужно написать
foo::bar* tinder;
Также вы забыли разместить точки с запятой после определений класса bar и foo. :)
Вложенные классы объявляются внутри класса другого класса. Поэтому, чтобы использовать их из основного, вам нужно сообщить компилятору, где найти этот класс.
Вот синтаксис:
foo::bar *tinder;
foo
является родительской областью и bar
вложенный класс.
Надеюсь, что это помогло
То, что вы хотите, это так называемый "вложенный класс".
Вы можете найти все, что вы хотите знать об этом здесь: зачем использовать вложенные классы в C++?
например:
class List
{
public:
List(): head(NULL), tail(NULL) {}
private:
class Node
{
public:
int data;
Node* next;
Node* prev;
};
private:
Node* head;
Node* tail;
};