повторное определение для статического участника?

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

Так, Вы можете делать это на Win32 с помощью других ответов, но если когда-либо необходимо портировать приложение на среду Unix, Вам не повезет. Мой совет Вам состоит в том, чтобы осуществить рефакторинг Вашу программу, если это возможно, так, чтобы Вам не была нужна ОС, чтобы смочь поддержать открытый ресурс к соединению имени файла.

10
задан Sam Liao 25 August 2009 в 06:59
поделиться

4 ответа

Похоже, вы пытаетесь иметь локальные классы в каждом исходном файле с тем же именем. В C ++ вы можете инкапсулировать локальные классы в анонимное пространство имен:

namespace {
class StaticClass
{
public:

    void    setMemberA(int m)   { a = m;    }   
    int     getMemberA() const  { return a; }

private:
    static  int     a;  

};
int StaticClass::a = 0;
} // close namespace

void first()
{
    StaticClass statc1;
    static1.setMemberA(2);
}
18
ответ дан 3 December 2019 в 15:06
поделиться

Оператор

int StaticClass::a = 0;

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

Что касается вашего замечания, вы, вероятно, путаете два разных использования статическое ключевое слово. В C static используется для обозначения «использовать внутреннюю связь», это означает, что имя переменной или функции не будет видно за пределами единицы трансляции, в которой оно было определено.

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

3
ответ дан 3 December 2019 в 15:06
поделиться

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

int StaticClass::a = 0;

Если у вас есть несколько таких определений, это как если бы у вас было несколько функций, сначала называемых . Они будут конфликтовать, и компоновщик будет жаловаться.

Я думаю, вы ошибаетесь со статическими членами, применяемыми к переменным области имен пространства имен. На уровне пространства имен static задает внутреннюю связь переменной или ссылки. Но на уровне области видимости класса (при применении к члену) он станет статическим членом - членом, который привязан к классу, а не к каждому объекту отдельно. Тогда это больше не имеет ничего общего со значением C для слова «статический».

9
ответ дан 3 December 2019 в 15:06
поделиться

StaticClass требует места для хранения a , статической переменной, которая будет использоваться всеми экземплярами класса - для этого есть две строки, по одной в каждой. файл. Удаление одного исправит ошибку компоновщика.

0
ответ дан 3 December 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: