Помещение определения статических членов класса в файл cpp - техническое ограничение? - PullRequest
3 голосов
/ 05 августа 2010

одна из моих «любимых» неприятностей, когда кодирование на C ++ объявляет некоторую статическую переменную в моем классе, а затем смотрит на ошибку компиляции по поводу неразрешенной статической переменной (в прежние времена я всегда был чертовски напуган, что это значит) 1001 *

Я имею в виду классический пример:

test.h

class Test
{
private:
  static int m_staticVar;
  int m_var;
}

test.cpp

int Test::m_staticVar;

Что делает его на мой взгляд еще более запутанным, так это синтаксис этого определения, вы не можете использовать слово «static» здесь (поскольку static имеет другое значение при использовании в cpp, sigh), поэтому вы понятия не имеете (кроме статические члены-знания (например, работают так)) почему на самом деле определен некоторый тип int из класса Test и почему m_var - нет.

Насколько вам известно / почему это так? Я могу придумать только одну причину, и это облегчает жизнь компоновщика - то есть по той же причине, по которой вы не можете использовать нецелые константы (SomeClass m_var = кое-что). Но мне не нравится идея сгибать языковые возможности только потому, что какой-то части цепочки компиляции будет трудно ее съесть ...

Ответы [ 2 ]

6 голосов
/ 05 августа 2010

Ну, так оно и есть.Вы только что объявили статический член в файле .h.Компоновщик должен быть в состоянии найти ровно одно определение этого статического члена в объектных файлах, которые он связывает вместе.Вы не можете поместить определение в файл .h, который будет генерировать несколько определений.

ОБНОВЛЕНИЕ: C ++ 17 может решить эту проблему с помощью встроенной переменной .

1 голос
/ 05 августа 2010

Во-первых, с точки зрения компилятора, это вполне разумно.Зачем избыточное ключевое слово там, где оно не нужно?

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

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

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