Можно ли создать структуру с данными типа C (string * char), которые можно установить только один раз? - PullRequest
0 голосов
/ 27 января 2012

Можно ли создать структуру с данными типа C (строковые (char *)), которые можно установить только один раз?

Что-то вроде:

struct raw {
 static const char * request;
};

Мне нужна структура с данными, которые могутзаписывается только один раз, и к этому что-то должно быть конвертируемым результатом string.c_str (), есть ли способ создать такую ​​вещь в C ++?

Ответы [ 4 ]

2 голосов
/ 27 января 2012

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

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

 struct raw {
    const char * const data;
 };

 raw r = { "hi there" };

Или вы можете (должны) предоставить конструктор. Теперь, если вы хотите инициализировать это результатом вызова c_str() для строки, то вы наверняка столкнетесь с проблемами, так как возвращаемый указатель действителен только до следующей операции, которая модифицирует строку. Вы можете strdup строку c, но тогда вам придется управлять дублированной строкой ...

1 голос
/ 27 января 2012

Вы можете сделать это:

struct raw {
  raw(const char* request_in) { request = request_in; }
  const char* request;
};
0 голосов
/ 27 января 2012

Тогда вот так:

struct raw {
    raw(const char* request_in):request(request_in) {}
    const char* const request;
};
0 голосов
/ 27 января 2012

Что не так с старой доброй инкапсуляцией?Тег вопроса говорит о C ++, поэтому классы и личные данные разрешены.В сценарии класса закрытые переменные доступны для записи методами класса, но не остальной частью программы.Это снижает риск перезаписи до незначительного значения.

С другой стороны, если вы хотите защитить от супербагов и вредоносных воздействий, то ничто, кроме манипуляций с защитой памяти, не поможет.В Windows это достигается с помощью API-интерфейсов VirtualAlloc () / VirtualProtect ().

...