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

Порядок Хедеров - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
TGrey[WoLf]
 Аватар для TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
27.11.2010, 16:31     Порядок Хедеров #1
Добрый день, подскажите, как правильно подключать хедеры если имеются, несколько классов, которые использую друг друга.
А именно(все классы в разных файлах)
Код
Class1
{
   Class2 *cs2;
   Class3 *cs3;
};

Class2
{

};

Class3:public Class2;
{
    Class(Class1 *c){ cs1 = c; }
    Class1 *cs1;
};
В основ ошибка была в конструктора класса 3, пишет, что объект не определен. Попробовал подключить Хедер с этим классом, и началось... ошибка на ошибке, то множественное определение, то еще что.
Как корректно это все подключить надо?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2010, 16:31     Порядок Хедеров
Посмотрите здесь:

Обратный порядок C++
порядок байтов C++
C++ Порядок перестановок
C++ Лексикографический порядок
C++ Шахматный порядок
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.11.2010, 16:34     Порядок Хедеров #2
TGrey[WoLf], Прописать в каждом хедере страж включения например
#ifndef _FILENAME_H_
#define _FILENAME_H_

И в конце файла #endif
TGrey[WoLf]
 Аватар для TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
27.11.2010, 16:55  [ТС]     Порядок Хедеров #3
И все же Класс3 жалуется, когда я пытаюсь вызвать функцию из 1 класса, который передается в конструктор.

Код
#ifndef....
#include "Class1.h"
class Class1;
Class3
{
    Class3(Class1 *c){ c1 = c; }
}
#endif
f is not member of Class1 because the type is not yet defined
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.11.2010, 23:53     Порядок Хедеров #4
TGrey[WoLf],
C++
1
2
#include "Class1.h"
class Class1;
Вам не кажется, что стоит оставить что-то одно?
TGrey[WoLf]
 Аватар для TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
28.11.2010, 11:40  [ТС]     Порядок Хедеров #5
В таком случае жалуется на член-класса
Код
Class1 *cl;
Type name expected, Declaration missing ;
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
28.11.2010, 17:52     Порядок Хедеров #6
Во-первых, удостоверься, что ты построил программу правильно, и что тебе нужны такие перекрёстные подключения. Если действительно нужны, то рецепт следующий:

В одном файле, который использует класс из другого файла напиши сверху
C++
1
class some_class;
и не подключай заголовок с этим классом, а в другом оставь влючённый заголовок.
TGrey[WoLf]
 Аватар для TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
28.11.2010, 18:15  [ТС]     Порядок Хедеров #7
Да вот я так и написал, прочитал, что если класс наследует другой, то базовый хедер надо подключить - подключил. Но ошибка в том, что когда я пытаюсь вызвать метод из этого класса который я написал перед основным, оно пишет, что метод не является методом того класса, потому что тип еще не объявлен.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
28.11.2010, 19:19     Порядок Хедеров #8
Без полного текста программы более подробно невозможно ответить.
TGrey[WoLf]
 Аватар для TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
28.11.2010, 19:35  [ТС]     Порядок Хедеров #9
Прикрепил архив.
В Unit4.cpp подключены 3 хедера. Но между собой оно конфликтуют.
Пробуя разные советы возможно там намутил чушь, если можно посмотрите, исправьте как нужно, для корректной работы.
Вложения
Тип файла: rar qwe.rar (654.6 Кб, 14 просмотров)
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
28.11.2010, 21:55     Порядок Хедеров #10
Скомпилировать, к сожалению, не могу, но попробую разобраться так.

Во-первых, у тебя в файле "Player.h" написан тот же дефайн, что и в файле "Map.h", соответственно, один из них вообще подключён не будет. Нужно исправить, например, на
C++
1
2
#ifndef _PLAYER_H
#define _PLAYER_H
Файл "Player.h", насколько я понимаю, ничего лишнего не использует, поэтому его больше трогать не надо.
Файл "Map.h" пока не трогай.
В "Enemy.h" подключай "Player.h" и "Map.h" и убирай
C++
1
2
class CMap;
class Player;
А в файле "Unit4.cpp" попробуй подключить только "Enemy.h".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2010, 22:31     Порядок Хедеров
Еще ссылки по теме:

Компоновка хедеров C++
Обратный порядок С++ C++
Правильное подключение хедеров C++

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

Или воспользуйтесь поиском по форуму:
TGrey[WoLf]
 Аватар для TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
28.11.2010, 22:31  [ТС]     Порядок Хедеров #11
Все блин... Спасибо! Все виной кривые руки и копипаст. Действительно оно Плеер.ш просто не инклудило.
Я создал проект в Студии с той же иерархией, но там все работает. Оказывается, потому что там писал без копи\паста там все заинклудило как надо.
Вот такая рабочая структура:
Код
//main.cpp
#include "cA.h"
#include "cB.h"
#include "cC.h"
int main()
{
    A *a;
    a = new A();
    a->b = new B(2);
    a->b->a = 3;
    return 0;
}
//------------------------------------------------------
//cA.h
#ifndef _CA_H
        #define _CA_H
class B;
class C;
class A
{
public:
    void D();
    B *b;
    C *c;
};
#endif
//-------------------------------------------------------------
//cB.h
#ifndef _CB_H
        #define _CB_H
class B
{
public:
    B(int a){};
    int a;
};
#endif
//---------------------------------------------------------------
//cC.h
#ifndef _CC_H
        #define _CC_H
class C : public B
{
public:
    C() : B(1){};
    int b;
};
#endif
//-----------------------------------------------------------------
//func.cpp
#include "cA.h"
#include "cB.h"
#include "cC.h"
void A::D()
    {
        b = new B(2);   //
        b->a = 3;
    }
Yandex
Объявления
28.11.2010, 22:31     Порядок Хедеров
Ответ Создать тему
Опции темы

Текущее время: 12:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru