首先,如果答案显而易见,我想提前道歉;我是C ++的新手,我的第一语言是Java。我也是Stack Overflow的新手,所以如果我的问题出了问题,或者你还需要其他的东西,请告诉我。
因此。我在这里有这段代码:(我使用SFML作为vector和CircleShape)
Ball::Ball() {
// This ugly thing calls the full constructor with a random x and y position
// in such a way the the entire ball is inside the screen.
Ball::Ball((rand() % (WINDOW_X - (2 * BALL_RADIUS))) + BALL_RADIUS, (rand() % (WINDOW_Y - (2 * BALL_RADIUS))) + BALL_RADIUS);
}
Ball::Ball(float x, float y) {
loc.x = x;
loc.y = y;
ball.setPosition(loc.x - BALL_RADIUS, loc.y - BALL_RADIUS);
ball.setRadius(BALL_RADIUS);
ball.setFillColor(sf::Color::Red);
ball.setOutlineColor(sf::Color::Black);
ball.setOutlineThickness(1);
}
这是标题(#include到上面的文件中):
class Ball {
private:
sf::CircleShape ball;
sf::Vector2f loc;
sf::Vector2f vel;
sf::Vector2f acc;
void update();
void bounce();
void draw();
public:
Ball();
Ball(float x, float y);
void run();
};
当我用
创建球时Ball ball;
(是的,所有的SFML渲染内容都有效),它从未显示过。一些调查表明它的loc.x和loc.y变量没有设置,可能也没有球对象的radius,fillcolor等。如果我用中的std :: cout 打印这些值的构造函数,loc.x和loc.y以及所有其他都设置,所以我假设它们得到了在构造函数之后的某处取消设置。奇怪的是,如果我用
创造球Ball ball((rand() % (WINDOW_X - (2 * BALL_RADIUS))) + BALL_RADIUS, (rand() % (WINDOW_Y - (2 * BALL_RADIUS))) + BALL_RADIUS);
甚至
Ball ball(400, 300);
一切都很完美,球出现在屏幕上。 我真的很难过。如果有人能帮助我,那就太好了。
BTW,我使用Xcode 4.5.2运行OS X 10.8,并使用SFML RC2.0,如果这有任何区别。
谢谢,
马特
答案 0 :(得分:6)
在C ++ 11之前,从另一个构造函数(称为委托构造函数)调用构造函数是不可能的。要在C ++ 11中执行此操作,您需要使用成员初始化列表:
Ball::Ball()
: Ball((rand() % (WINDOW_X - (2 * BALL_RADIUS))) + BALL_RADIUS,
(rand() % (WINDOW_Y - (2 * BALL_RADIUS))) + BALL_RADIUS)
{ }
Pre-C ++ 11,您可以创建另一个执行常见工作的函数,并让两个构造函数都可以调用它。
Ball::Ball() {
init((rand() % (WINDOW_X - (2 * BALL_RADIUS))) + BALL_RADIUS,
(rand() % (WINDOW_Y - (2 * BALL_RADIUS))) + BALL_RADIUS);
}
Ball::Ball(float x, float y) {
init(x, y);
}
void Ball::init(float x, float y) {
loc.x = x;
loc.y = y;
ball.setPosition(loc.x - BALL_RADIUS, loc.y - BALL_RADIUS);
ball.setRadius(BALL_RADIUS);
ball.setFillColor(sf::Color::Red);
ball.setOutlineColor(sf::Color::Black);
ball.setOutlineThickness(1);
}
答案 1 :(得分:3)
不允许在C ++中使用构造函数链接,相反,这里将会发生的是,将创建一个临时版本的类,而不是在任何地方分配,然后丢弃。
相反,使用您想要的参数创建一个私有初始化方法,并使用正确的参数从构造函数中调用它。
答案 2 :(得分:3)
C ++ 11之前的C ++不支持构造函数链接
您可以将逻辑转换为函数并从两个构造函数中调用它。类似的东西:
Ball::Ball() {
// This ugly thing calls the full constructor with a random x and y position
// in such a way the the entire ball is inside the screen.
init((rand() % (WINDOW_X - (2 * BALL_RADIUS))) + BALL_RADIUS, (rand() % (WINDOW_Y - (2 * BALL_RADIUS))) + BALL_RADIUS);
}
Ball::Ball(float x, float y) {
init(x,y);
}
Ball::init(float x, float y) {
loc.x = x;
loc.y = y;
ball.setPosition(loc.x - BALL_RADIUS, loc.y - BALL_RADIUS);
ball.setRadius(BALL_RADIUS);
ball.setFillColor(sf::Color::Red);
ball.setOutlineColor(sf::Color::Black);
ball.setOutlineThickness(1);
}
答案 3 :(得分:2)
答案 4 :(得分:1)
我建议你不要进行构造函数链接,而是使用两阶段初始化,这意味着你要创建一个init()
函数,你可以在默认的构造函数中调用它。
答案 5 :(得分:1)
其他答案给出了语法上正确的方法。
我会在语义上做出正确的修改,以便你这样称呼它:
Ball ball = Ball::createRandom();
您将createRandom
实施为static
的{{1}}函数:
Ball
实施为:
class Ball {
public:
//...
static Ball createRandom();
};
答案 6 :(得分:0)
您应该创建一个init()方法并在两个构造函数中调用它。
Ball::Ball((rand() % (WINDOW_X - (2 * BALL_RADIUS))) + BALL_RADIUS, (rand() % (WINDOW_Y - (2 * BALL_RADIUS))) + BALL_RADIUS);
创建一个临时球对象并立即销毁它