Класс А используется в Б, а класс Б используется в А
От: Аноним  
Дата: 28.11.05 16:56
Оценка:
запамятовал как такое делается, есть 2 класса, каждый из них должен знать о существования другого, но один обязательно должен объявляться раньше... как эту ситуацию решить? просто давно не возникало подобной ситуации, я уже и не помню...
Re: Класс А используется в Б, а класс Б используется в А
От: _nn_ www.nemerleweb.com
Дата: 28.11.05 17:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>запамятовал как такое делается, есть 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())
{
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Класс А используется в Б, а класс Б используется в А
От: andrij Украина  
Дата: 28.11.05 17:01
Оценка:
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]: Класс А используется в Б, а класс Б используется в А
От: Глеб Алексеев  
Дата: 28.11.05 17:14
Оценка:
Здравствуйте, andrij, Вы писали:


A>Для етого существует forward declaration:

A> // но можно использовать только ссилки и указатели.
Не только, forward declaration типа T достаточно для объявления функций, принимающих и/или возвращающих T по значению.
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re[3]: Класс А используется в Б, а класс Б используется в А
От: Игoрь Украина  
Дата: 28.11.05 17:40
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, 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>


спасибо! я так и делал, только компилятор ругался, буду разбираться, видимо он на что-то другое ругается
Re[4]: а обосновать?
От: Глеб Алексеев  
Дата: 28.11.05 18:21
Оценка:
Здравствуйте, Игoрь, Вы писали:

И>это справедливо только для шаблонов

?
И почему тогда следующая программа компилится и даже работает:
#include <iostream>

struct Foo;

void foo(Foo);

struct Foo {
    int bar;
};

void foo(Foo f) {
    std::cout << f.bar;
}


int main() {
    Foo f = {3};
    foo(f);
    return 0;
}


З.Ы. Найти подтверждение в стандарте не удается, наиболее близко подходит 7.1.1/8, но уверенности нет.
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re[5]: а обосновать?
От: andrij Украина  
Дата: 28.11.05 18:54
Оценка:
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 просто неизвесно компилятору
Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re[6]: а обосновать?
От: Глеб Алексеев  
Дата: 28.11.05 19:01
Оценка:
Здравствуйте, andrij, Вы писали:


A>но выше Вы не передаете структура как параметр в функцию, ви просто используэте

A>ее в предварительном оглашении для ф-ции — а ето, помоему, разные вещи...
A>Вы же согласитесь, що следующий код просто не скомпилируетса:
A>поскольку на момент трасляции void foo(Foo f) внутренее строение Foo просто неизвесно компилятору
Так я об этом и говорил. Для определения функции неполного типа недостаточно, для объявления — достаточно.
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re[5]: а обосновать?
От: Игoрь Украина  
Дата: 28.11.05 19:28
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, Игoрь, Вы писали:


И>>это справедливо только для шаблонов

ГА>?
ГА>И почему тогда следующая программа компилится и даже работает:
ГА>
ГА>#include <iostream>

ГА>struct Foo;

ГА>void foo(Foo);

ГА>struct Foo {
ГА>    int bar;
ГА>};

ГА>void foo(Foo f) {
ГА>    std::cout << f.bar;
ГА>}


ГА>int main() {
ГА>    Foo f = {3};
ГА>    foo(f);
ГА>    return 0;
ГА>}
ГА>


ГА>З.Ы. Найти подтверждение в стандарте не удается, наиболее близко подходит 7.1.1/8, но уверенности нет.

У меня сейчас нету под рукой стандарта, но похоже произошла путаница. Ты говорил об объявлении функции,
я и подумал, что ты говоришь о definition, но похоже ты имел ввиду декларацию (declaration), тогда да,
при декларации можно использовать incomplete типы.
Re[6]: а обосновать?
От: Alex Alexandrov США  
Дата: 29.11.05 20:21
Оценка:
Здравствуйте, Иг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)
Re[7]: а обосновать?
От: Игoрь Украина  
Дата: 29.11.05 22:42
Оценка:
Здравствуйте, Alex Alexandrov, Вы писали:

AA>Здравствуйте, Игoрь, Вы писали:


ГА>>>З.Ы. Найти подтверждение в стандарте не удается, наиболее близко подходит 7.1.1/8, но уверенности нет.

И>>У меня сейчас нету под рукой стандарта, но похоже произошла путаница. Ты говорил об объявлении функции,
И>>я и подумал, что ты говоришь о definition, но похоже ты имел ввиду декларацию (declaration), тогда да,
И>>при декларации можно использовать incomplete типы.

AA>declaration = объявление

AA>definition = определение
Да, спасибо. Честно говоря не помню, когда что-то по С++ читал на русском, вот и напутал все.
Re[2]: Класс А используется в Б, а класс Б используется в А
От: silamantex Южная Корея  
Дата: 02.12.05 04:32
Оценка:
Здравствуйте, _nn_, Вы писали:

Только этот пример не стоит понимать буквально,
так как результат чреват Memory overflow
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.