C ++ импорт цикла с двумя классами? - PullRequest
1 голос
/ 06 октября 2011

Я уверен, что этот вопрос задавался ранее, но я не могу его найти.

У меня есть два класса, Vector и Point.

Файлы как таковые (немного повторяющиеся):

vector.h:

#include <math.h>
#include <stdlib.h>

class Vector {
  friend class Point;

  public:
    ...

    Vector(Point); // Line 16

vector.cpp:

#include <math.h>
#include <stdlib.h>

#include "vector.h"

...

Vector::Vector(Point point) { // Line 29
  x = point.x;
  y = point.y;
  z = point.z;
}

point.cpp и point.h выглядят в основном одинаково, за исключением того, что вы поменяете vector с point в определениях.

Я включаю их так:

#include "structures/vector.cpp"
#include "structures/point.cpp"

Когда яскомпилировать, я получаю эту ошибку:

structures/vector.h:16:17: error: field ‘Point’ has incomplete type
structures/vector.cpp:29:15: error: expected constructor, destructor, or type conversion before ‘(’ token

Я думаю, что эта ошибка говорит о том, что Point еще не было объявлено, но когда я объявляю его внутри vector.h путем импорта point.cpp, яполучите огромную кучу ошибок.

Может ли кто-нибудь пролить свет на эту проблему?

Спасибо!


После применения @ ildjarn'sпредположения, эти ошибки исчезли, и у меня остался один:

structures/vector.h:16:18: error: expected ‘)’ before ‘const’

И строка:

Vector(Point const);

Я определяю это так в файле .cpp:

Vector::Vector(Point const &point) {

1 Ответ

5 голосов
/ 06 октября 2011
  1. Вы не должны включать файлы .cpp, вы должны включать файлы .h.

  2. vector.cpp требуется #include "point.h" и (предположительно) для point.cpp требуется #include "vector.h".

  3. Форвардное объявление достаточно, только если вы не делаете ничего, что требует размера или интерфейса типа. Поскольку конструктор Vector принимает значение Point, его размер должен быть известен; замените конструктор Vector, чтобы вместо него взять ссылку Point на const, и предварительное объявление останется достаточным.

  4. Ваши заголовки должны # включать охрану (или #pragma once, если вы не против того, чтобы быть на 100% переносимым).

РЕДАКТИРОВАТЬ (в ответ на редактирование OP):

Ваша декларация и определения теперь не соответствуют друг другу - то есть, ваше определение правильное, но ваша декларация требует Point const&, а не просто Point const.

...