c ++ инициализирующий член массива символов класса - PullRequest
0 голосов
/ 09 ноября 2018

в моем проекте c ++ у меня есть класс с двумя участниками. член массива char, с которым у меня проблемы.

class frame_message
{
public:
    explicit frame_message(const unsigned int id, const char data[]) :id_(id), data_{ *data }{};
    // only the first char 'a' is copied to `data_`
    char* get_data() { return data_; };
    void get_data(char** data) { *data = data_; };
private:
    unsigned int id_; char data_[8];
};

Теперь из метода main я хочу отправить еще один массив символов, используемый для инициализации массива классов.

main
{
char data[8]={'a','b','c'} // indexs 3 to 7 are '\0'
char data2[8];
char data3[8];
frame_message myMessage(0xF004,data); // the data is passed as "abc"
data2 = myMessage.get_data(); // analysis error
myMessage.get_data(&data3); // runtime exception
}

Как мне инициализировать закрытый член класса именно тем массивом данных, который отправляется в конструктор?

также для get_data функций, какой тип данных должен быть передан?

p.s. Я новичок в c / c ++ и все же путаюсь в указателях, ссылках и особенно char и char*

1 Ответ

0 голосов
/ 09 ноября 2018

Для конструктора было бы неплохо также передать параметр длины, потому что вы можете принять только до 8 байтов. Тогда, если ваша длина <= 8: </p>

memcpy(data_, data, length)

То же самое в параметризованных get_data, поэтому это будет:

memcpy(*data, data_, 8) /* Assuming that they provide long enough array. */

Хорошей практикой является то, что при работе с массивами всегда нужно указывать длину, а при работе с указателями проверять, имеют ли они значение NULL - я оставлю это вам. Причина, по которой вы получаете ошибки, заключается в том, что вы не можете назначить указатель на статически объявленный массив - он имеет фиксированный адрес, вы можете только изменить содержимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...