2016-02-05 44 views
0

我在我的cpp文件一個結構,它包含一個冒號定義:如何在頭文件中定義一個具有繼承性的結構?

struct GeomMeshLoader: VRayStaticGeomSource, VRaySceneModifierInterface 
{ 
    <definitions> 
} 

我應該如何定義這個結構體在頭文件? 如果我簡單地做:

struct GeomMeshLoader; 

那麼我將另一個CPP文件,包括標題的編譯過程中得到:

allocation of incomplete type 'GeomMeshLoader' 

如果我聲明的標題,如:

struct GeomMeshLoader: VRayStaticGeomSource, VRaySceneModifierInterface; 

則將與彙編失敗:

error: expected '{' after base class list 

將包含冒號的頭文件結構定義放入什麼方式?

+1

科隆定義是什麼?夥計,它被稱爲繼承 – Drop

回答

3
allocation of incomplete type 'GeomMeshLoader' 

意味着你有嘗試使用該類型在需要看到完整的定義(即不只是抱着一個指針或引用)一些方法的一些代碼。如果它不能處理對象的大小,它如何分配這種類型的對象?爲此需要查看整個類:所有基類,所有成員數據。

您需要將整個類定義放在標題中。您無法轉發聲明並在.cpp中定義。

任何成員函數(但不是成員函數模板)的定義仍可以在.cpp中。 這些成員函數的聲明必須放在類定義中(在標題中)。

所以:

// geomeshloader.h 
#ifndef INCLUDED_GEOMESHLOADER_H // Don't forget your header guards 
#define INCLUDED_GEOMESHLOADER_H 
struct GeomMeshLoader: VRayStaticGeomSource, VRaySceneModifierInterface { 
    int i_; 
    void foo() const; 
}; 
#endif 

// geomeshloader.cpp 
#include "geomeshloader.h" 
void GeoMeshLoader::foo() const 
{ 
    // do stuff 
} 
+0

謝謝,但是當我把整個結構定義放在頭裏(這是由多個cpp包含的)時,鏈接時會出現重複的對象錯誤。那我該如何預防呢? –

+0

[Header guard](https://en.wikipedia.org/wiki/Include_guard)將您的定義多次複製到一個單獨的翻譯單元中(即在一個'.cpp'文件中被多次查看)。 – BoBTFish

+0

它工作正常,謝謝! –

相關問題