2012-11-16 64 views
1

我要擴展一個C++類,但絕對沒有該語言的背景。谷歌搜索並沒有幫助我瞭解如何解決編譯錯誤:C++,幫助擴展這個類

Constructor for 'JRB2World' must explicitly initialize the base class 'b2World' which does not have a default constructor 

所以,有這種b2World.h

class b2World 
{ 
public: 
    b2World(const b2Vec2& gravity); 
    ~b2World(); 

    // ... 

而且它的.cpp:

b2World::b2World(const b2Vec2& gravity) 
{ 
    // ... 
} 

b2World::~b2World() 
{ 
    // ... 
} 

我的班級標題:

#import "Box2D.h" 

class JRB2World : public b2World { 

    float factor; 

public: 

    JRB2World(const b2Vec2& gravity); 
    ~JRB2World(); 

    float getFactor(); 
    void setFactor(float f); 
}; 

我的班級實現:

JRB2World::JRB2World(const b2Vec2& gravity) { 

// Constructor for 'JRB2World' must explicitly initialize the base class 'b2World' which does not have a default constructor 
} 

JRB2World::~JRB2World() { 
} 

float JRB2World::getFactor(){ 

    return factor; 
} 

void JRB2World::setFactor(float f){ 

    factor = f; 
} 

我想它必須做一個像「java構造函數」或objc的調用。如何才能做到這一點?

+0

當您沒有在基類(b2World)中的默認構造函數中,您需要顯式地從派生類構造函數的成員初始化列表(JRB2World)調用具有參數的基類構造函數。 – MimiEAM

回答

4

只需將構造成繼承類的初始化列表的構造函數:

JRB2World::JRB2World(const b2Vec2& gravity) : b2World(gravity) { 
} 

取決於你想做的事,我不會用繼承:將Box2D世界放入成員變量中。這應該使它更容易更換,以防萬一它的接口改變了版本,或者你以後決定使用另一個物理引擎。

1

你的基類沒有默認的(沒有參數)構造函數。說它在派生類初始化列表:

JRB2World::JRB2World(const b2Vec2& gravity):b2World(gravity) { 

} 
1

我比較喜歡這個例子的繼承組合。

使用構圖您可以隨時選擇定義您自己的行爲,或者只是暴露您的組成部分。這樣,您就不會面臨繼承層次可能施加的限制(虛擬與非虛擬等)。您可能不需要訪問新類中的所有b2World方法