2011-01-13 3 views
0

Я работаю над проектом с несколькими классами. Все файлы заголовков находятся в папке «include» и всех файлах src в другой папке. Но на данный момент отсутствует класс, работающий без проблем.ошибка C2143. Почему VC++ не находит мой класс?

Код, который производит ошибку является:

namespace render{ 
    class CSprite2D 
    { 
     CTexture * m_texture; 

И ошибка синтаксическая ошибка: отсутствует ';' до '*' Итак, я не имею ни малейшего представления о том, почему VC++ не находит мой класс. Порядок в том, что классы компиляции VC++ очень estrange: обнаруживает ошибку в sprite2D, прежде чем пытаться скомпилировать Texture.cpp. Кроме того, класс CTexture был в проекте и отлично работает до создания sprite2D.

Не могли бы вы помочь мне с некоторой уловкой, чтобы найти ошибку?

* Редактировать: * Он работает, и решение состоит в том, чтобы просто переслать декларацию класса текстуры (спасибо Джеймсу и поджелудочной железе). Но теперь я сомневаюсь: если бы я включил текстуру, зачем мне пересылать объявлять класс текстуры? Недостаточно включить заголовочный файл?

Заранее спасибо.

+0

Заказ не должен иметь значения, вы включаете файл заголовка до этого кода? – GManNickG

+1

У вас '# include'-ed правильные заголовки везде, где они вам нужны? У вас есть проблема с рекурсивными заголовками, включая друг друга? –

ответ

2

просто объявить его, вы используете только указатель:

namespace render{ 
    class CTexture; //forward declaration 
    class CSprite2D 
    { 
     CTexture * m_texture; 

Конечно, как комментарии suggets:

  • не забудьте включить все необходимые заголовки в ваших * .cpp файлов
  • использовать декларации с перекрестными круговыми зависимостями (например, класс A {B * b;}; класс B {A * a;})

Редактировать: Редактировать Asker:

Я включил текстуру, зачем мне нужно переслать декларацию класса текстуры?

Представьте, что у вас есть «sprite.hpp», «texture.hpp», а CSprite2D содержит указатель на текстуру. Без форвардной декларации вы должны включать «texture.hpp» всегда, прежде чем включать «sprite.hpp». Хуже того, если ваш CTexture использует указатель на CSprite2D, у вас нет другого выбора, кроме как использовать декларацию forward, чтобы избежать циклических зависимостей.

+0

Понял :) Спасибо, что освободил мои сомнения. – Killrazor

1

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

Однако, поскольку вы используете только указатель здесь, вы, вероятно, просто можете сделать прямое объявление и включить заголовок в .cpp-файле, где методы/данные CTexture используются для предотвращения циклического заголовка.

Смежные вопросы