Объявление статического члена со статической связью

У меня есть класс 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 ;

3

Решение

Если целью является просто не создавать .cpp файл,
простейшим решением, вероятно, будет обернуть статические данные
член встроенной статической функции-члена. Другими словами,
что-то вроде:

struct Transport
{
static ServiceType& service()
{
static ServiceType theData;
return theData;
}
};

Конечно, вам придется использовать синтаксис service(), скорее
чем просто service, чтобы получить к нему доступ.

4

Другие решения

Вы не можете определить статический член с внутренней связью.

Если вы определите статический член service в заголовочном файле у вас будут экземпляры в каждом источнике, куда вы включаете этот заголовочный файл. Если это не проблема, вы можете обернуть анонимное пространство имен вокруг всего struct Transport

namespace {
struct Transport
{
static ServiceType service ;
};

ServiceType Transport::service;
}
1

Анонимные пространства имен видны во всем модуле компиляции. Если вы включите заголовок в несколько исходных файлов, вы получите несколько символов с именем Transport :: service. Это не работает, так как вы получите symbol already defined ошибка от компоновщика.

Боюсь, что работа C ++ не позволяет вам сойти с рук, не меняя определения service символ в .cpp файл.

Итак, в .cpp файл, либо сделать Transport::ServiceType service; или если ты не хочешь service быть частью пространства имен сделать extern ServiceType service; в шапке и ServiceType service; в .cpp,

0

Пытаться

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.

Я ожидаю, что вы получите ошибки компоновщика, если вы настаиваете на том, чтобы это было в заголовке, хотя

0
По вопросам рекламы [email protected]