Почему определение нескольких переменных в разных исходных файлах является проблемой, но определение нескольких классов в разных источниках не является - PullRequest
0 голосов
/ 26 апреля 2020

В настоящее время я изучаю C ++ (точнее C ++ 03) в универе, и я столкнулся с инициализацией членов stati c. Непостоянные члены stati c должны быть объявлены внутри класса, но определены снаружи. Более того, они также должны быть объявлены в исходных файлах, а не в заголовочных файлах. Насколько я понимаю, это потому, что если у вас есть заголовок myClass.h с классом myClass и A. cpp и B. cpp, которые включают его, то вы можете защитить себя от множественного определения внутри того же исходного файла с включенными охранниками, но вы не можете защитить от myClass.h присутствует один раз в A. cpp и один раз в B. cpp. Если вы определите элемент stati c внутри myClass.h , но вне myClass , то после предварительной обработки вы скопируете определение одной и той же вещи в глобальную область видимости. A. cpp и B. cpp. Компоновщик «увидит» глобальную область действия B. cpp изнутри A. cpp и наоборот, поэтому у вас будет несколько определений, доступных в данном контексте, что это проблема.

Итак, мой вопрос: если это проблема, то как получается определение класса myClass в глобальном масштабе A. cpp и B. cpp не один?

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вы ошиблись в некоторых понятиях, что нормально и случается со всеми. Видите ли, нет строгого и быстрого правила, согласно которому определения нестатических c методов должны быть написаны внутри класса. Прекрасно даже писать их вне класса, с той разницей, что вы сможете маскировать их определения, если хотите, так как файлы заголовков должны быть представлены в виде открытого текста. В отличие от этого, если вы не записываете функции в файл .cpp, вы не можете создать библиотеку и предоставить библиотеку, по сути маскируя определения. Кроме того, обычно рекомендуется делать это первым способом, чтобы размер класса в открытом тексте становился небольшим, и абстракция была лучше достигнута. Кроме того, прочитайте , как задать хороший вопрос о переполнении стека .

RE: Если вы определите член stati c внутри myClass.h, но вне myClass, то после В предварительном процессе вы скопируете определение одной и той же вещи в глобальную область A. cpp и B. cpp Пожалуйста, прочитайте шаблонный код

Надеюсь, это поможет. :) А если ты ничего не понимаешь, я всегда открыт для дискуссий; не стесняйтесь спрашивать

1 голос
/ 26 апреля 2020

Нет, вы не правильно поняли причины. static переменные, которые не constexpr, должны быть инициализированы только один раз, как это происходит во время выполнения. Что-то действительно не так, если одна и та же переменная инициализируется дважды во время выполнения ... Таким образом, они должны быть инициализированы в. cpp, чтобы компилятор / компоновщик знал, какая библиотека его переносит.

Определения для классов, с другой стороны, это определения времени компиляции, поэтому компоновщик отбрасывает все дубликаты. (Это на самом деле очень плохо и приводит к плохим временам компиляции, а иногда и к проблемам ODR. Модули C ++ 20 были разработаны для решения этих проблем.).

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