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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ hexxagon http://www.cyberforum.ru/cpp/thread127078.html
доброго времени суток. у кого-нибудь есть исходный код игры гексагон? (hexxagon) имеется поле, состоящее из шестиугольников. На нем расставлены ваши фишки, и фишки врага. Причем этим врагом может стать как компьютер, так и человек. Перемещение фишек осуществляется по-очереди. Есть два способа передвинуть фишки. Первый: вы ставите новую фишку рядом со своей старой. При этом все фишки вокруг...
C++ Вопрос по std::map В качестве хэш-таблицы для строк (AnsiString) я использовал std::map. От таблицы мне нужно было ещё и такое свойство: я хотел иметь информацию о том, присутсвует данный ключ в таблице или нет. В описании std::map сказано, что оператор ВСЕГДА создаёт элемент в таблице. В случае со String'ами такой проблемы как таковой не было, потому как даже если элемент создаётся в таблице, то он создаётся... http://www.cyberforum.ru/cpp/thread127021.html
Готовый проекты в Visual Studio на С++ C++
Здравствуйте. Я ищу готовые проекты visual studio на с++. Нужны они мне для метрического анализа для диплома. Несколько открытых программ я нашел на SF.net, но они там попадаются очень редко. Может кто поможет с поиском, или поделится своими разработками?
C++ Нужно разобраться со стеком
Доброго времени суток... Помогите, пожалуйста, разобраться со стеком. Задание следующие : "написать программу для перестановки элементов стека x(1),x(2),x(3),...x(n)=>x(2),x(3),...x(n),x(1). Элементы пронумерованы в порядке их введения в стек." Нужна программа под dos, без доп. библиотек. Приведу пример программы работы со стеком. В программе вводится стек из н эллементов, и выводится на...
C++ Создание нескольких объектов приводит к ошибке http://www.cyberforum.ru/cpp/thread126332.html
for(int i=1,j=0;i<22;i++) for(j=1;j<32;j++) switch (MCard){ case 0:{ TNight *Night = new TNight; // создав 5 объектов *Night экземпляра TNight на 6 раз выдает ошибку . . . Ошибка доступа к защищенной памяти.
C++ О "нестабильности" или "переполнении" цикла foreach Здравствуйте, коллеги. Недавно коллега-программист сообщил мне страшную вещь: оказывается, что цикл foreach может переполниться при большом объеме (50000) обрабатываемых записей (в результате часть записей не обрабатывается). Я сам ни разу с этим явлением не сталкивался. Может ли кто-либо подтвердить это заявление? Заранее благодарен. Александр. подробнее

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

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

09.05.2010, 16:50. Просмотров 3050. Ответов 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();
};
Из чего видно почему оно не компилится.

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