Возможный дубликат:
Круговые зависимости / неполные типы
написание маленькой программы на 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
Это просто означает, что компилятор не знает, что 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
директивы в ваших заголовках к минимуму, чтобы избежать чрезмерных зависимостей компиляции. Заголовок необходимо включать только в том случае, если он определяет используемый вами тип (обычно потому, что определяемый вами класс имеет член данных этого типа). Если вы используете только указатели или ссылки на этот тип или параметры функции этого типа (как в вашем примере), достаточно предварительного объявления.
ваш файл 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