Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / перекрестные ссылки в классах / 25 сообщений из 34, страница 1 из 2
12.11.2007, 22:08:15
    #34933780
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
как можно организовать такое:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
class ClassB;

class ClassA
{
private:
	ClassB		*m_pClassB;
public:
	ClassA()		
	{ 
		m_pClassB = new ClassB();
		std::cout << "\nClassA\n";
	}			
};

class ClassB
{
private:
	ClassA		*m_pClassA;
public:
	ClassB()		
	{ 
		m_pClassA = new ClassA();
		std::cout << "\nClassB\n";
	}			
};



int main()
{
	ClassA	a;

	return  0 ;
}

??
...
Рейтинг: 0 / 0
12.11.2007, 22:18:22
    #34933796
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Элементарно, Ватсон!
a.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
class ClassB;

class ClassA
{
private:
	ClassB		*m_pClassB;
public:
	ClassA();
	
};

class ClassB
{
private:
	ClassA		*m_pClassA;
public:
	ClassB()		
	{ 
		m_pClassA = new ClassA();
		std::cout << "\nClassB\n";
	}			
};

ClassA::ClassA()
{ 
  m_pClassB = new ClassB();
  std::cout << "\nClassA\n";
}	

//и далее по тексту, только там рекурсия бесконечная. Это ничего?
...
Рейтинг: 0 / 0
12.11.2007, 23:26:15
    #34933852
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Рекурсия это не очень хорошо, но пока главное чтобы собралось, а я что-то не соображу. Разнес в два разных *.h, все равно не получается.
...
Рейтинг: 0 / 0
12.11.2007, 23:33:41
    #34933858
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
// a.h
#pragma once
class B;
class A
{
    B *b;
    A();  
};

// a.cpp
#include "b.h"
A::A() : b(new B())
{
}

// b.h
#pragma once
#include "a.h"
class B {
    A *a;
    B() : a(new A()) {}
};
...
Рейтинг: 0 / 0
13.11.2007, 03:23:00
    #34933958
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Tubrik wrote:
> Автор: "Tubrik"
> Рекурсия это не очень хорошо, но пока главное чтобы собралось, а я
> что-то не соображу. Разнес в два разных *.h, все равно не получается.

Достаточно перенести реализацию конструктора ClassA() после
определения ClassB. Текст у blinded/b]. Только не забудь написать
inline в реализации ClassA::ClassA().
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
13.11.2007, 05:55:53
    #34933990
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
если я правильно понимаю, то include - это включение текста указанного файла непосредственно в месте include, тогда почему не получается след. сборка (конструкторы вынесены в *.cpp):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// file 'test.cpp'

#include "a.h"

int main()
{
	A	a;

	return  0 ;
}

в него включается файл 'a.h' :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#ifndef _a_h_
#define _a_h_

#include "b.h"

//class B;

class A
{
private:
	B		*m_pB;
public:
	A();		
};

#endif

а в "a.h" включается "b.h"
т.е. class A уже должен знать о class B ?? но он не знает! пока не убираю комментарий

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#ifndef _b_h_
#define _b_h_

#include "a.h"


class A;

class B
{
private:
	A		*m_pA;
public:
	B();
};

#endif
class B уже не может включить в себя 'a.h' благодаря #ifdef , ну это понятно..
...
Рейтинг: 0 / 0
13.11.2007, 08:08:48
    #34934056
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Tubrik wrote:
> если я правильно понимаю, то include - это включение текста указанного
> файла непосредственно в месте include, тогда почему не получается след.
> сборка (конструкторы вынесены в *.cpp):

В таком виде, все должно компилироваться и работать, до тех пор, пока
везде подключается a.h, если подключить b.h, работать не будет из-за
закомментированного предварительного объявления класса (class B;).

Если его раскомментировать, до все будет работать независимо от порядка
включения.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
13.11.2007, 08:24:01
    #34934073
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
зачем ему предварительное объявления класса Б, если там стоит #include "b.h", и первый раз оно должно включиться, а там ему будет полное объявление класса Б

Разве не так?
...
Рейтинг: 0 / 0
13.11.2007, 09:46:43
    #34934217
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
//a.h
class B;
class A {}

//a.cpp
#include "a.h"
#include "b.h"
B::...(){}

//b.h
class A;
class B {}

//b.cpp
#include "b.h"
#include "a.h"
A::...(){}

Т.е. разделяй реализацию с определением классов и пользуйся объявлениями требуемых для определений искомых.
...
Рейтинг: 0 / 0
13.11.2007, 09:47:18
    #34934220
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
TubrikРекурсия это не очень хорошо, но пока главное чтобы собралось, а я что-то не соображу. Разнес в два разных *.h, все равно не получается.

Рекурсия - совсем не хорошо.
...
Рейтинг: 0 / 0
13.11.2007, 09:50:03
    #34934227
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Tubrik class B уже не может включить в себя 'a.h' благодаря #ifdef , ну это понятно..

Не так. В тест включается a.h, в a.h включается b.h, но в b.h уже не может включиться a.h, и B не знает о A
...
Рейтинг: 0 / 0
13.11.2007, 09:52:20
    #34934237
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Tubrikзачем ему предварительное объявления класса Б, если там стоит #include "b.h", и первый раз оно должно включиться, а там ему будет полное объявление класса Б

Разве не так?

Если ты делаешь include b в a, то в b, проинклуденном в a не сработает include a, и b не будет знать о a . Ферштейн? ;)
...
Рейтинг: 0 / 0
13.11.2007, 10:08:44
    #34934290
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Akh Tubrikзачем ему предварительное объявления класса Б, если там стоит #include "b.h", и первый раз оно должно включиться, а там ему будет полное объявление класса Б

Разве не так?

Если ты делаешь include b в a, то в b, проинклуденном в a не сработает include a, и b не будет знать о a . Ферштейн? ;)

Чето не андерстенд, надо сделать перекур :)
но А знает о Б, зачем ему тогда предварительное объявление?
...
Рейтинг: 0 / 0
13.11.2007, 10:12:39
    #34934304
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Tubrik Akh Tubrikзачем ему предварительное объявления класса Б, если там стоит #include "b.h", и первый раз оно должно включиться, а там ему будет полное объявление класса Б

Разве не так?

Если ты делаешь include b в a, то в b, проинклуденном в a не сработает include a, и b не будет знать о a . Ферштейн? ;)

Чето не андерстенд, надо сделать перекур :)
но А знает о Б, зачем ему тогда предварительное объявление?

Чтобы не не делать этот инклуд. :) Делая инклуд, ты подсовываешь определение класса B, котоый не определиться, т.к. не знает об A. Т.е. подсовываешь не компилируемый код. Теперь как?

Как сделать нормально, причем классы будут равноправны я уже показал.
...
Рейтинг: 0 / 0
13.11.2007, 10:21:51
    #34934331
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Выходит если один класс не определился, то он "тянет" за собой другие классы. Тогда нафига им вообще инклуды, если они инклудят неопределившиеся классы, обошлись бы предварительными объявлениями :)

Р. Лафоре пишет, что #ifndef _classx_ #define _classx_ #endif защита от дурака. Что он хочет сказать, что в правильном проекте этого можно избежать?
...
Рейтинг: 0 / 0
13.11.2007, 10:24:37
    #34934350
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
На сарае тоже написано, а там сплошное разочарование. Написание сколько-нибудь значительного проекта без этого невозможно...
...
Рейтинг: 0 / 0
13.11.2007, 10:26:12
    #34934360
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
TubrikВыходит если один класс не определился, то он "тянет" за собой другие классы. Тогда нафига им вообще инклуды, если они инклудят неопределившиеся классы, обошлись бы предварительными объявлениями :)

Р. Лафоре пишет, что #ifndef _classx_ #define _classx_ #endif защита от дурака. Что он хочет сказать, что в правильном проекте этого можно избежать?

Это риторический вопрос: например, нафига for, если но по сетке файл не пересылает?

Вполне возможно, что можно избежать, но геморно. Если ты инклудишь два файла, каждый из которых инклудит какой-то третий, то без этой конструкции не обойтись. Может и можно построить схему в который подобное пройдет, но это будет совсем не гуд. Так что мистер "Р. Лафоре" (не знаю хто это такой) не прав.
...
Рейтинг: 0 / 0
13.11.2007, 19:32:08
    #34936605
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
теперь возникла проблема в классах-потомках, предварительного объявления при наследовании им кажется не достаточно, что тут можно придумать?
...
Рейтинг: 0 / 0
13.11.2007, 19:41:06
    #34936620
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Код в студию
...
Рейтинг: 0 / 0
13.11.2007, 20:01:56
    #34936641
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
ка бы тут я не напутал.. уже голова кругом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
// a.h

#ifndef _a_
#define _a_

#include "b.h"

class Z;

class A: public Z
{
public:
	A();
};
#endif
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// b.h
#ifndef _b_
#define _b_

#include "z.h"

class Z;

class B: public Z
{
public:
	B();
};
#endif
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#ifndef _z_
#define _z_

#include "a.h"

class A;

class Z
{
private:
	int i;
	A *a;
public:
	Z();
};
#endif
...
Рейтинг: 0 / 0
13.11.2007, 20:13:32
    #34936664
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Нет, так не пойдет,тобы отнаследоваться надо видеть определение класса, форфардом не отделаешься
...
Рейтинг: 0 / 0
13.11.2007, 20:20:49
    #34936671
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Но ничего невозможного нет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// a.h
#ifndef _a_
#define _a_

#include "z.h"

class A: public Z
{
public:
	A();
};
#endif
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// b.h
#ifndef _b_
#define _b_

#include "z.h"
class B: public Z
{
public:
	B();
};
#endif
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
//z.h
#ifndef _z_
#define _z_
class A;

class Z
{
private:
	int i;
	A *a;
public:
	Z();
};
#endif
...
Рейтинг: 0 / 0
13.11.2007, 20:34:54
    #34936680
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Что-то не получается собрать такой вариант..

И еще стало интересно, немного изменил код примера и стало непонятно, почему теперь класс Z не может собраться, если я включаю в его .h-нике #include "a.h", а зависимость от класса А закомментил:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
// a.h

#ifndef _a_
#define _a_

#include "b.h"

class Z;

class A: public Z
{
public:
	A();
};

#endif
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// b.h
#ifndef _b_
#define _b_

#include "z.h"

class Z;

class B: public Z
{
public:
	B();
};
#endif
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
// z.h

#ifndef _z_
#define _z_

#include "a.h"

//class A;

class Z
{
private:
	int z;
	//A *a;
public:
	Z();
};
#endif
...
Рейтинг: 0 / 0
13.11.2007, 20:41:54
    #34936689
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
убираю #include "a.h" и все пахает как надо.

Чувство у меня такое, что пора уже сворачивать "гениальную задумку" и делать все включение линейным.
...
Рейтинг: 0 / 0
13.11.2007, 20:43:58
    #34936691
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перекрестные ссылки в классах
Ну дословно у тебя там где инклудится a.h получается
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class Z
{
private:
	int z;
	//A *a;
public:
	Z();
};

class Z;
class B: public Z
{
public:
	B();
};
class Z;
class A: public Z
{
public:
	A();
};


...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / перекрестные ссылки в классах / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]