Класс А используется в Б, а класс Б используется в А
От:
Аноним
Дата:
28.11.05 16:56
Оценка:
запамятовал как такое делается, есть 2 класса, каждый из них должен знать о существования другого, но один обязательно должен объявляться раньше... как эту ситуацию решить? просто давно не возникало подобной ситуации, я уже и не помню...
Re: Класс А используется в Б, а класс Б используется в А
Здравствуйте, Аноним, Вы писали:
А>запамятовал как такое делается, есть 2 класса, каждый из них должен знать о существования другого, но один обязательно должен объявляться раньше... как эту ситуацию решить? просто давно не возникало подобной ситуации, я уже и не помню...
Решается предварительным объявлением класса:
class a;
class b
{
b();
a* m_a;
};
class a
{
a();
b* m_b;
};
b::b() : m_a(new a())
{
}
a::a() : m_b(new b())
{
}
On Mon, 28 Nov 2005 18:56:46 +0200, wrote:
> запамятовал как такое делается, есть 2 класса, каждый из них должен знать о существования другого, но один обязательно должен объявляться раньше... как эту ситуацию решить? просто давно не возникало подобной ситуации, я уже и не помню...
Для етого существует forward declaration:
class B;
class A
{
// class body
// но можно использовать только ссилки и указатели.
B* pointer_b_;
B& reference_b_;
};
class B
{
// class body
}
Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re[2]: Класс А используется в Б, а класс Б используется в А
A>Для етого существует forward declaration: A> // но можно использовать только ссилки и указатели.
Не только, forward declaration типа T достаточно для объявления функций, принимающих и/или возвращающих T по значению.
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re[3]: Класс А используется в Б, а класс Б используется в А
Здравствуйте, Глеб Алексеев, Вы писали:
ГА>Здравствуйте, andrij, Вы писали:
A>>Для етого существует forward declaration: A>> // но можно использовать только ссилки и указатели. ГА>Не только, forward declaration типа T достаточно для объявления функций, принимающих и/или возвращающих T по значению.
это справедливо только для шаблонов
Re[2]: Класс А используется в Б, а класс Б используется в А
От:
Аноним
Дата:
28.11.05 18:07
Оценка:
Здравствуйте, andrij, Вы писали:
A>On Mon, 28 Nov 2005 18:56:46 +0200, wrote:
>> запамятовал как такое делается, есть 2 класса, каждый из них должен знать о существования другого, но один обязательно должен объявляться раньше... как эту ситуацию решить? просто давно не возникало подобной ситуации, я уже и не помню...
A>Для етого существует forward declaration:
A>
A>class B;
A>class A
A>{
A> // class body
A> // но можно использовать только ссилки и указатели.
A> B* pointer_b_;
A> B& reference_b_;
A>};
A>class B
A>{
A> // class body
A>}
A>
спасибо! я так и делал, только компилятор ругался, буду разбираться, видимо он на что-то другое ругается
On Mon, 28 Nov 2005 20:21:53 +0200, Глеб Алексеев"" <11829@users.rsdn.ru> wrote:
> Здравствуйте, Игoрь, Вы писали: > > И>это справедливо только для шаблонов > ? > И почему тогда следующая программа компилится и даже работает: >
> #include <iostream>
>
> struct Foo;
>
> void foo(Foo);
/*
но выше Вы не передаете структура как параметр в функцию, ви просто используэте
ее в предварительном оглашении для ф-ции - а ето, помоему, разные вещи...
*/
> ...
>
> > З.Ы. Найти подтверждение в стандарте не удается, наиболее близко подходит 7.1.1/8, но уверенности нет.
Вы же согласитесь, що следующий код просто не скомпилируетса:
#include <iostream>
struct Foo;
void foo(Foo f) {
std::cout << f.bar;
}
struct Foo {
int bar;
};
int main() {
Foo f = {3};
foo(f);
return 0;
}
поскольку на момент трасляции void foo(Foo f) внутренее строение Foo просто неизвесно компилятору
A>но выше Вы не передаете структура как параметр в функцию, ви просто используэте A>ее в предварительном оглашении для ф-ции — а ето, помоему, разные вещи... A>Вы же согласитесь, що следующий код просто не скомпилируетса: A>поскольку на момент трасляции void foo(Foo f) внутренее строение Foo просто неизвесно компилятору
Так я об этом и говорил. Для определения функции неполного типа недостаточно, для объявления — достаточно.
Здравствуйте, Глеб Алексеев, Вы писали:
ГА>Здравствуйте, Игoрь, Вы писали:
И>>это справедливо только для шаблонов ГА>? ГА>И почему тогда следующая программа компилится и даже работает: ГА>
ГА>З.Ы. Найти подтверждение в стандарте не удается, наиболее близко подходит 7.1.1/8, но уверенности нет.
У меня сейчас нету под рукой стандарта, но похоже произошла путаница. Ты говорил об объявлении функции,
я и подумал, что ты говоришь о definition, но похоже ты имел ввиду декларацию (declaration), тогда да,
при декларации можно использовать incomplete типы.
Здравствуйте, Игoрь, Вы писали:
ГА>>З.Ы. Найти подтверждение в стандарте не удается, наиболее близко подходит 7.1.1/8, но уверенности нет. И>У меня сейчас нету под рукой стандарта, но похоже произошла путаница. Ты говорил об объявлении функции, И>я и подумал, что ты говоришь о definition, но похоже ты имел ввиду декларацию (declaration), тогда да, И>при декларации можно использовать incomplete типы.
declaration = объявление
definition = определение
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
Здравствуйте, Alex Alexandrov, Вы писали:
AA>Здравствуйте, Игoрь, Вы писали:
ГА>>>З.Ы. Найти подтверждение в стандарте не удается, наиболее близко подходит 7.1.1/8, но уверенности нет. И>>У меня сейчас нету под рукой стандарта, но похоже произошла путаница. Ты говорил об объявлении функции, И>>я и подумал, что ты говоришь о definition, но похоже ты имел ввиду декларацию (declaration), тогда да, И>>при декларации можно использовать incomplete типы.
AA>declaration = объявление AA>definition = определение
Да, спасибо. Честно говоря не помню, когда что-то по С++ читал на русском, вот и напутал все.
Re[2]: Класс А используется в Б, а класс Б используется в А