Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема включения хедеров, много перекрестных использований 
V
    Опции темы
Burka
Дата 19.6.2012, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Подскажите как решить такую проблему: у меня много мелких классов, которые могут использовать друг друга. Как правильно организовать хедеры что бы не возникало проблем при компиляции, с расчетом на будущие добавляния новых классов. 
Вот так у меня сейчас, и возникает ошибка типа 
Цитата

     error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "MegaObject"


Action.h
Код

 #include "shared.h"

class Action 
{
   void execute(Object*, MegaObject*);
}


Object.h
Код

 #include "shared.h"
 
class Object 
{
   Action* current;
}


MegaObject.h
Код

 #include "shared.h"
 
class MegaObject: public Object{}


shared.h
Код

#include "Action.h"
#include "Object .h"
#include "MegaObject.h"



Это сообщение отредактировал(а) Burka - 19.6.2012, 00:32


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
alexvs11
Дата 19.6.2012, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



PM MAIL   Вверх
Burka
Дата 19.6.2012, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



#pragma once мне не помогает smile


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
alexvs11
Дата 19.6.2012, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



тогда напиши нормальный код
то что ты выложил (без include guard'ов и pragma once) точно работать не может
PM MAIL   Вверх
Burka
Дата 19.6.2012, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Нормальный код я как раз хотел увидеть) потому что у меня не работает никак)



Action.h
Код

#pragma once
#include "shared.h"

class Action 
{
   void execute(Object*, MegaObject*);
};


Object.h
Код

#pragma once
#include "shared.h"
 
class Object 
{
   Action* current;
};


MegaObject.h
Код

#pragma once
#include "shared.h"
 
class MegaObject: public Object{};


shared.h
Код

#pragma once
#include "Action.h"
#include "Object .h"
#include "MegaObject.h"


Это сообщение отредактировал(а) Burka - 19.6.2012, 01:13


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
alexvs11
Дата 19.6.2012, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



Burka, ; после class { }; стоят?
PM MAIL   Вверх
Burka
Дата 19.6.2012, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Поправил в примере, вообще да везде стоят, перепроверил. У меня вообще больше классов, я хотел увидеть пример какой-нибудь работающий с множеством инклудов перекрестных. Я просто чего то не допонимаю и из за этой мелочи не могу сделать


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
alexvs11
Дата 19.6.2012, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



Код

#pragma once

class Object;
class MegaObject;

class Action 
{
   void execute(Object*, MegaObject*);
};


Код

#pragma once
#include "shared.h"
 
class MegaObject: public Object{};


Код

#pragma once
#include "shared.h"
 
class Object 
{
   Action* current;
};



Код

#pragma once
#include "Action.h"
#include "Object.h"
#include "MegaObject.h"



Код

#include "shared.h"

int main() {

}


Это сообщение отредактировал(а) alexvs11 - 19.6.2012, 01:24
PM MAIL   Вверх
Dem_max
Дата 19.6.2012, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



не ругается на отсутствие конструкторов класса ?
тот же Builder проигнорирует отсутствие конструктора и создаст его сам по умолчанию.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Alexeis
Дата 19.6.2012, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



  Очень вероятно что объекты у вас ссылаются друг на друга в виде полей. Такое поведение не запрещено, но только если поля являются указателями и присутствует опережающее описание объекта. Кроме того такая циклическая ссылочность серьезно ограничит возможности по написанию кода в заголовках. Некоторые послабления есть для шаблонов, ввиду того, что синтаксис шаблонного класса проверяется там где инстанциируется, а не сразу по включению.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Burka
Дата 19.6.2012, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



че то ничего у меня не получается, все равно ругается. вот такая структура.

Action.h
Код

#pragma once
#include "shared.h"
class Action
{
   void execute(Object*, Object*);
};


Object.h
Код

#pragma once
#include "shared.h"
class Object
{
   Action* current;
};



Place.h
Код

#pragma once
#include "shared.h"
class Place : public Object
{
   
};



Human.h
Код

#pragma once
#include "shared.h"
class Human: public Object
{
   
};


World.h
Код

#pragma once
#include "shared.h"
class World
{
   list<Object*> Objects;
   vector< vector< Place* > > WorldMatrix;
};




Shared.h
Код

#pragma once
#include "Action.h"
#include "Object.h"
#include "Place.h"
#include "Human.h"
#include "World.h"



как я это ни вертел ничего не выходит. пробовал форвард оставлять и не включать хедеры там где можно, все равно не получается. к концу получается что какой то класс не объявлен


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
Dem_max
Дата 20.6.2012, 06:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



в Shared.h сделай объявление
Код

#ifndef SHARED_H
#define SHARED_H

#include "Action.h"
#include "Object.h"
#include "Place.h"
#include "Human.h"
#include "World.h"

class Action;
class Object;
// ....... и т.д.

#endif


теперь как бы единица компиляции у которой подключен хеадер Shared.h будет видеть что мол объявлен такой то класс.
А уже на этапе линковки все это будет соединяться вместе. 

Это сообщение отредактировал(а) Dem_max - 20.6.2012, 06:13


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Burka
Дата 20.6.2012, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



а #pragma once разве не тоже самое делает?


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
math64
Дата 20.6.2012, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



#pragma once понимают не все компиляторы, а #ifndef - #define - #endif все.
Но лучше писать код так, чтобы ни #pragma once, ни #ifndef - #define - #endif были не обазательны, а были только доп. страховкой:
Код

// Action.h
class Object;
class Action
{
   void execute(Object*, Object*);
};
// Object.h - едиственный файл, где #pragma once или #ifndef - #define - #endif необходимы
#pragma once
#ifndef OBJECT_H
#define OBJECT_H
class Action;
class Object
{
   Action* current;
};
#endif
//Place.h
#include "Object.h"
class Place : public Object
{
   
};
//Human.h
#include "Object.h"
class Human: public Object
{
   
};
//World.h
#include <list>
#include <vector>
class Object;
class Place;
class World
{
   std::list<Object*> Objects;
   std::vector< std::vector< Place* > > WorldMatrix;
};
//Shared.h
#include "Action.h"
#include "Object.h"
#include "Place.h"
#include "Human.h"
#include "World.h"

+ добавь для страховки #pragma once и/или #ifndef - #define - #endif в остальных файлах, но всё будет работать без них
PM   Вверх
Burka
Дата 20.6.2012, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Спасибо больше, понял наконец то в чем дело)


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.