статическая инициализация вектора строк
От: Аноним  
Дата: 07.06.08 12:11
Оценка:
добрый день.

простой вопрос -- как статически проинициализировать вектор строк? пока что придумал только следующий вариант, но он мне не кажется оптимальным, плюс варнинг выдает (см. ниже).
class A{
  static const std::vector< std::string > _data;
public:
//...
};

namespace{
    char *k_init[] = {"cat", "dog", "fish"};
};

const std::vector< std::string > A::_data(k_init, k_init+sizeof(k_init)/sizeof(k_init[0]));

выдает варнинг:

deprecated conversion from string constant to 'char*'

Re: статическая инициализация вектора строк
От: Roman Odaisky Украина  
Дата: 07.06.08 12:52
Оценка:
А>char const* k_init[] = {"cat", "dog", "fish"};
До последнего не верил в пирамиду Лебедева.
Re[2]: статическая инициализация вектора строк
От: Аноним  
Дата: 07.06.08 13:22
Оценка:
Здравствуйте, Roman Odaisky.

спасибо, помогло. а какие еще есть способы выполнить сабж?
Re: статическая инициализация вектора строк
От: Bell Россия  
Дата: 07.06.08 13:27
Оценка:
Здравствуйте, Аноним, Вы писали:

Вектора тут совершенно не при чем. проюлема в инициализаторе:
namespace{
    char *k_init[] = {"cat", "dog", "fish"};
};


Массив k_init содержит неконтстантные указатели, а в инициализаторе указаны строковые литералы, которые суть константы. Язык позволяет преобразование "строковый литерал" -> char*, но компилятор напоминает, что это не очень хорошо.
Исправить же эту проблему очень просто:
namespace{
    const char *k_init[] = {"cat", "dog", "fish"};//или char * const k_init[] ...
};
Любите книгу — источник знаний (с) М.Горький
Re[3]: статическая инициализация вектора строк
От: Bell Россия  
Дата: 07.06.08 13:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>спасибо, помогло. а какие еще есть способы выполнить сабж?


Кое-что здесь
Автор:
Дата: 04.03.08
Любите книгу — источник знаний (с) М.Горький
Re[2]: статическая инициализация вектора строк
От: Roman Odaisky Украина  
Дата: 07.06.08 13:49
Оценка: +1
Здравствуйте, Bell, Вы писали:

B> const char *k_init[] = {"cat", "dog", "fish"};//или char * const k_init[] ...


Ну вот ты сам себя запутал.

Надо char const *. Или, еще лучше, char const * const. Первый const означает, что литералы нельзя менять по указателю (k_init[0][0] = '!'), а второй — что нельзя перенацеливать указатели (k_init[0] = "another string") (это я анониму разъясняю)).

А ставить const слева — вредная привычка.
До последнего не верил в пирамиду Лебедева.
Re[3]: статическая инициализация вектора строк
От: Bell Россия  
Дата: 07.06.08 13:53
Оценка: +1
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Bell, Вы писали:


B>> const char *k_init[] = {"cat", "dog", "fish"};//или char * const k_init[] ...


RO>Ну вот ты сам себя запутал.

И правда Но только в комментарии!

RO>А ставить const слева — вредная привычка.

С этим можно спорить, но думаю, не стОит.

ЗЫ
Что мы без вредных привычек?
Любите книгу — источник знаний (с) М.Горький
Re[3]: статическая инициализация вектора строк
От: Pasternak  
Дата: 09.06.08 07:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>спасибо, помогло. а какие еще есть способы выполнить сабж?


Вот такой есть способ:

const std::vector< std::string > A::_data = boost::assign::list_of("cat")("dog")("fish");
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.