Russian Qt Forum
Ноябрь 23, 2024, 08:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: c++, синтаксис [решено]  (Прочитано 8190 раз)
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; }
};
« Последнее редактирование: Март 08, 2009, 16:47 от ilyagoo » Записан
BRE
Гость
« Ответ #1 : Март 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() хотя бы в одном из классов возвращала ссылку или указатель на объект.
Записан
ilyagoo
Гость
« Ответ #2 : Март 08, 2009, 14:39 »


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


с указателем проблем бы не было, а вот со ссылкой будет та же проблема.
в любом случае задача поставлена именно таким образом Улыбающийся
Записан
BRE
Гость
« Ответ #3 : Март 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.   Шокированный
« Последнее редактирование: Март 08, 2009, 14:56 от BRE » Записан
BRE
Гость
« Ответ #4 : Март 08, 2009, 14:56 »

Проверил, странно, но у меня и так собирается.  Шокированный

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;
}
 

Что говорит стандарт по этому поводу.
Вроде раньше, чтобы декларировать функцию возвращающую объект класса, этот класс должен быть уже полностью определен.
« Последнее редактирование: Март 08, 2009, 16:49 от BRE » Записан
ilyagoo
Гость
« Ответ #5 : Март 08, 2009, 15:35 »


Проверил, странно, но у меня собирается.  Шокированный

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

спасибо, я уже решил точно так же. только вот хотелось бы знать, что это за фигня такая, неужели там идет включение заголовков дважды?
Записан
BRE
Гость
« Ответ #6 : Март 08, 2009, 15:45 »

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

Нашел это: http://c2.com/cgi/wiki?ForwardDeclaration
Про возвращение значения не знал.
« Последнее редактирование: Март 08, 2009, 16:17 от BRE » Записан
ilyagoo
Гость
« Ответ #7 : Март 08, 2009, 16:32 »

интересная статейка Улыбающийся
VS2005 пропустила, а вот gcc-4.2.4 нет Грустный
Записан
BRE
Гость
« Ответ #8 : Март 08, 2009, 16:39 »

интересная статейка Улыбающийся
VS2005 пропустила, а вот gcc-4.2.4 нет Грустный
gcc-4.3.2 - собирает.

Интересно, что в стандарте?
Пока, как не пользовался, так и не буду.  Смеющийся
Записан
ilyagoo
Гость
« Ответ #9 : Март 08, 2009, 16:46 »

на досуге посмотрю стандарт. сам я тоже таким не пользуюсь, меня и указатели вполне устраивают Смеющийся
приятель просил помочь Улыбающийся
Записан
Winstrol
Гость
« Ответ #10 : Март 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;
}
 
Записан
Winstrol
Гость
« Ответ #11 : Март 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;
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.394 секунд. Запросов: 21.