Почему статические переменные должны быть объявлены дважды в C ++ - PullRequest
7 голосов
/ 06 августа 2011

У меня есть заголовок filepaths.h , который определяет ряд статических переменных:

#ifndef FILEPATHS_H
#define FILEPATHS_H

class FilePaths {

public:

    static QString dataFolder();
    static QString profileFolder();

private:

    static QString dataFolder_;
    static QString profileFolder_;

};

}
#endif // FILEPATHS_H

И у меня есть связанный filepaths.cpp , который изначальноВыглядело это так:

#include "FilePaths.h"

QString FilePaths::dataFolder() {
    return dataFolder_;
}

QString FilePaths::profileFolder() {
    return profileFolder_;
}

Однако это не сработало - я получил ошибку компоновщика «неразрешенная ошибка символа» для всех статических переменных.Поэтому я добавил эти переменные в файл C ++ следующим образом:

#include "FilePaths.h"

QString FilePaths::dataFolder_ = "";
QString FilePaths::profileFolder_ = "";

QString FilePaths::dataFolder() {
    return dataFolder_;
}

QString FilePaths::profileFolder() {
    return profileFolder_;
}

И это работает, однако я не понимаю, почему.

Почему эти статические переменные должны бытьопределяется дважды?Или я не определяю их, а инициализируюНо все же зачем это нужно делать?Или я должен написать свой класс по-другому?

Ответы [ 4 ]

9 голосов
/ 06 августа 2011

Один - определение, другой - декларация.Разница в том, что объявления могут появляться несколько раз, а для переменных, не принадлежащих к классу, возможно, никогда вообще, тогда как определения могут появляться один и только один раз.это то, что вообще не должно быть так, но именно так C ++ совместим с C, который был скомпилирован в 1970-х годах.

2 голосов
/ 06 августа 2011

С http://weblogs.asp.net/whaggard/archive/2004/11/05/252685.aspx:

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

Потому что, как сказал DeadMG, вы можете объявлять переменную много раз, но определяете ее только один раз. Я думаю, что это похоже на прототипы функций: вы можете иметь столько их, сколько хотите, но только один может использовать тело и определять функцию.

0 голосов
/ 06 августа 2011

Это потому, что когда вы когда-либо объявляете класс, вы объявляете структуру для конкретных экземпляров этого класса, НО в случае статических переменных в классе, они могут быть инициализированы перед любым объектомкласс создан.СМ., Нет места, зарезервированного, когда мы объявляем класс в памяти, но пространство, зарезервированное, когда мы объявляем объект класса. Нет, член класса может быть инициирован как int a = 2;но это можно сделать как «static int a = 2;»возможно в объявлении класса зарезервировать для них второе объявление, и должно быть проинформировано об этом

0 голосов
/ 06 августа 2011

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

Норазница с общей переменной экземпляра есть, статическая часть существует только один раз для каждого класса для любого создаваемого вами экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...