Переполнение стека ошибок другого неполного типа

Возможный дубликат:
Круговые зависимости / неполные типы

написание маленькой программы на C ++ и быть в замешательстве ….

получил 4 класса, 2 важных для этой ошибки …

получил сообщение об ошибке «поле ‘точка’ имеет неполный тип» в строке 13 и «ожидается»; ‘ befor ‘(‘ token ‘в той же строке

Ошибка, кажется, начинается в Vector3.cpp, где только включение Vector3.h и пустые методы

удалил include «Vector3.h» в заголовке Normal3, думал, что будет работать по кругу … не очень хорошо …

некоторые идеи? надеюсь так 🙂 и ты за ответы

Вот мои два важных класса:

#ifndef NORMAL3_H
#define NORMAL3_Hclass Normal3 {public:

double x, y, z;
Normal3 mul(Normal3 n);
Normal3 add(Normal3 n);
Normal3 dot(Vector3 v); //Line 13

Normal3(double x = 0, double y = 0, double z = 0)
: x(x), y(y), z(z)
{ }

};

#endif //NORMAL3_H

AAAAAAAAAAAAAAAAAAAAAND

#ifndef VECTOR3_H
#define VECTOR3_H

#include "Normal3.h"
class Vector3 {

public:

double x, y, z, magnitude;

Vector3 add(Vector3 v);
Vector3 add(Normal3 n);
Vector3 sub(Normal3 n);
Vector3 mul(double c);
double dot(Vector3 c);
double dot(Normal3 n);
Vector3 normalized();
Normal3 asNormal();
Vector3 refelctedOn(Normal3 n);

Vector3(double x = 0, double y = 0, double z = 0, double m = 0)
: x(x), y(y), z(z), magnitude(m)
{ }

};

#endif //VECTOR3_H

1

Решение

Это просто означает, что компилятор не знает, что Vector3 в этот момент. Если вы объявите это заранее, ошибка исчезнет:

#ifndef NORMAL3_H
#define NORMAL3_H

class Vector3;  // Add this line

class Normal3 {
// ...
};

ОБНОВЛЕНИЕ: Как Джон говорит в своем комментарии, было бы хорошим улучшением заменить #include "Normal3.h" в Vector3.h с еще одним предварительным объявлением, class Normal3;:

#ifndef VECTOR3_H
#define VECTOR3_H

class Normal3; // instead of #include "Normal3.h"
class Vector3 {
// ...
};

Вы должны попытаться сохранить #include директивы в ваших заголовках к минимуму, чтобы избежать чрезмерных зависимостей компиляции. Заголовок необходимо включать только в том случае, если он определяет используемый вами тип (обычно потому, что определяемый вами класс имеет член данных этого типа). Если вы используете только указатели или ссылки на этот тип или параметры функции этого типа (как в вашем примере), достаточно предварительного объявления.

3

Другие решения

ваш файл normal3.h ничего не знаю о Vector3,

я вижу это Vector3 v не меняется в dotтогда вы должны написать:

вместо Normal3 dot(Vector3 v); //Line 13

как

#ifndef NORMAL3_H
#define NORMAL3_H

class Vector3;

class Normal3 {public:

double x, y, z;
Normal3 mul(Normal3 n);
Normal3 add(Normal3 n);
Normal3 dot(const Vector3 &v); //Line 13

Normal3(double x = 0, double y = 0, double z = 0)
: x(x), y(y), z(z)
{ }

};

#endif //NORMAL3_H
0