несовместимые типы при назначении const char * для char [duplicate]

0

Поэтому я пытаюсь создать эту программу, которая займет два символа и двойной. Как только пользователь вводит информацию. Я передам информацию объекту, используя приведенную ниже функцию. Но каждый раз, когда я пытаюсь скомпилировать, я получаю эту ошибку несовместимыми типами при назначении const char * на char [20]. Может ли кто-нибудь дать мне руку и уточнить, когда я не понимаю. Заранее спасибо.

void Molecule::set(const char* sym, const char* type, double weighT);

И это, как я это называю.

molecule[i].set(symbol, description,weight);

И в функции set() мне просто нужно передать значения inpputed моему частному члену в моем объекте, который я сделал с помощью функции this->.

////Итак, эта часть должна передать значение моим частным членам класса Molecule////

this->symbol_ = sym;
this->type_ = type;      
this->weight_ = weighT;

///////Вот моя Молекула Мода ////////

class Molecule{
private:
    char symbol_[20];
    char type_[20];
    double weight_;
public:
    void set(const char* sym, const char* type, double weighT);
    void display() const;
};
Теги:
class

4 ответа

3

Вам нужно использовать strcpy или подобное, чтобы скопировать строки из вашего char * в ваш класс char []. Использование = пытается скопировать указатель, но они действительно несовместимые типы.

0

Указатели и массивы - это не одно и то же, хотя легко поверить, что они есть. Массивы могут передаваться в качестве аргументов для функций, которые запрашивают указатели из-за разложения указателя, и это может заставить людей поверить, что они взаимозаменяемы.

См. Эту статью: Что такое разложение массива?

Когда вы объявляете symbol_[20], это говорит классу выделить 20 байтов при создании объекта. symbol_ всегда укажет на это распределение. Вы не можете переназначить его, как можете, указателем.

Вероятно, вам захочется скопировать текст, на который указывает sym используя std::strncpy. Будьте осторожны. Если строка, на которую указывает sym, больше 19 символов (19 + 1 для нулевого символа в конце), тогда вам нужно будет вручную завершить свой массив символов с нулевым символом (\ 0), чтобы он был допустимой строкой,

#include <cstring>
...
std::strncpy(symbol_, sym, sizeof(symbol));
symbol_[19] = '\0';

У меня не было возможности скомпилировать код выше, поэтому лучше всего изучить пример в конце этой статьи: http://www.cplusplus.com/reference/cstring/strncpy/?kw=strncpy

0

Этот код

this->symbol_ = sym;
this->type_ = type;      

является недействительным. Массивы не имеют оператора присваивания копии. Вы должны использовать стандартную функцию C strcpy или strncpy, объявленные в заголовке <cstring>

Например

std::strncpy( this->symbol, sym, 20 );
this->symbol[19] = '\0';
std::strncpy( this->type, type, 20 );      
this->type[19] = '\0';

Также рекомендуется назначить имя для магического номера 20 либо с помощью перечислителя, либо с помощью статической константы.

Также вместо массивов символов вы можете использовать стандартный класс std :: string, который имеет несколько перегруженных операторов присваивания.

0

symbol_ является char [], вам нужно использовать stcpy для его заполнения. В методе набора:

   this->symbol_ = sym;

должен стать

  stncpy(this->symbol_, sym, 20);

Или проще определить символ_ как замену std :: string:

  char symbol_[20];

с

  std::string symbol_;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню