C ++ инициализация непостоянной статической переменной-члена? - PullRequest
8 голосов
/ 16 июля 2011

Я получил ошибку квалификации переменной-члена objectCount. Компилятор также возвращает «ISO C ++ запрещает инициализацию в классе неконстантного статического члена». Это основной класс:

#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

Ответы [ 3 ]

16 голосов
/ 16 июля 2011

Вы должны определить статическую переменную в исходном файле, который включает этот заголовок.

#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 
4 голосов
/ 16 июля 2011
int Tree::objectCount = 0;

Приведенная выше строка должна быть вне класса и в файле .cpp, как показано ниже:

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

int Tree::objectCount = 0;
3 голосов
/ 16 июля 2011

Вам необходимо определить его вне области действия в одном файле 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...