powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / перекрестные ссылки в классах
25 сообщений из 34, страница 1 из 2
перекрестные ссылки в классах
    #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
перекрестные ссылки в классах
    #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
перекрестные ссылки в классах
    #34933852
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекурсия это не очень хорошо, но пока главное чтобы собралось, а я что-то не соображу. Разнес в два разных *.h, все равно не получается.
...
Рейтинг: 0 / 0
перекрестные ссылки в классах
    #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
перекрестные ссылки в классах
    #34933958
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tubrik wrote:
> Автор: "Tubrik"
> Рекурсия это не очень хорошо, но пока главное чтобы собралось, а я
> что-то не соображу. Разнес в два разных *.h, все равно не получается.

Достаточно перенести реализацию конструктора ClassA() после
определения ClassB. Текст у blinded/b]. Только не забудь написать
inline в реализации ClassA::ClassA().
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
перекрестные ссылки в классах
    #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
перекрестные ссылки в классах
    #34934056
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tubrik wrote:
> если я правильно понимаю, то include - это включение текста указанного
> файла непосредственно в месте include, тогда почему не получается след.
> сборка (конструкторы вынесены в *.cpp):

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

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

Разве не так?
...
Рейтинг: 0 / 0
перекрестные ссылки в классах
    #34934217
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
перекрестные ссылки в классах
    #34934220
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TubrikРекурсия это не очень хорошо, но пока главное чтобы собралось, а я что-то не соображу. Разнес в два разных *.h, все равно не получается.

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

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

Разве не так?

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

Разве не так?

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

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

Разве не так?

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

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

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

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

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

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

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

Вполне возможно, что можно избежать, но геморно. Если ты инклудишь два файла, каждый из которых инклудит какой-то третий, то без этой конструкции не обойтись. Может и можно построить схему в который подобное пройдет, но это будет совсем не гуд. Так что мистер "Р. Лафоре" (не знаю хто это такой) не прав.
...
Рейтинг: 0 / 0
перекрестные ссылки в классах
    #34936605
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь возникла проблема в классах-потомках, предварительного объявления при наследовании им кажется не достаточно, что тут можно придумать?
...
Рейтинг: 0 / 0
перекрестные ссылки в классах
    #34936620
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код в студию
...
Рейтинг: 0 / 0
перекрестные ссылки в классах
    #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
перекрестные ссылки в классах
    #34936664
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, так не пойдет,тобы отнаследоваться надо видеть определение класса, форфардом не отделаешься
...
Рейтинг: 0 / 0
перекрестные ссылки в классах
    #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
перекрестные ссылки в классах
    #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
перекрестные ссылки в классах
    #34936689
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
убираю #include "a.h" и все пахает как надо.

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


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