Форум программистов, компьютерный форум CyberForum.ru

Перекрёстные ссылки в объявлениях классов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как узнать текущее положение указателя файла? http://www.cyberforum.ru/cpp/thread127177.html
Как узнать текущее положение указателя файла в байтах?
C++ Почему возникает ошибка? template <class T> class HashTable { .... }; class FileHashTable: public HashTable <Policy> { public: FileHashTable() // здесь возникает ошибка: error C2512: 'HashTable<struct Policy>' : no appropriate default constructor available { http://www.cyberforum.ru/cpp/thread127141.html
C++ Как правильно записать наследника от такого класса?
template <class T> class Me{ ...} От класса Me?
C++ hexxagon
доброго времени суток. у кого-нибудь есть исходный код игры гексагон? (hexxagon) имеется поле, состоящее из шестиугольников. На нем расставлены ваши фишки, и фишки врага. Причем этим врагом может стать как компьютер, так и человек. Перемещение фишек осуществляется по-очереди. Есть два способа передвинуть фишки. Первый: вы ставите новую фишку рядом со своей старой. При этом все фишки вокруг...
C++ Вопрос по std::map http://www.cyberforum.ru/cpp/thread127021.html
В качестве хэш-таблицы для строк (AnsiString) я использовал std::map. От таблицы мне нужно было ещё и такое свойство: я хотел иметь информацию о том, присутсвует данный ключ в таблице или нет. В описании std::map сказано, что оператор ВСЕГДА создаёт элемент в таблице. В случае со String'ами такой проблемы как таковой не было, потому как даже если элемент создаётся в таблице, то он создаётся...
C++ Готовый проекты в Visual Studio на С++ Здравствуйте. Я ищу готовые проекты visual studio на с++. Нужны они мне для метрического анализа для диплома. Несколько открытых программ я нашел на SF.net, но они там попадаются очень редко. Может кто поможет с поиском, или поделится своими разработками? подробнее

Показать сообщение отдельно
Revion
1 / 1 / 0
Регистрация: 09.05.2010
Сообщений: 4

Перекрёстные ссылки в объявлениях классов - C++

09.05.2010, 16:50. Просмотров 2860. Ответов 8
Метки (Все метки)

Предположим есть класс uiObject и класс ObjectController.
Класс uiObject имеет метод GetController, который выплюнет контроллер. А класс ObjectController имеет метод GetObject, который вернёт подконтрольный объект. Эти два класса являются базовыми и далее от них наследуются классы uiState и StateController. Отличия в наследниках состоит в том, что GetObject возвращает uiState, а GetController возвращает StateController.

Реализация базовых классов какая-нибудь такая:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//**ObjectController.h
class uiObject;
 
class ObjectController
{
public:
    ObjectController() {}
    virtual ~ObjectController() {}
 
    virtual uiObject* GetOne();
};
 
//**uiObject.h
class ObjectController;
 
class uiObject
{
public:
    uiObject() {}
    virtual ~uiObject() {}
 
    virtual ObjectController* GetController();
};
И производных какая-то такая:
C++
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
//**uiState.h
 
#include "uiObject.h"
#include "StateController.h" // <- это 1ый перекрёстный инклуд
 
class uiState
    : public uiObject
{
public:
    uiState() {}
    virtual ~uiState() {}
 
    virtual StateController* GetTwo();//<- компилятору нужно как-то сказать,
                                                            //    что StateController потомок ObjectController, 
                                                            //    для чего включён StateController.h
 
};
 
//**StateController.h
 
#include "ObjectController.h"
#include "uiState.h" // <- это 2ой перекрёстный инклуд
 
class StateController
    : public ObjectController
{
public:
    StateController() {}
    virtual ~StateController() {}
 
    virtual uiState* GetOne(); //<- здесь тоже самое. Включён uiState.h
};
Беда состоит в том, что это не хочет компилится из-за перекрёстных ссылок в ш-никах : ).

В итоге после обработки препроцессором StateController.cpp, который просто включает StateController.h получается нечто вроде:
C++
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//**         StateController.cpp
#line 1 "d:\\учеба\\_sourcecode\\qqwe\\qqwe\\statecontroller.h"
#pragma once
 
#line 1 "d:\\учеба\\_sourcecode\\qqwe\\qqwe\\objectcontroller.h"
#pragma once
 
class uiObject;
 
class ObjectController
{
public:
    ObjectController() {}
    virtual ~ObjectController() {}
 
    virtual uiObject* GetOne();
};
#line 4 "d:\\учеба\\_sourcecode\\qqwe\\qqwe\\statecontroller.h"
#line 1 "d:\\учеба\\_sourcecode\\qqwe\\qqwe\\uistate.h"
#pragma once
 
#line 1 "d:\\учеба\\_sourcecode\\qqwe\\qqwe\\uiobject.h"
#pragma once
 
class ObjectController;
 
class uiObject
{
public:
    uiObject() {}
    virtual ~uiObject() {}
 
    virtual ObjectController* GetController();
};
#line 4 "d:\\учеба\\_sourcecode\\qqwe\\qqwe\\uistate.h"
 
 
class uiState
    : public uiObject
{
public:
    uiState() {}
    virtual ~uiState() {}
 
    virtual StateController* GetTwo();
};
#line 5 "d:\\учеба\\_sourcecode\\qqwe\\qqwe\\statecontroller.h"
 
class StateController
    : public ObjectController
{
public:
    StateController() {}
    virtual ~StateController() {}
 
    virtual uiState* GetOne();
};
Из чего видно почему оно не компилится.

Вопрос: КАК реализовать такую перекрёстную классовую архитектуру на спп? Я бы стал очено грустным, если из-за вот таких заморочек компилятора этого сделать было бы невозможно : /
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru