Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Массив константных строк


Автор: SaDFromSpb 23.6.2006, 16:50
Вот код:
Код
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], но как не извращался, так и не обнаружил способа их инициализации. Это реально?  

Автор: Fazil6 23.6.2006, 16:54
const char* posible_vals[4]; 

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

Автор: nickless 23.6.2006, 18:04
Насколько я помню, константы можно инициализировать только через 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    

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

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

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

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

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

Автор: SaDFromSpb 23.6.2006, 18:28
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, Красиво =) но для данного случая это действительно изврат =) Хотелось бы стандартным способом, если он все-таки есть.

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

Автор: Void 23.6.2006, 18:36
Цитата(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
 

Автор: SaDFromSpb 23.6.2006, 18:49
Цитата(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 
Не буду помечать вопрос, как решенный, мож кто-нибудь сможет нестатический "константный массив константных строк" инициализировать... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)