2012-11-27 74 views
0

我有一個基類Point我從Point3D繼承。但是,由於某些原因,類Point必須始終返回Point3D作爲操作add,因此我將它包含在我的包含中。基類有不完整類型

這是我Point類:

#ifndef POINT_H 
#define POINT_H 

#include "Point3D.hpp" 

class Point{ 

    public: 
    Point(double, double, double); 

    void print() const; 
    Point3D add(const Point&); 

    protected: 
    double mX; 
    double mY; 
    double mZ; 

}; 

#endif 

在我Point3D類,我知道我會還沒有遇到過的Point定義時,我會先被調用(因爲Point3D包括在Point頭) ,所以我定義class Point;,然後我確定我會用Point部分:

#ifndef POINT3D_H 
#define POINT3D_H 

#include <iostream> 
#include "Point.hpp" // leads to the same error if ommitted 

class Point;  

class Point3D : public Point { 

    public: 
     Point3D(double, double, double); 
     void print() const ; 
     Point3D add(const Point&); 
}; 

#endif 

但是,這是行不通的。當我編譯它,它給了我下面的錯誤:

./tmp/Point3D.hpp:9:24: error: base class has incomplete type 
class Point3D : public Point { 
       ~~~~~~~^~~~~ 
./tmp/Point3D.hpp:7:7: note: forward declaration of 'Point' 
class Point; 
    ^
1 error generated. 

問題here會說從我Point3D聲明中刪除包括#include "Point.hpp"。但是,這樣做會產生相同的結果,我認爲頭衛隊基本上可以完成同樣的任務。

我在用叮噹語編譯。

+0

您已經點和三維點之間的循環依賴。 Point應該只適用於Point類型,然後Point3D應該添加,重載/隱藏特定的成員。 –

+0

當然,這是我在學校做的一項任務的一部分,教授特別提出了這種行爲。 – AntoineG

回答

6

您不能繼承不完整的類型。您需要按如下方式構造代碼:

class Point3D; 

class Point 
{ 
    // ... 
    Point3D add(const Point &); 
    // ... 
}; 

class Point3D: public Point 
{ 
    // ... 
}; 

Point3D Point::add(const Point &) 
{ 
    // implementation 
} 

函數的返回類型可以是不完整的,這就是爲什麼Point是這樣的類定義。

我相信你可以弄清楚如何在頭文件和源文件之間進行分割。 (例如,前兩個部分可以進去Point.hpp,第三個在Point3D.hpp其中包括Point.hpp,並最終實現可以在Point.cpp其中包括Point.hppPoint3D.hpp去。)

+0

謝謝,就是這樣!我也明白我的錯誤是什麼。 – AntoineG