2014-02-10 2 views
0

У меня есть структура с массивом символов и конструктор, который инициализирует массив с определенной строкой. Я хочу избежать #define и вместо этого передать строчку C++ в конструктор. Но опять же, размер массива char неизвестен во время компиляции. Что было бы хорошим подходом к этому?Инициализировать структуру, имеющую элемент массива char со строкой динамической длины

#define STRING_ "myString" 

    struct myStruct { 

     int nCode; 
     char str1[sizeof(STRING_)]; 
     myStruct() 
     { 
      nLangCode = 0x0409; 
      strcpy(str1, STRING_); 
     } 
    } ; 
+1

Когда вы не знаете размер во время компиляции, вам необходимо вручную выделить хранилище, как только вы знаете размер во время выполнения. –

ответ

2

Если вы только знаете размер во время выполнения, нет никакого способа, чтобы объявить элемент как массив, так как массивы переменной длины не особенность C++. Просто используйте std::string.

struct myStruct { 

    int nCode; 
    std::string str1; 
    myStruct() : str1(STRING_) 
    { 
     nLangCode = 0x0409; 
    } 
} ; 

Таким образом, вам не придется беспокоиться о конструкторов копирования, операторы присваивания и деструкторов - что является то, что пропустили оба другие ответы.

0

Вы должны использовать стандартный класс std::string

Например

#include <string> 
struct myStruct { 

    int nLangCode; 
    std::string str1; 
    myStruct (const char *s, int code) : nLangCode(code), str1(s) 
    { 
    } 
} ; 

иначе вы должны сами динамически выделять массив символов с помощью оператора new. В этом случае вам также необходимо явно указать конструктор копирования, деструктор и оператор присваивания копий.

В этом случае конструктор может выглядеть следующим образом

#include <cstring> 

struct myStruct { 

    int nLangCode; 
    char *str; 
    myStruct (const char *s, int code) : nLangCode(code) 
    { 
     str = new char[std::strlen(s) + 1]; 
     std::strcpy(str, s); 
    } 
    // Other special functions... 
} ; 
0

Если нет необходимости провести копию строки и вам не нужно изменять строку, просто не использовать массив в первую очередь, но только сырой указатель как char const * const str1; который затем инициализировать как str1(STRING_) в конструкторе, как

#define _STRING "myString" 

struct myStruct { 
    const char * const str1; 
    myStruct() : str1(_STRING) { } 
}; 

Если вам не нужна копия строки, но вы должны изменить его, Stor е в массив непосредственно и пусть фигура компилятора из правильного размера:

#define _STRING "myString" 

struct myStruct { 
    static char str1[]; 
    myStruct() {} 
}; 

const myStruct::str1[] = _STRING; 

Если вам нужна копия и вам нужно изменить строку, используйте простой std::string, как показано в ответ на Luchian Григоре ,

Смежные вопросы