首页 > 解决方案 > 错误:不能在没有对象的情况下调用成员函数 'sf::Time sf::Clock::getElapsedTime() const'

问题描述

 void update(bool moright, bool moleft)
    {
        Clock Clock();
        if (moright == true){
            xvel = 5;
            }
        if (moleft == true){
            xvel = -5;
        }
        if (!(moright || moleft)){
            xvel = 0;
        }
        sf::Time t1 = seconds(0.1f);
        Time time1 = Clock::getElapsedTime() // error 1 here
        while (time1 << 0.16666666);
            time1 = clock::getElapsedTime(); // error 2 here
    }

返回:错误:无法在没有对象的情况下调用成员函数 'sf::Time sf::Clock::getElapsedTime() const' 并且:错误:'clock' 不是类、命名空间或枚举 对 sfml 和 c++ 来说是新的,因此很抱歉,如果这是一个愚蠢的问题。

标签: c++sfml

解决方案


Clock Clock();

让我们将您的sf::Clock实例称为与该类名不同的名称,例如clock. 虽然这不是错误,但它可能会令人困惑。

Clock clock();

另外,请注意,这一行对于编译器来说可能是模棱两可的,因为它看起来像一个名为 的函数原型clock,它不带参数并返回一个sf::Clock实例。只需删除括号。

Clock clock;

sf::Time t1 = seconds(0.1f);

t1没有在这个功能中使用,可以删除。


Time time1 = Clock::getElapsedTime()

这一行试图调用静态函数 getElapsedTime。该类sf::Clock没有像这样命名的静态函数,只有一个成员函数。此调用以及while循环之后的调用是您描述的编译器错误的原因。

Time time1 = Clock.getElapsedTime()

它仍然不好。注意行尾的缺失;

Time time1 = Clock.getElapsedTime();

while (time1 << 0.16666666);

您在<<这里使用了运算符,即“按位左移”运算符。您的意思是“小于”运算符 ( <),但是因为您想检查是否经过了特定的时间量,您应该使用“大于”运算符 ( >)。

while (time1 > 0.16666666);

但这仍然行不通,因为time1它是一个sf::Time瞬间,您无法将 ansf::Time与浮点数进行比较。您必须调用 的asSeconds成员time1,它将以秒为单位的经过时间作为浮点数返回。

while (time1.asSeconds() > 0.16666666);

更重要的是,你;在行尾放了 a,这意味着while循环有一个空的主体,它将永远运行(如果time1不大于0.16666666)。您必须删除最后的分号,如果循环,您的下一行将成为正文。

while (time1.asSeconds() > 0.16666666)

time1 = clock::getElapsedTime();

此行将 的值替换为time1的结果getElapsedTime。您的意思是经过的时间添加到 中time1,您可以通过替换=为来实现+=

time1 += Clock::getElapsedTime();

上面的行仍然包含另外两个错误。和以前一样,sf::Clock没有一个名为 的静态函数,并且在您的代码中不存在getElapsedTimeplus (只是带有一个大写字母)。clockClockC

time1 += Clock.getElapsedTime();

我在这里假设您想通过此while循环等待特定的时间过去。为此,您可以使用该sf::sleep功能。

sf::sleep(sf::seconds(0.16666666f));

推荐阅读