Получение ошибок при использовании предварительных объявлений класса в Xcode

У меня возникла проблема с попыткой использовать предварительное объявление одного из моих классов в Xcode.

Вот моя базовая архитектура:

МойКлассА.h:

class MyClassA{
  ... list of members and method prototypes ...
};

MyClassA.cpp:

#include "MyClassA.h"

--- list of methods for MyClassA ...

МойКлассB.h:

class MyClassA; // forward declaration

class MyClassB{
  ... list of members and methods ...
  MyClassA* ptrToA;
};

MyClassB.cpp:

#include "MyClassB.h"

... list of methods for MyClassB ...

Это работает на моем компьютере с Windows в Visual Studio без проблем, делайте это все время. Однако на Mac в Xcode это дает мне ошибку:

Forward declaration of 'struct MyClassA'

Любые идеи? Сообщение об ошибке, кажется, не имеет особого смысла, так как я объявил класс простым, как день, и он возвращается с ошибкой о структуре. Не поддерживаются ли предварительные объявления в Xcode (довольно простое сообщение об ошибке, кажется, указывает на то, что это проблема, кроме путаницы структуры/класса)? Мой проект скомпилирован как C++, а не C. Есть ли другой параметр проекта, который мне не хватает, что может быть причиной этого?

Спасибо.


person DiggyJohn    schedule 22.02.2011    source источник
comment
Я предлагаю вам попытаться сократить его до примера, который вы можете процитировать полностью. Тогда людям не придется, например, задаваться вопросом, действительно ли вы оставили точку с запятой в конце объявления MyClassA.   -  person JWWalker    schedule 23.02.2011


Ответы (2)


Убедитесь, что у вас есть #include "MyClassA.h" в MyClassB.cpp, если вы не собираетесь разыменовывать ptrToA или иным образом не должны знать что-либо о базовом типе.

person wilhelmtell    schedule 22.02.2011
comment
Моя вина. Спасибо, в любом случае. Я просто неправильно понял, как работают предварительные объявления. Я пытался использовать предварительное объявление в качестве замены для включения MyClassA.h в MyClassB.h, надеясь, что после того, как все будет связано, он получит то, что ему нужно (Objective-C ДЕЙСТВИТЕЛЬНО работает таким образом из того, что я нашел). Если я включу MyClassA.h, у меня не будет причин даже писать предварительную декларацию... полная декларация уже есть и доступна из включения. - person DiggyJohn; 22.02.2011
comment
@TheoJohn, ты не показал нам весь соответствующий код. Это довольно распространенный метод, который вы описываете, очень полезный для улучшения времени компиляции. - person wilhelmtell; 22.02.2011
comment
Я заменил настоящие имена классов и другие несвязанные члены и методы (кучу чисел с плавающей запятой, символов и конструкторов), но все, что я поместил в приведенный выше пример кода, на 100 % соответствует соответствующему коду в том виде, в каком он был разработан. . - person DiggyJohn; 22.02.2011
comment
Укажите, какой код, по вашему мнению, отсутствует, и я могу попытаться включить его, чтобы помочь. - person DiggyJohn; 22.02.2011

Какая строка кода на самом деле вызывает ошибку? Я ожидаю, что вы забыли включить MyClassA.h в MyClassB.cpp, и ошибка на самом деле происходит, когда вы пытаетесь new объект.

Классы - это структуры. Они просто помечают своих членов как частные по умолчанию, в то время как структуры помечают их как общедоступные.

person Rob Napier    schedule 22.02.2011
comment
Ошибка прямо в самом фактическом предварительном объявлении. Я еще не написал никакого кода для нового объекта. - person DiggyJohn; 22.02.2011
comment
Похоже, я просто неправильно понял, как работают предварительные объявления. Я использовал их раньше, но не в той моде, которую помнил (просто оглянулся на какой-то старый код). Везде, где я их использовал, просто потому, что ClassA и ClassB существовали вместе в одном и том же заголовке, а также ссылались друг на друга, было необходимо предварительное объявление. Итак, в текущем случае того, что я пытаюсь сделать, мне нужно включить ClassA.h в ClassB.h... однако при этом использование предварительного объявления совершенно бессмысленно, потому что полное объявление класса уже существует . - person DiggyJohn; 22.02.2011
comment
Нет, я не думаю, что вы все неправильно поняли. Если все, что вам нужно, это указатель на ClassA, вам нужно только предварительное объявление. Но как только вы начнете его использовать, например, для размещения объекта или вызова функций-членов, вам потребуется полное объявление. Если это то, что вы делаете в ClassB.cpp, вам нужно включить туда ClassA.h. - person Bo Persson; 22.02.2011
comment
Хорошо, хммм ... все еще обдумывает вопрос, почему Xcode выдает ошибку и даже не позволяет мне установить предварительное объявление. Я только что набрал то же самое в Visual Studio в качестве теста, и он скомпилировался, как я и ожидал. Спасибо. - person DiggyJohn; 22.02.2011