Проблемы с #include и неполными типами - PullRequest
0 голосов
/ 22 октября 2010

Я избавился от круговой зависимости, но у меня все еще есть проблемы с другой проблемой.

Я все еще учусь и надеюсь, что кто-то сможет объяснить мне больше о том, что не так с моей реализацией.Извините за беспокойство, но я действительно ценю всех, кто мне помогает.

Итак, проблема, с которой я сталкиваюсь сейчас, заключается в том, что в моем классе Vec3 он пытается использовать кватернионы, но у него нет "полный тип "кватерниона.

Вот что у меня есть:

vec3.h

#ifndef VEC3_H

#define VEC3_H



#include "point.h"

#include <math.h>

class Quaternion;


class Vec3

{

    friend ofstream& operator <<(ofstream& output, const Vec3& p);

    friend ifstream& operator >>(ifstream& input, Vec3& p);



    public: 

    Vec3();

    Vec3(double _x, double _y);

    Vec3(double _x, double _y, double _z);



    double x,y,z;



    //Operators

    Vec3 operator -(Vec3 a) const;

    Vec3 operator /(double s) const;

    Vec3 operator *(double s) const;

    Vec3 operator *(Quaternion q) const;



    // Used to do vector Vec3 addition

    Vec3 operator +(Vec3 a) const;

    Point operator +(Point a) const;



    Vec3& operator =(Point a);



    Vec3 crossProduct(Vec3 v1); // Itself cross v1

    double dotProduct(Vec3 v);

    double length();

    void normalize();

};



#endif

Quaternion.h

#ifndef QUATERNION_H    
#define QUATERNION_H

#include "vec3.h"


class Quaternion

{



public:

    Quaternion(Vec3 v);

    Quaternion(double w, Vec3 v);



    Vec3 v;

    double scalar;



    Quaternion operator *(Quaternion s);

    Quaternion conjugate();

};



#endif

vec3.cpp Ошибка в каждой строке этой функции.

...    

Vec3 Vec3::operator *(Quaternion q) const

{

    // Change this vector into a quaternion

    Quaternion currentQuat(0, Vec3(x,y,z));

    Quaternion newQuat = currentQuat*q;

    Quaternion result = q.conjugate()*newQuat;



    return result.vec();

}

...

Ответы [ 4 ]

2 голосов
/ 22 октября 2010

Вам нужно добавить

 #include "Quaternion.h"

в начало vec3.cpp.

1 голос
/ 22 октября 2010

Предварительного объявления типа достаточно, чтобы использовать указатель на этот тип.

class Quaternion;

void func(Quaternion* q);

Однако, как только вы используете тип напрямую, прямого объявления больше не достаточно.

void func(Quaternion q);

Чтобы компилятор использовал тип, а не указатель на тип, ему нужно полное объявление типа, а не просто предварительное объявление. В этом случае у вас есть предварительное объявление для Quaternion, но не полное объявление, поэтому компилятор выдает ошибку, что тип Quaternion неполный. Решение состоит в том, чтобы предоставить vec3.h полное объявление типа для Quaternion, включив Quaternion.h.

Кстати, немного странно, что один из ваших заголовочных файлов пишется с заглавной буквы, а другой - нет. Возможно, вы захотите выбрать более последовательную схему именования.

1 голос
/ 22 октября 2010

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

Vec3 operator *(Quaternion q) const;

на

Vec3 operator *(const Quaternion &q) const;

1 голос
/ 22 октября 2010

В файле cpp вы должны включить заголовок для Quaternion.

Предварительные объявления в заголовках просто помогают правильно оформить все объявления, чтобы объявления не требовали полной доступности друг друга.

Чтобы использовать тип, вам нужно включить заголовок.

...