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

SlE*_*Es5 5 c++ xcode constructor

首先,如果答案显而易见,我想提前道歉; 我是C++的新手,我的第一语言是Java.我也是Stack Overflow的新手,所以如果我的问题有问题或者您需要其他任何内容,请告诉我.

所以.我在这里有这段代码:(我使用SFML作为向量和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);

}
Run Code Online (Sandbox Code Playgroud)

这是标题(#included到上面的文件中):

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();

};
Run Code Online (Sandbox Code Playgroud)

当我用球创造球时

Ball ball;
Run Code Online (Sandbox Code Playgroud)

(是的,所有的SFML渲染内容都有效),它从未显示过.一些调查表明它的loc.x和loc.y变量没有设置,可能也没有球对象的radius,fillcolor等.如果我打印的这些值与性病::法院内部构造,loc.x和loc.y和所有其它设置,所以我认为他们的构造后拿到的地方未设置.奇怪的是,如果我用球创造球

Ball ball((rand() % (WINDOW_X - (2 * BALL_RADIUS))) + BALL_RADIUS, (rand() % (WINDOW_Y - (2 * BALL_RADIUS))) + BALL_RADIUS);
Run Code Online (Sandbox Code Playgroud)

甚至

Ball ball(400, 300);
Run Code Online (Sandbox Code Playgroud)

一切都很完美,球出现在屏幕上.我真的很难过.如果有人能帮助我,那就太好了.

顺便说一下,我使用Xcode 4.5.2运行OS X 10.8,并使用SFML RC2.0,如果这有任何区别.

谢谢,

马特

Jos*_*eld 6

在C++ 11之前,从另一个构造函数(称为委托构造函数)调用构造函数是不可能的.要在C++ 11中执行此操作,您需要使用成员初始化列表:

Ball::Ball()
 : Ball((rand() % (WINDOW_X - (2 * BALL_RADIUS))) + BALL_RADIUS,
        (rand() % (WINDOW_Y - (2 * BALL_RADIUS))) + BALL_RADIUS)
{ }
Run Code Online (Sandbox Code Playgroud)

在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);
}
Run Code Online (Sandbox Code Playgroud)


Roe*_*rel 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);

}
Run Code Online (Sandbox Code Playgroud)