【问题标题】:C++ initialization of non constant static member variable?非常量静态成员变量的C ++初始化?
【发布时间】:2011-10-06 19:17:31
【问题描述】:

我收到成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非 const 静态成员的类内初始化”。 这是主类:

#include <iostream>
#include "Tree.h"
using namespace std;

int main()
{
    Tree oak;
    Tree elm;
    Tree pine;

    cout << "**********\noak: " << oak.getObjectCount()<< endl;
    cout << "**********\nelm: " << elm.getObjectCount()<< endl;
    cout << "**********\npine: " << pine.getObjectCount()<< endl;
}

这是包含非常量静态 objectCount 的树类:

#ifndef TREE_H_INCLUDED
#define TREE_H_INCLUDED

class Tree
{
    private:
        static int objectCount;
    public:
        Tree()
        {
            objectCount++;
        }
        int getObjectCount() const
        {
            return objectCount;
        }
    int Tree::objectCount = 0;
}
#endif // TREE_H_INCLUDED

【问题讨论】:

  • 在撰写本文时,任何建议的答案中都没有提到另一种选择,它允许您将所有内容保留在一个单个标题中。请参阅this SO answer 中的示例,它完美地映射到您的示例。

标签: c++ static constants


【解决方案1】:

您必须在包含此标头的源文件中定义静态变量。

#include "Tree.h"

int Tree::objectCount = 0;  // This definition should not be in the header file.
                            // Definition resides in another source file.
                            // In this case it is main.cpp 

【讨论】:

  • 还有以下错误'objectCount的声明中有两种或多种数据类型'
  • 我忘了把这一行 int Tree::objectCount = 0; 放在课外,我忘了用分号结束标题类谢谢
  • 为什么这个变量必须在类外声明?我正在尝试定义和初始化一个私有变量,我得到了同样的错误。我如何在课外做到这一点?
  • @DavidFaux 显示你想做什么。只能在类中初始化静态 const 整数数据成员。
【解决方案2】:
int Tree::objectCount = 0;

上面一行应该在类之外,在.cpp文件中,如下图:

//Tree.cpp 
#include "Tree.h"

int Tree::objectCount = 0;

【讨论】:

    【解决方案3】:

    您需要在单个 C++ 文件的范围之外定义它,而不是在标题中。

    int Tree::objectCount = 0;
    int main()
    {
        Tree oak;
        Tree elm;
        Tree pine;
    
        cout << "**********\noak: " << oak.getObjectCount()<< endl;
        cout << "**********\nelm: " << elm.getObjectCount()<< endl;
        cout << "**********\npine: " << pine.getObjectCount()<< endl;
    }
    
    #ifndef TREE_H_INCLUDED
    #define TREE_H_INCLUDED
    
    class Tree
    {
        private:
            static int objectCount;
        public:
            Tree()
            {
                objectCount++;
            }
            int getObjectCount() const
            {
                return objectCount;
            }
    }
    #endif // TREE_H_INCLUDED
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多