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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Rengen
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
#1

Сложности с построением многофайлового решения - C++

26.03.2014, 20:33. Просмотров 628. Ответов 26
Метки нет (Все метки)

Есть 3-и класса. Каждый в файле. Не смотрите что реализация в h-ке, это просто чтобы было проще и удобнее понимать. Ошибка построения в итоге такая же, если даже разделить объявление и определение. Все это дело не строиться. Лучше приведу код.

SubscribersList
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
 
#include "SystemBase.h"
#include "Entity.h"
 
namespace Engine {
 
    class SubscribersList {
        friend SystemBase;
 
    public:
        SubscribersList() { }
 
        void f(Entity* e) { }
    };
}
Entity.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
 
#include "SystemBase.h"
 
namespace Engine {
 
    class Entity {
    public:
        Entity() { }
 
        void s(SystemBase* sb) { }
    };
 
}
SystemBase
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
#include "SubscribersList.h"
#include "Entity.h"
 
namespace Engine {
 
    class SystemBase {
    public:
        SystemBase() { }
 
        void g(Entity* e) { }
 
    private:
        SubscribersList m;
 
    };
}
Некоторые условия изменения кода если кто будет менять. После friend слово class не ставить, ибо он уже был описан и подключен соответствующим файлом. Должно работать так. Если убрать все упоминания про Entity, то как раз так и работает.
Это все билдится если
1 Затолкать в один файл.
2 Перед неопределенными для компилятора типами (Entity, SystemBase) поставить class. Однако все потом опять валится как только пытаешься вынести реализацию в cpp.
VS 2010.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 20:33     Сложности с построением многофайлового решения
Посмотрите здесь:

Работа многофайлового проекта - C++
С++ позволяет создавать многофайловые проект. Это повышает производительность, так как программа стает модульной и ее легко изменить и тд....

Компиляция и сборка многофайлового проекта - C++
Допустим, у меня есть такие файлы. SuperClass h - объявление, SuperClass cpp - реализация SubClass h - объявление, SubClass cpp -...

Создание многофайлового проекта в Borland 5.02 - C++
Кто знает как создать многофайловый проект в среде Borland 5.02

Как разобраться со сборкой многофайлового проекта - C++
В теории я считал что понимаю как происходят подключения файлов, их сборка (те работа линковщика, компоновщика...) Но вот на практике это...

Сборка многофайлового приложения: ошибка LNK2005 - C++
Привет! Помогите пожалуйста разобраться со организацией исходников. Структура такова: ColorButton.h в нем подключается Object.h и...

Ошибка при компиляции многофайлового проекта - C++
Добрый вечер. Возникает ошибка при компиляции проекта, состоящего из 3-х файлов. В программе использованы структуры и списки. Файл...

Беда с наследованием. Организация многофайлового приложения - C++
Вот написал такое вот чудо, работает если за коментировать любой из #include "kvadrat.h" #include "kolo.h" и соотвецтвенно их исполнения....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,734
26.03.2014, 23:28     Сложности с построением многофайлового решения #16
Цитата Сообщение от Rengen Посмотреть сообщение
Теперь вопрос следующий. Это работает для случая с указателями. Что делать если внутри класса объект класса? Похоже это нельзя делать, ибо размеры класса неопределенны тогда.
не волнуйся линкер узнает
а если нужен доступ к членам то в С файле инклюде а в H class
Цитата Сообщение от Rengen Посмотреть сообщение
Эту проблему решает #pragma once, которая есть.
когда то я тоже так думал

#pragma once, влияет на одну единицу трансляции, Си файл
если не веришь проверь напиши в h файле
int a
и подключи его к нескольким С файлам

Добавлено через 14 минут
пардон фигню сморозил
для объекта нужно полное описание класса, сиречь include

но если написано так

C++
1
2
3
4
5
6
7
8
9
class A
{
 B b;
}
 
class B 
{
A a;
}
то нужно пересматривать все решение, тут include не помогут
Rengen
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
26.03.2014, 23:34  [ТС]     Сложности с построением многофайлового решения #17
И у меня осталась последняя проблемка.

System.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
#pragma once
#include "Mask.h"
#include "Component.h"
#include "Entity.h"
#include "SubscribersList.h"
 
#include <list>
using namespace std;
 
namespace GameEngine
{
    typedef Mask SystemMask;
    typedef Type SystemType;
 
    #define SYSTEM_HEADER(SystemName, SystemMask) \
    public: \
        static SystemMask Mask()    { static SystemMask mask((SystemMask)); return mask;} \
        static SystemType Type()    { static SystemType type(GetStaticType(#SystemName)); return type;} \
        static const char* Name()   { return #SystemName; } \
        SystemMask GetMask()        { return Mask(); } \
        SystemType GetType()        { return Type(); } \
        const char* GetName()       { return #SystemName; }
 
 
    class Entity;
    class SubscribersList;
 
    class System
    {
    public:
        virtual ~System();
    
        void Subscribe(Entity* subscriber);
        void Unsubscribe(Entity* subscriber);
        void UnsubscribeAll();
 
        virtual SystemMask GetMask() = 0;
        virtual SystemType GetType() = 0;
        virtual const char* GetName() = 0;
 
        virtual int Update(float dt) = 0;
 
    protected:
        static SystemType GetStaticType(const char* systemName);
 
    protected:
        SubscribersList m_subscribers;
    
    private:
        static TypesMapper m_SystemMap;
    };
 
}
SubscribersList.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
#pragma once
#include "Entity.h"
#include "System.h"
 
#include <list>
using namespace std;
 
namespace GameEngine
{
 
    class Entity;
    class System;
 
    class SubscribersList
    {
        friend System;
 
    public:
        Entity* AtFirst();
        Entity* AtLast();
        Entity* Current();
        Entity* Next();
        Entity* Prev();
 
    protected:
        void Add(Entity* subscriber);
        void Delete(Entity* subscriber);
 
    private:
        list<Entity*>::iterator m_it;
        list<Entity*>  m_subscribersList;
    };
 
}
Выдает
1>f:\my\projects 3ds, autocad and other\c++\engine\engine\system.h(47): error C2079: "GameEngine::System::m_subscribers" использует неопределенный class "GameEngine::SubscribersList"

Похоже он не ловит определение класса нигде. С этим я уже не сталкивался. В msdn ничего кроме как заменить на указатель не смогли посоветовать. В гугле что-то левое.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,734
26.03.2014, 23:42     Сложности с построением многофайлового решения #18
Цитата Сообщение от Rengen Посмотреть сообщение
В msdn ничего кроме как заменить на указатель не смогли посоветовать.
ну так используй а в конструкторе создай по new
номер ошибки не совпадает с листитнгом, скажи на какую строчку хоть указывает?
я что то не нашел да и запутался я, честно говоря, в твоих namespace

попробуй без них сначала откомпилить
Rengen
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
26.03.2014, 23:46  [ТС]     Сложности с построением многофайлового решения #19
Пишет что SubscribersList m_subscribers в System использует неопределенный class "GameEngine::SubscribersList". То есть на нее ошибка указывает.
Интересно почему теперь не видит определение SubscribersList.
А вообще, это нормальная практика чаще использовать динамическую память, агрегацию, нежели композицию? То есть, есть же случаи когда нужна композиция, но ее можно заменить и агрегацией. Что в этом случае предпочесть?

Кстати номер совпадает. Номер в первом листинге.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,734
27.03.2014, 00:16     Сложности с построением многофайлового решения #20
Цитата Сообщение от Rengen Посмотреть сообщение
вообще, это нормальная практика чаще использовать динамическую память, агрегацию, нежели композицию?
нормально
представь что у тебя класс содержит объекты других классов размером так на 100 килобайт
и создать нужно объектов этих классов штук 100
прога ляжет, стек то не резиновый, а при динамическом выделении все куче, она всяко больше
правда конструкторы копирования нужно реализовывать, память за собой чистить
в общем свои заморочки

Добавлено через 9 минут
Цитата Сообщение от Rengen Посмотреть сообщение
Кстати номер совпадает. Номер в первом листинге.
а все нашел, почему то сразу не заметил
выбрось вот эту строчку
#include "System.h" из SubscribersList.h
у тебя ведь объекта System там нет

а то смотри что получается
Цитата Сообщение от Rengen Посмотреть сообщение
System.h

C++
1
#include "SubscribersList.h"
Цитата Сообщение от Rengen Посмотреть сообщение
SubscribersList.h

C++
1
#include "System.h"
перекрестное включение, о чем мы и говорили
прагма блокирует заголовочный файл и в результате описания класса не видно
Rengen
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
27.03.2014, 00:22  [ТС]     Сложности с построением многофайлового решения #21
Не прокатило с удалением #include "System.h" из SubscribersList.h. Та же ошибка. Уже заменил указателем.

А нет. Заработало. Там же еще Entity был подключен в котором был System
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,734
27.03.2014, 00:25     Сложности с построением многофайлового решения #22
Цитата Сообщение от Rengen Посмотреть сообщение
Не прокатило с удалением #include "System.h" из SubscribersList.h.
там еще с namespace чейто накручено, я запутался
Rengen
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
27.03.2014, 00:30  [ТС]     Сложности с построением многофайлового решения #23
Цитата Сообщение от ValeryS Посмотреть сообщение
там еще с namespace чейто накручено, я запутался
Просто чтобы не переклекнуться с чем-нибудь из std и прочих headerов. У меня есть System. В std возможно тоже есть. На всякий случай затолкал туда.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,734
27.03.2014, 00:41     Сложности с построением многофайлового решения #24
Цитата Сообщение от Rengen Посмотреть сообщение
Просто чтобы не переклекнуться с чем-нибудь из std и прочих headerов.
так это я понял
я не могу врубится как ты это реализовал, в трех классах
Цитата Сообщение от Rengen Посмотреть сообщение
namespace Engine {
может в этом загвоздка
честно говоря, я никогда не нарывался на перекрытия имен, и поэтому по серьезному с namespace не работал

Добавлено через 50 секунд
Цитата Сообщение от Rengen Посмотреть сообщение
У меня есть System.
обзови ESystem или MySystem
Rengen
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
27.03.2014, 07:30  [ТС]     Сложности с построением многофайлового решения #25
namespace - достаточно распространенная практика, на сколько я знаю. Наверно больше в C#, хотя С++ это появилось все же раньше, ибо он раньше C#, как раз, чтобы решить проблему коллизий имен.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,734
27.03.2014, 07:38     Сложности с построением многофайлового решения #26
Rengen,
А зачем ты мне это рассказываешь?
я знаю зачем это придумано
Я не могу разобраться в твоей реализации
что то меня смущает
Пущай знающие люди скажут
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2014, 15:02     Сложности с построением многофайлового решения
Еще ссылки по теме:

совсем запуталась с построением( - C++
Составьте блок-схему алгоритма решения задачи, а также запишите словесно-пошаговый алгоритм (псевдокод): можно ли построить треугольник с...

Метод вращений с построением КЮЭР-разложения - C++
Я написал только Метод вращения #include&lt;math.h&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;time.h&gt; void f(double *mass,...

Написать интерпретатор логических выражений с построением таблицы четверок и выполнить ее - C++
Написать интерпретатор логических выражений с построением таблицы четверок и выполнить ее. Считать, что выражения включают в себя только...

сложности по рекурсии в С++ - C++
Правильно ли, что в функции: { if (number &lt; 0) { cout &lt;&lt; '-' &lt;&lt; endl; super_write_vertical(abs(number)); } else if...

Сложности с решением - C++
Дана последовательность целых чисел. Разделить эту последовательность на две группы чисел с минимально отличающейся суммой чисел. Помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Rengen
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
27.03.2014, 15:02  [ТС]     Сложности с построением многофайлового решения #27
Цитата Сообщение от ValeryS Посмотреть сообщение
А зачем ты мне это рассказываешь?
Что-то я действительно как-то... Зачем. В общем, спасибо за помощь.
Yandex
Объявления
27.03.2014, 15:02     Сложности с построением многофайлового решения
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru