В C ++ я хотел бы определить некоторые строки, которые будут использоваться внутри класса, но значения будут общими для всех экземпляров. В C я бы использовал #define s. Вот попытка:

#include <string>
class AskBase {
public:
    AskBase(){}
private:
    static std::string const c_REQ_ROOT = "^Z";
    static std::string const c_REQ_PREVIOUS = "^";
    static std::string const c_REQ_VERSION = "?v";
    static std::string const c_REQ_HELP = "?";
    static std::string const c_HELP_MSG = "  ? - Help\n ?v - Version\n ^^ - Root\n  ^ - Previous\n ^Z - Exit";
};
int main(){AskBase a,b;}

Если нужен C ++ 0x, это приемлемо.

2
CW Holeman II 8 Июн 2009 в 02:02

4 ответа

Лучший ответ

Вам нужно будет определить их отдельно в одной единице перевода (исходном файле), например:

//header
class SomeClass
{
  static const std::string someString;
};

//source
const std::string SomeClass::someString = "value";

Я считаю, что новый стандарт C ++ 1x исправит это, хотя я не совсем уверен.

10
coppro 7 Июн 2009 в 22:04

Согласно статье Википедии, это должно поддерживаться в C++0x однако я не могу найти ссылку в Состояние развития C ++.

0
Motti 8 Июн 2009 в 08:34

Я бы никогда не использовал эту конструкцию.
Если кто-то из разработчиков реорганизует код и начинает писать:

   // header
   class StringBug
   {
        static const std::string partOfTheString;
        static const std::string wholeString;
   };

   // source
   const std::string StringBug::partOfTheString = "Begin ";
   const std::string StringBug::wholeString = partOfTheString + "and the rest";

Вам очень сложно найти ошибку в программе, потому что нет гарантии, что partOfTheString инициализируется до того, как она будет использована для создания WholeString;

Если я хочу создать общую строку класса, я делаю это так:

// header
class StringBug
{
    static const std::string& partOfTheString() {
       static const std::string sPartOfTheString("Begin ");
       return sPartOfTheString;      
    }

    static const std::string& wholeString() {
       static const std::string sWholeString( partOfTheString() + "and the rest");
       return sWholeString;
    }
};
0
TimW 8 Июн 2009 в 07:52

Когда мне нужны строковые константы внутри класса, я никогда не помещаю их в сам класс, но либо:

1) Если они должны быть представлены в заголовке, я помещаю их вне класса (в соответствующем пространстве имен), например:

const char * const c_REQ_ROOT = "^Z";
...

2) Если нет, я помещаю их в файл cpp в анонимное пространство имен.

Затем вы можете даже сгруппировать строки-константы из нескольких связанных компонентов в одном файле заголовка.

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

Мне очень интересно мнение других программистов, так что не стесняйтесь оставлять свои комментарии.

2
Jem 8 Июн 2009 в 08:35