Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив константных строк, Как поле класса 
:(
    Опции темы
SaDFromSpb
Дата 23.6.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Вот код:
Код
class MT_Value
{
public:
  MT_Value() 
  {
    posible_vals[0] = "SSUP";
    posible_vals[1] = "DSUP";
    posible_vals[2] = "SDUP";
    posible_vals[3] = "DDUPEXT";
  };
  /* ... */

private:
   char* posible_vals[4];
}
Он, конечно, работает, но уж очень хочется чтобы сами эти четыре строки были константными.
Я объявил char* const posible_vals[4], но как не извращался, так и не обнаружил способа их инициализации. Это реально?  

Это сообщение отредактировал(а) SaDFromSpb - 23.6.2006, 16:51


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Fazil6
Дата 23.6.2006, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



const char* posible_vals[4]; 
PM MAIL   Вверх
SaDFromSpb
Дата 23.6.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Fazil6,
это не пойдет. В этом случае константным будет значение самого указателя, который указывает на массив строк. Сами строки можно будет менять. К тому же я просил привести пример, как это дело инициализировать.
Но за участие спасиба  smile  


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
nickless
Дата 23.6.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Насколько я помню, константы можно инициализировать только через initialization list, но там нет доступа на поля массива.
Если posible_vals не обязательно быть массивом, но очень хочется пользоваться оператором [], то можно слегка извратиться smile 
Код

class MT_Value
{
    public:
        MT_Value() : posible_vals("SSUP", "DSUP", "SDUP", "DDUPEXT") { };
        
        void printSome()
//             posible_vals[1] = "BLAH";  //изменять нельзя
            cout << posible_vals[1] << endl;
        };
        /* ... */
    private:
        struct PossibleVals 
        {
            char* data[4];
            PossibleVals(char* a, char* b, char* c, char* d) {
                data[0] = a;
                data[1] = b;
                data[2] = c;
                data[3] = d;
            }
            const char* const operator[](int i) const { return data[i]; };
        } const posible_vals;
};

 smile    

Это сообщение отредактировал(а) nickless - 23.6.2006, 18:14


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Void
Дата 23.6.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(SaDFromSpb @  23.6.2006,  18:57 Найти цитируемый пост)
В этом случае константным будет значение самого указателя, который указывает на массив строк. Сами строки можно будет менять.

Как раз наоборот.

Цитата(SaDFromSpb @  23.6.2006,  18:57 Найти цитируемый пост)
К тому же я просил привести пример, как это дело инициализировать.

Единственный способ инициализации константных членов — это в списке инициализации конструктора.

Впрочем, possible_vals по смыслу вроде как должен быть статическим… Или я не прав? 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
SaDFromSpb
Дата 23.6.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Void, 
Цитата
Как раз наоборот.
 Ты проверь сам сначала
Код
const char* ppch[2] = {"abcd", "efg"};
ppch[1] = "oops! This string will be compiled successfully =)!";

А вот так выскочит ошибка:
Код
char* const ppch[2] = {"abcd", "efg"};
ppch[1] = "It's imposible!";

Цитата
Впрочем, possible_vals по смыслу вроде как должен быть статическим… Или я не прав? 
Весьма резонное замечание. Пробовал. Инициализировать статический массив константных строк так же не получилось.
Цитата
Единственный способ инициализации константных членов — это в списке инициализации конструктора.
Ага.  smile

nickless, Красиво =) но для данного случая это действительно изврат =) Хотелось бы стандартным способом, если он все-таки есть.

Вопрос остается открытым.    

Это сообщение отредактировал(а) SaDFromSpb - 23.6.2006, 18:41


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Void
Дата 23.6.2006, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(SaDFromSpb @  23.6.2006,  20:28 Найти цитируемый пост)
Весьма резонное замечание. Пробовал. Инициализировать статический массив константных строк так же не получилось.

Код
class A {
private:
    static const char *const vals_[];
public:
    A() {

    }
};

const char * const A::vals_[] = {"a", "b", "c"};

Цитата(SaDFromSpb @  23.6.2006,  20:28 Найти цитируемый пост)
 ты проверь сам сначала

Я невнимательно прочитал и имел в виду это:
Код
const char* vals[2] = {"a", "b"};
vals[0] = "q"; // изменение указателя, passed
vals[0][0] = 'q'; // изменение самой строки, failed
 

Это сообщение отредактировал(а) Void - 23.6.2006, 18:38


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
SaDFromSpb
Дата 23.6.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата(Void @  23.6.2006,  18:36 Найти цитируемый пост)
const char * const A::vals_[] = {"a", "b", "c"};
Спасиба! (Блин, а мне казалось, что я так пробовал...  smile )

Цитата(Void @  23.6.2006,  18:36 Найти цитируемый пост)
vals[0][0] = 'q'; // изменение самой строки, failed

Действительно. В моем примере менялись не строки, а указатели на них. Значит, я сам накосячил в формулировке.

Добавлено @ 18:52 
Не буду помечать вопрос, как решенный, мож кто-нибудь сможет нестатический "константный массив константных строк" инициализировать... 


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.