2012-02-28 9 views
0

Я только что вступил в связывание ада с проектом создания. Я перемещаю несколько вещей в своих файлах заголовков, и теперь я сталкиваюсь с тем, что некоторые объекты не могут видеть другие объекты, несмотря на то, что я использую #indef, #define и #endif для каждого файла заголовка.Избежать классов, не видящих друг друга? C++

Я заметил, что в одном из моих старых файлов я использую класс под названием «Регион» в классе «Мир».

Поскольку мир класса жаловался на то, что не смог увидеть другой класс, мне удалось пройти мимо него, просто включив класс Region; над ним.

Есть ли способ избежать подобных вещей?

спасибо.

+0

Мы должны видеть код и сообщения об ошибках. С описанием этого расплывчатого, есть десятки вещей, которые могут быть причиной проблемы. – zwol

+0

Возможно, мы не сможем ответить на этот вопрос. Вы имеете в виду, что вы включили заголовок ('#include" Region.h "') или вы объявили класс ('class Region;')? – Beta

+2

Проблемы, которые вы (неопределенно) описываете, скорее похожи на ошибки компиляции, чем ошибки компоновщика (особенно если они решены путем добавления директив #include). Кроме того, надеюсь, вы имели в виду «#ifdef», а не «#indef». – aldo

ответ

2

Одним из способов избежать включения/зависимости является попытка минимально объявить определения класса/структуры, где это возможно (указатели/ссылки, однако, благодаря Aldo для указания этого). Скажем, у вас есть этот класс:

class foo 
{ 
    bar* barObject; 
}; 

Очевидно, что бар должен быть определен в какой-то момент ранее. Вместо того, чтобы включать заголовочный файл bar, вместо этого мы можем просто добавить следующую строку непосредственно перед определением foo.

class bar; 

Это предотвращает компилятор жаловаться, что бар не определен, но и не требует всего заголовка для включения. (известный как форвардная декларация)

Я нашел, что это минимизирует много pesky включают проблемы, которые могут возникнуть, когда есть круговые зависимости и еще много чего.

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

Больше чтение: http://www-subatech.in2p3.fr/~photons/subatech/soft/carnac/CPP-INC-1.shtml

+0

Передовая декларация (как ее называют) фактически не будет работать в примере, который вы использовали. Если класс foo содержит указатель или ссылку на панель, он будет работать, но не если он содержит строку по значению - в этом случае компилятору необходимо полное объявление строки. – aldo

+0

Моя вина, я полностью забыл об этом. Я отредактирую –