2016-03-18 1 views
0

Поисковые запросы Google, которые я пробовал, приводят меня к людям с ошибками в их программах. Я предпочел бы просто знать, как сделать это правильно, чем откат от неисправного кода.В C++ как объявить массив, который будет использоваться классом?

У меня есть массив, это const int.

В моем классе я хочу инициализировать другой массив, но с таким же количеством элементов.

После инициализации первого массива, в классе я пробовал:

int array[array.length()]; 

Но компилятор стонет это не константа.

Даже когда я

const string thestring = "Dummy example"; 
const static int strlen = (int)thestring.length(); 

Тогда позже в классе I:

class dostuff { 
    int newstring[strlen]; 
); 

Компилятор все еще жалуется на меня.

Это оставляет меня пытаются первым провозглашаем, например:

const string thestring = "Dummy"; 

Тогда в классе, просто сосчитать элементы вручную:

class Enigmatise { 
    int duplicatelengthstring[5]; // Just counted by hand. :-(
); 

Компилятор счастлив теперь имеет постоянное выражение , но я не доволен, потому что, если я изменю определение основной строки на «Больше символов», тогда мне нужно подсчитать их вручную или cout с помощью .length(), а затем использовать новую константу численное выражение в классе, делая все это вручную. Это выглядит несчастным случаем.

Поэтому, если у меня есть

const string thestring = "Dummy example"; 

Как потом объявить, в классе, другой массив одинаковой длины для манекена в классе?

ответ

0

Вы можете использовать динамическое распределение;

class anotherclass { 
     const std::string thestring; 
     int * const otherArray; 

     anotherclass() : thestring("some string"), 
         otherArray(new int[(int)thestring.length()]){} 
     ~anotherclass(){delete[] otherArray;} 
    }; 

EDIT: Это компилируется без предупреждений

class anotherclass {   
    static const std::string thestring; 
    static const int strlen; 
    public: 
    void dosomething(){int g[strlen]; } 
}; 


const std::string anotherclass::thestring = "mystring"; 
const int anotherclass::strlen = anotherclass::thestring.length(); 
+0

Если вы не хотите/можете использовать динамическое выделение, под C++ 11 может быть возможно работать что-то с помощью 'constexpr 'но я не уверен. – xvan

+0

Я дал ему попытку, но 'std :: basic_string ' не является литералом. Из-за этого мы не можем: make 'constexpr std :: string', использовать' std :: basic_string :: operator [] 'или' size() 'в' constexpr' или использовать 'c_str () 'в' constexpr', чтобы получить базовую строку C и проверить длину оттуда. Также кажется, что идиома ol '' sizeof (x)/sizeof (x [0]) не будет работать; при использовании с его строкой он вычисляет '32' вместо' 13'. Вероятно, есть способ сделать это, но я еще недостаточно квалифицирован, чтобы понять, что это такое. –

+0

Было бы легко сделать, если бы он использовал строку C; 'string_literal', как предложено в статье N4121, также поможет, но я не знаю, что с этим произошло, если что-нибудь. На данный момент самое лучшее, что я могу придумать, - создать класс строки времени компиляции, такой как 'literal_str' (https: //www.daniweb.com/programming/software-development/code/482276/c-11-compile-time-string-concatenation-with-constexpr) и дать ему функцию 'constexpr size_t size()'. При необходимости он также должен был бы использовать его с помощью 'std :: string'. Я честно не знаю, как использовать 'constexpr', чтобы получить размер в противном случае. –