У меня есть класс C ++, который объявляет один статический член. Весь класс содержится в заголовочном файле, и я бы предпочел не создавать файл .cpp просто для того, чтобы содержать определение статического члена. Я пытался использовать статическое ключевое слово (в смысле C) и анонимные пространства имен, оба из которых должны давать переменную, объявленную в статической связи заголовочного файла (asfaik), но ни один из подходов не работает, может кто-нибудь дать мне решение этой проблемы проблема?
struct ServiceType {} ;
struct Transport
{
static ServiceType service ;
};
//error: definition of ‘Transport::service’ is not in namespace enclosing ‘Transport’
//namespace { ServiceType Transport::service ; }
//error: ‘static’ may not be used when defining a static data member
//static ServiceType Transport::service ;
Если целью является просто не создавать .cpp
файл,
простейшим решением, вероятно, будет обернуть статические данные
член встроенной статической функции-члена. Другими словами,
что-то вроде:
struct Transport
{
static ServiceType& service()
{
static ServiceType theData;
return theData;
}
};
Конечно, вам придется использовать синтаксис service()
, скорее
чем просто service
, чтобы получить к нему доступ.
Вы не можете определить статический член с внутренней связью.
Если вы определите статический член service
в заголовочном файле у вас будут экземпляры в каждом источнике, куда вы включаете этот заголовочный файл. Если это не проблема, вы можете обернуть анонимное пространство имен вокруг всего struct Transport
namespace {
struct Transport
{
static ServiceType service ;
};
ServiceType Transport::service;
}
Анонимные пространства имен видны во всем модуле компиляции. Если вы включите заголовок в несколько исходных файлов, вы получите несколько символов с именем Transport :: service. Это не работает, так как вы получите symbol already defined
ошибка от компоновщика.
Боюсь, что работа C ++ не позволяет вам сойти с рук, не меняя определения service
символ в .cpp
файл.
Итак, в .cpp
файл, либо сделать Transport::ServiceType service;
или если ты не хочешь service
быть частью пространства имен сделать extern ServiceType service;
в шапке и ServiceType service;
в .cpp
,
Пытаться
ServiceType Transport::service ;
Это не верно:
namespace { ServiceType Transport::service ; } //You are adding it in an unnamed namespace, rather than whatever namespace Transport is actually in - presumably the global namespace
это не верно:
static ServiceType Transport::service ; // You dont need the static here, only in the struct.
Я ожидаю, что вы получите ошибки компоновщика, если вы настаиваете на том, чтобы это было в заголовке, хотя