Я изучал Box2D и C ++, и мне удалось создать простую симуляцию на испытательном стенде, теперь я пытаюсь вывести симуляцию из испытательного стенда и интегрировать его с оболочкой SDL.

Однако класс, который раньше работал на стенде, теперь генерирует ошибки, когда я пытаюсь создать его экземпляр, и я немного смущен тем, почему он отлично работал на стенде, но теперь выдает ошибки преобразования переменных.

Это мой класс:

    class Ball {
    public:
        bool m_contacting;
        b2Body* m_body;
        float m_radius;

    public:
        // Ball class constructor
        Ball(b2World* world, float radius) {
        m_contacting = false;
        m_body = NULL;
        m_radius = radius;

        //set up dynamic body, store in class variable
        b2BodyDef myBodyDef;
        myBodyDef.type = b2_dynamicBody;
        myBodyDef.position.Set(0, 20);
        m_body = world->CreateBody(&myBodyDef);

        //add circle fixture
        b2CircleShape circleShape;
        circleShape.m_p.Set(0, 0);
        circleShape.m_radius = m_radius; //use class variable
        b2FixtureDef myFixtureDef;
        myFixtureDef.shape = &circleShape;
        myFixtureDef.density = 1;
        myFixtureDef.restitution = 0.83f;
        m_body->CreateFixture(&myFixtureDef);
        m_body->SetUserData( this );
        m_body->SetGravityScale(5);//cancel gravity (use -1 to reverse gravity, etc)
        }
    ~Ball(){}
    };

Вот моя программа:

//FooTest class member variable
std::vector<Ball*> balls;

b2Body* body;

int main (int argc, char* argv[]) {
    // Define the gravity vector.
    b2Vec2 gravity(0.0f, -10.0f);

    // Construct a world object, which will hold and simulate the rigid bodies.
    b2World world(gravity);

    //add ball entity to scene in constructor
    Ball* ball = new Ball(world, 1);        // Fails here
    balls.push_back(ball);

    // Prepare for simulation. Typically we use a time step of 1/60 of a
    // second (60Hz) and 10 iterations. This provides a high quality simulation
    // in most game scenarios.
    float32 timeStep = 1.0f / 60.0f;
    int32 velocityIterations = 6;
    int32 positionIterations = 2;

    // This is our little game loop.
    for (int32 i = 0; i < 60; ++i)
    {
        // Instruct the world to perform a single step of simulation.
        // It is generally best to keep the time step and iterations fixed.
        world.Step(timeStep, velocityIterations, positionIterations);

        // Now print the position and angle of the body.
        b2Vec2 position = body->GetPosition();
        float32 angle = body->GetAngle();

        printf("%4.2f %4.2f %4.2f\n", position.x, position.y, angle);
    }

    // When the world destructor is called, all bodies and joints are freed. This can
    // create orphaned pointers, so be careful about your world management.

    return 0;

}

Это сгенерированная ошибка:

C:\Users\Chris\My Programs\_C++\Keepie Uppie\main.cpp||In function 'int main(int, char**)':|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\main.cpp|20|error: no matching function for call to 'Ball::Ball(b2World&, int)'|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\main.cpp|20|note: candidates are:|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\objects.h|15|note: Ball::Ball(b2World*, float)|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\objects.h|15|note:   no known conversion for argument 1 from 'b2World' to 'b2World*'|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\objects.h|7|note: Ball::Ball(const Ball&)|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\objects.h|7|note:   candidate expects 1 argument, 2 provided|

Если я назову конструктор вот так

Ball* ball = new Ball(&world, 1);

Я получаю следующие ошибки

obj\Debug\main.o||In function `main':|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\main.cpp|17|undefined reference to `b2World::b2World(b2Vec2 const&)'|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\main.cpp|35|undefined reference to `b2World::Step(float, int, int)'|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\main.cpp|47|undefined reference to `b2World::~b2World()'|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\main.cpp|47|undefined reference to `b2World::~b2World()'|
obj\Debug\main.o||In function `ZN13b2CircleShapeC1Ev':|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\Box2D\Collision\Shapes\b2CircleShape.h|65|undefined reference to `vtable for b2CircleShape'|
obj\Debug\main.o||In function `ZN4BallC1EP7b2Worldf':|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\objects.h|24|undefined reference to `b2World::CreateBody(b2BodyDef const*)'|
C:\Users\Chris\My Programs\_C++\Keepie Uppie\objects.h|34|undefined reference to `b2Body::CreateFixture(b2FixtureDef const*)'|
obj\Debug\main.o||In function `ZN13b2CircleShapeD1Ev':|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\Box2D\Collision\Shapes\b2CircleShape.h|25|undefined reference to `vtable for b2CircleShape'|
||=== Build finished: 8 errors, 0 warnings (0 minutes, 2 seconds) ===|
0
Funk247 6 Мар 2014 в 14:12
Вы передаете ссылку на world. Похоже, ваш конструктор ожидает &world
 – 
WhozCraig
6 Мар 2014 в 14:19

2 ответа

Лучший ответ

В линии

Ball* ball = new Ball(world, 1);

Вы используете конструктор Ball, которого не существует, поскольку доступны только Ball(b2World* world, float radius) и конструктор копирования. Если вы хотите использовать объявленный конструктор, вам нужно передать указатель на world:

Ball* ball = new Ball(&world, 1);
2
Wojtek Surowka 6 Мар 2014 в 14:20

Вы объявили конструктор со следующими параметрами

Ball(b2World* world, float radius);

Это первый параметр pointer to 2World. Однако вы вызываете его, используя ссылку на 2World вместо указателя

b2World world(gravity);

//add ball entity to scene in constructor
Ball* ball = new Ball(world, 1);        

World не является указателем на b2World. Итак, это заявление

Ball* ball = new Ball(world, 1);

Является недействительным.

Может ты имел в виду

Ball* ball = new Ball( &world, 1 );
1
Vlad from Moscow 6 Мар 2014 в 14:20
Хм, если я использую new Ball (&world,1);, я получаю много ошибок неопределенных ссылок: 'obj\Debug\main.o||In function main':| C:\Users\Chris\My Programs\_C++\Keepie Uppie\main.cpp|17|undefined reference to b2World::b2World(b2Vec2 const&)'| C:\Users\Chris\My Programs_C++\Keepie Uppie\main.cpp|35|неопределенная ссылка на b2World::Step(float, int, int)'| C:\Users\Chris\My Programs\_C++\Keepie Uppie\main.cpp|47|undefined reference to b2World::~b2World()'| '
 – 
Funk247
6 Мар 2014 в 14:29
Где вы видите, что я советую писать оператор new Ball (&world,1); ?
 – 
Vlad from Moscow
6 Мар 2014 в 14:32
Последняя строка вашего исходного сообщения, я изменил свой код, чтобы отразить это, но разместил только последние символы. Извините, я был ленив.
 – 
Funk247
6 Мар 2014 в 14:34
Ах, вы были правы, это решило мою проблему, теперь мой класс генерирует ошибки! Спасибо за помощь.
 – 
Funk247
6 Мар 2014 в 14:48