什么是抛出静态或const的错误?

时间:2014-10-23 14:45:50

标签: c++ class object static const

以下代码抛出错误消息,我无法弄清楚问题是什么 - 是static还是const?我究竟做错了什么?

#include <iostream>
using namespace std;

class SampleClass
{
private:

    int value;
    static int counter;

public:

    SampleClass(int i)
    {
        value = i; 
        counter++;
    }

    static int countSomeClass() const
    {
        return counter;
    }

    void showValue()
    {
        cout << value << endl;
    }

};

int main()
{
    SampleClass test(50);
    test.showValue();
    test.countSomeClass();
    return 0;
}

错误讯息:

  

main.cpp:16:35:错误:静态成员函数static int SampleClass :: countSomeClass()不能有cv-qualifier
     static int countSomeClass()const

4 个答案:

答案 0 :(得分:23)

static方法无法标记为const:因为它不能在某个实例上运行,所以指定它无法修改它是没有意义的。

(您可能会争辩说,对于static方法,它可能会引用static方法,这些方法无法修改与该类关联的static数据;但是,无论如何这都没有用,因为您不能拥有const类或形成const指针或类的引用,因为在C ++类中不是对象)

答案 1 :(得分:13)

正如错误消息所示,静态成员函数不能具有 cv-qualifier - 即constvolatile限定符。此类限定符适用于非静态成员中的this;它们对没有this的静态成员毫无意义。

您希望函数是静态的,因为它不依赖于任何实例;所以删除const

答案 2 :(得分:12)

static函数不能是const(cv-qualified),反之亦然。这是问题的两个组合

来自C ++规范§9.4.1/ 2(强调我的)

  

[注意:static成员函数没有this指针(9.3.2)。 -end note] static成员函数不应为virtual。不应该有static和具有相同名称和相同参数类型的非静态成员函数(13.1)。 static成员函数不得声明为constvolatileconst volatile

static函数没有this访问权限,因为它与对象的特定实例无关。不需要应用const,这是没有意义的 - 没有对象的实例可以应用const。以类似的方式,自由函数不能是const(或 cv-qualified )。

如果您希望该功能与某个对象相关联,请移除static,如果您希望static从您的示例中删除const - ,请删除const

再说一遍;您的counter已声明但未定义(在课堂外)。它需要在其中一个翻译单元(cpp文件)中使用int SampleClass::counter = 0;之类的内容。

答案 3 :(得分:5)

这与两者都有关系。

  • static成员函数不适用于其所属类的实例
  • 成员函数签名末尾的const关键字表示此成员函数不会修改调用它的实例

因此,在同一个成员函数声明中都没有意义(因此无效)。