默认构造函数的奇怪错误(C ++)

时间:2013-02-20 12:52:35

标签: c++ xcode constructor

首先,如果答案显而易见,我想提前道歉;我是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,如果这有任何区别。

谢谢,

马特

7 个答案:

答案 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)

C ++不支持构造函数链接,除非您使用的是C ++ 11,我认为您不是。

详细了解这个答案:

LINK

答案 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);

创建一个临时球对象并立即销毁它