2012-11-16 60 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方法