Можно ли поместить не (статические константно-интегральные) типы в файл C ++ Header.h - PullRequest
2 голосов
/ 24 мая 2011

У меня есть класс в файле MyClass.h:

// MyClass.h
#ifndef __MY_CLASS_H__
#define __MY_CLASS_H__

#include <string>

class MyClass
{
    static const std::string MyStaticConstString; // I cannot initialize it here, because it's not an integral type.
};

// OK, let's define/initialize it out side of the class declaration
// static
const std::string MyClass::MyStaticConstString = "Value of MyStaticConstString";

#endif

Проблема в том, что компилятор будет жаловаться на "Multiple Definition", если этот файл включен более одного раза.

Поэтому мне нужно переместить определение MyStaticConstString в файл MyClass.cpp.Но что, если MyClass является частью библиотеки, и я хочу, чтобы мои пользователи увидели статическое значение const в файле MyClass.h, что имеет смысл, потому что это статическое значение const.

Как следуетделать?Надеюсь, я ясно дал понять.

Спасибо.

Питер

Ответы [ 3 ]

1 голос
/ 24 мая 2011

Две проблемы:

  • Такие имена, как __MY_CLASS_H__, не могут быть созданы такими людьми, как вы или я.

  • std :: строки не являются целочисленными типами

1 голос
/ 24 мая 2011

номер

Что делать?

Сделайте это в шапке:

//myclass.h

 // MyClass.h
 #ifndef MY_CLASS_H
 #define MY_CLASS_H

class MyClass
{
    static const std::string MyStaticConstString; // I cannot initialize it here, because it's not an integral type.
};

extern std::string some_global_variable; //declare this with extern keyword

 #endif //MY_CLASS_H

И сделать это в исходном файле:

//myclass.cpp
#include "myclass.h"

const std::string MyClass::MyStaticConstString = "Value of MyStaticConstString";

std::string some_global_variable = "initialization";

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

1 голос
/ 24 мая 2011

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

Кроме того, не добавляйте ваши идентификаторы с подчеркиванием (__MY_CLASS_H__), они зарезервированы для элементов реализации.

...