生成类的实例时出错

Error when making an instance of a class

本文关键字:出错 实例      更新时间:2023-10-16

我现在正在测试sfml中的碰撞。但是,我在运行程序时遇到了一个错误。

这是我的代码编辑:新代码

主要.cpp

#include "Collision.h"
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
using namespace std;
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML TEST");
window.setFramerateLimit(30);
sf::RectangleShape rectangle(sf::Vector2f(50, 120));
rectangle.setPosition(300, 300);
sf::View view;
view.setCenter(sf::Vector2f(300, 300));
view.setSize(sf::Vector2f(250, 250));
int moveRight = 0;
int posX;
int posY;
Collision ct();
while(window.isOpen())
{
    sf::Event event;
    while(window.pollEvent(event))
    {
        if(event.type == sf::Event::Closed)
            window.close();
    }
    //movement just right for this instance
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    {
        moveRight = 3;
        for(moveRight; moveRight > 0; moveRight--)
        {
            rectangle.move(1, 0);
            posX = rectangle.getPosition().x;
            posY = rectangle.getPosition().y;
            if(ct.throneRoom(posX, posY) == true)
            {
                rectangle.move(1, 0);
                moveRight = 0;
            }
            else
            {
                view.move(1, 0);
            }
        }
    }
    window.setView(view);
    window.clear();
    window.draw(rectangle);
    window.display();
}
}

碰撞.h

#ifndef COLLISION_H
#define COLLISION_H

class Collision
{
    public:
        Collision();
        bool throneRoom(int xPos, int yPos);
    protected:
    private:
};
#endif // COLLISION_H

冲突.cpp

#include "Collision.h"
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
using namespace std;

Collision::Collision()
{
}
bool Collision::throneRoom(int xPos, int yPos)
{
    if(xPos > 500)
        return true;
    else
        return false;
}

我得到的错误是:

warning: error: request for member 'throneRoom' in 'ct', which is of non-class type 'Collision()'

仍然不知道发生了什么。

我敢打赌,您将collisiontest声明为:

Collision collisiontest(); 

如果是这样,那就是一个函数声明——一个原型,它说collisiontest是一个没有返回Collision对象的参数的函数。这就是消息中"类型为Collision()"的意思。Collision()是返回Collision对象的函数的类型名称,而Collision.throneRoom(…)正试图将函数名称视为类类型的对象。

如果是这种情况,那么只需删除括号:

Collision collisiontest; 

在出现下一个错误之前一切都会好起来的。:^)

错误消息听起来好像您已经声明了collisiontest"对象"(不幸的是,您发布的代码没有显示collisiontest是如何声明的):

Collision collisiontest();

然而,这并不是定义一个对象,而是声明一个不带参数并返回Collision对象的函数(它被称为Most Vexing Parse,当Nicolai Josuttis第一次提出它时,它让很多C++委员会成员感到困惑)。你可能只需要删除括号:

Collision collisiontest;

这仍然会调用默认构造函数。