Russian Qt Forum

Программирование => С/C++ => Тема начата: ilyagoo от Марта 08, 2009, 14:29



Название: c++, синтаксис [решено]
Отправлено: ilyagoo от Марта 08, 2009, 14:29
есть потребность описать два класса следующим образом:
класс A имеет функцию-член, которая возвращает объект класса B.
класс B имеет функцию-член, которая возвращает объект класса A.
хочется получить нечто подобное, но, само собой, класс A не знает структуру класса B. как это обойти?
Код:
class A
{
public:
   A() {};
   B f() { B b; return b; }
};

class B
{
public:
   B() {};
   A f() { A a; return a; }
};


Название: Re: c++, синтаксис
Отправлено: BRE от Марта 08, 2009, 14:35
есть потребность описать два класса следующим образом:
класс A имеет функцию-член, которая возвращает объект класса B.
класс B имеет функцию-член, которая возвращает объект класса A.
хочется получить нечто подобное, но, само собой, класс A не знает структуру класса B. как это обойти?
Код:
class A
{
public:
   A() {};
   B f() { B b; return b; }
};

class B
{
public:
   B() {};
   A f() { A a; return a; }
};
Сделать так, чтобы функция f() хотя бы в одном из классов возвращала ссылку или указатель на объект.


Название: Re: c++, синтаксис
Отправлено: ilyagoo от Марта 08, 2009, 14:39

Сделать так, чтобы функция f() хотя бы в одном из классов возвращала ссылку или указатель на объект.


с указателем проблем бы не было, а вот со ссылкой будет та же проблема.
в любом случае задача поставлена именно таким образом :)


Название: Re: c++, синтаксис
Отправлено: BRE от Марта 08, 2009, 14:43
а вот со ссылкой будет та же проблема.

Код
C++ (Qt)
#ifndef __A_H
#define __A_H
 
class B;
 
class A
{
public:
       A();
       B       &f();
};
 
#endif
 

Код
C++ (Qt)
#ifndef __B_H
#define __B_H
 
#include "a.h"
 
class B
{
public:
       B();
       A       f();
};
 
#endif
 

в любом случае задача поставлена именно таким образом :)
Тогда никак. fixed.   :o


Название: Re: c++, синтаксис
Отправлено: BRE от Марта 08, 2009, 14:56
Проверил, странно, но у меня и так собирается.  :o

a.h
Код
C++ (Qt)
#ifndef __A_H
#define __A_H
 
class B;
 
class A
{
public:
A();
B f();
};
 
#endif
 

a.cpp
Код
C++ (Qt)
#include "a.h"
#include "b.h"
 
A::A()
{
}
 
B A::f()
{
B b;
return b;
}
 

b.h
Код
C++ (Qt)
#ifndef __B_H
#define __B_H
 
class A;
 
class B
{
public:
B();
A f();
};
 
#endif
 

b.cpp
Код
C++ (Qt)
#include "b.h"
#include "a.h"
 
B::B()
{
}
 
A B::f()
{
A a;
return a;
}
 

Что говорит стандарт по этому поводу.
Вроде раньше, чтобы декларировать функцию возвращающую объект класса, этот класс должен быть уже полностью определен.


Название: Re: c++, синтаксис
Отправлено: ilyagoo от Марта 08, 2009, 15:35

Проверил, странно, но у меня собирается.  :o

Что говорит стандарт по этому поводу.
Вроде раньше, чтобы декларировать функцию возвращающую объект класса, этот класс должен быть уже полностью декларирован.

спасибо, я уже решил точно так же. только вот хотелось бы знать, что это за фигня такая, неужели там идет включение заголовков дважды?


Название: Re: c++, синтаксис
Отправлено: BRE от Марта 08, 2009, 15:45
спасибо, я уже решил точно так же. только вот хотелось бы знать, что это за фигня такая, неужели там идет включение заголовков дважды?
Меня больше удивляет, почему здесь forward declaration достаточно?
Кстати, у тебя какой компилятор?

Нашел это: http://c2.com/cgi/wiki?ForwardDeclaration (http://c2.com/cgi/wiki?ForwardDeclaration)
Про возвращение значения не знал.


Название: Re: c++, синтаксис
Отправлено: ilyagoo от Марта 08, 2009, 16:32
интересная статейка :)
VS2005 пропустила, а вот gcc-4.2.4 нет :(


Название: Re: c++, синтаксис
Отправлено: BRE от Марта 08, 2009, 16:39
интересная статейка :)
VS2005 пропустила, а вот gcc-4.2.4 нет :(
gcc-4.3.2 - собирает.

Интересно, что в стандарте?
Пока, как не пользовался, так и не буду.  ;D


Название: Re: c++, синтаксис
Отправлено: ilyagoo от Марта 08, 2009, 16:46
на досуге посмотрю стандарт. сам я тоже таким не пользуюсь, меня и указатели вполне устраивают ;D
приятель просил помочь :)


Название: Re: c++, синтаксис
Отправлено: Winstrol от Марта 08, 2009, 17:55
Можно без ссылки, но придется несколько извращнуться.
Код
C++ (Qt)
template <class T>
class A_
{
public:
  A_() {};
  T f() { T b; return b; }
};
 
class B;
typedef A_<B> A;
 
class B
{
public:
  B() {};
  A f() { A a; return a; }
};
 
int main()
{
  A a;
  B b;
  return 0;
}
 


Название: Re: c++, синтаксис [решено]
Отправлено: Winstrol от Марта 08, 2009, 18:07
И самый главный прикол
Так можно
Код
C++ (Qt)
#include <stdio.h>
 
class X
{
public:
   class B;
   class A
   {
   public:
     A() {};
     B f() { B b; return b; }
   };
 
   class B
   {
   public:
      B() {};
      A f() { A a; return a; }
   };
};
int main()
{
  return 0;
}
 
а так нет :)
Код
C++ (Qt)
#include <stdio.h>
 
   class B;
   class A
   {
   public:
     A() {};
     B f() { B b; return b; }
   };
 
   class B
   {
   public:
      B() {};
      A f() { A a; return a; }
   };
 
int main()
{
  return 0;
}