Что такое хорошая идея для списка строк? - PullRequest
1 голос
/ 09 июня 2010

Я просто хочу построить RPG и сделать ее максимально аккуратной, я хочу определить кучу строк, которые я, возможно, захочу отредактировать позже, поэтому я попробовал что-то вроде этого:

enum { MSG_INIT = "Welcome to ...", MSG_FOO = "bar" };

Но я просто получаю ошибки, например, MSG_INIT не является целым числом! Почему это не должна быть строка, для чего нужны только перечисления?

Какой, по вашему мнению, лучший способ определить кучу строк? В структуре называется MSG или что-то? Я новичок во всем этом, поэтому я очень ценю маленькие примеры.

Ответы [ 7 ]

14 голосов
/ 09 июня 2010

Многие RPG хранят сообщения не в исходном файле C ++, а в текстовом файле, что-то вроде этого:

1, Welcome...
2, The $obj cannot be moved.
3, Score is %d

Они загружаются во время выполнения, а не компилируются во время компиляции, а затем доступны по их цифровому ключу, преимущество в том, что вы можете изменять сообщения без необходимости перекомпиляции игрового движка. Если вам нужна такая структура, то вы, вероятно, хотите, чтобы что-то вроде std::map<int,std::string> содержало сообщения после загрузки.

6 голосов
/ 09 июня 2010

Если вы хотите, чтобы они были сгруппированы, используйте пространство имен.

namespace Messages 
{
    const string INIT = "Welcome to ...";
    const string BLAH = "Whiii!";
};
1 голос
/ 09 июня 2010

Если вы хотите напрямую включить строки в программное обеспечение, вы можете использовать ключевое слово extern:

// someHeader.h
namespace messages
{
  extern const std::string WelcomeOnBoard;                // declaration
}

// someHeader.cpp
#include "myproject/someHeader.h"

namespace messages
{
  const std::string WelcomeOnBoard = "Welcome on Board!"; // definition
}

Основное преимущество пространств имен заключается в том, что вы можете разбивать свои сообщения на разные файлы., чтобы сгруппировать их в зависимости от какой-либо зоны и т. д.

Однако обычно вы так не делаете.

При кодировании строк в программном обеспечении возникают проблемы обслуживания и интернационализации.

  • Вы хотите удалить запятую или исправить ошибку?Перекомпилируйте
  • Вы хотите перевести игру на Швецию, потому что эта девушка, которую вы действительно хотите удивить, не очень хороша в английском?Ой ... удачи.

Поэтому в программном обеспечении вы обычно используете идентификаторы, которые отображаются в строки благодаря каркасу.Один из таких известных фреймворков - gettext

. Сообщения помещаются в файл .po с приятным графическим интерфейсом для их редактирования и имеют ссылки на идентификаторы, которые сами являются предложениями из программного обеспечения.Например:

printf (gettext ("The amount is %0" PRId64 "\n"), number);

Интерфейсы GUI включают способы поиска уже существующих сообщений, а также включают функции нечетких переводов.

1 голос
/ 09 июня 2010

Перечисления в C ++ имеют целочисленное значение - они должны быть перечислены (так что TUESDAY == MONDAY + 1), а не являются несвязанной кучей.

Какую структуру вы должны использовать для хранения своих строк, скорее зависит от того, что вы планируете делать с ними. Если вы хотите использовать другую строку, основанную на комбинации значений, помещение их в карту или массив может быть более подходящим, чем просто определение констант.

Или вы можете использовать отдельный файл, который вы читаете при запуске, если вы хотите изменять строки во время выполнения - в зависимости от того, «позже» вы хотите их редактировать, до или после компиляции кода.

Вы также можете больше думать о том, чтобы хранить вместе данные и операции в объектах, а не иметь большую коллекцию строк.

0 голосов
/ 09 июня 2010

enum используется для определения перечислимого типа .

Например, вы могли бы иметь

enum {CLUBS, DIAMONDS, HEARTS, SPADES};

Таким образом, запись CLUBS будет такой же, как запись 0, DIAMONDS будет такой же, как 1 и так далее. Вы также можете назначить конкретные значения каждому члену перечисления.

Тем не менее, для построения списка строк вы можете использовать соответствующий тип C ++, то есть list <string>.

см. Например http://www.cplusplus.com/reference/stl/list/list/ http://www.cplusplus.com/reference/string/string/

0 голосов
/ 09 июня 2010
Перечисления

- это сокращенные числа, они присваивают имена целым Вы можете использовать классы для группировки строк.

0 голосов
/ 09 июня 2010

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

Вместо этого вы можете просто использовать строковые константы C:

char const *const MSG_INIT = "Welcome to ...";
char const *const MSG_FOO = "bar";

Вы можете сделать их открытыми, если захотите.

1008 * Е.Г. *

struct SomeClass
{
    static char const *const MSG_INIT;
    static char const *const MSG_FOO;
};

char const *const SomeClass::MSG_INIT = "Welcome to ...";
char const *const SomeClass::MSG_FOO = "bar";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...