Поэтому я пытаюсь создать эту программу, которая займет два символа и двойной. Как только пользователь вводит информацию. Я передам информацию объекту, используя приведенную ниже функцию. Но каждый раз, когда я пытаюсь скомпилировать, я получаю эту ошибку несовместимыми типами при назначении 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;
};
Вам нужно использовать strcpy
или подобное, чтобы скопировать строки из вашего char *
в ваш класс char []
. Использование =
пытается скопировать указатель, но они действительно несовместимые типы.
Указатели и массивы - это не одно и то же, хотя легко поверить, что они есть. Массивы могут передаваться в качестве аргументов для функций, которые запрашивают указатели из-за разложения указателя, и это может заставить людей поверить, что они взаимозаменяемы.
См. Эту статью: Что такое разложение массива?
Когда вы объявляете 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
Этот код
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, который имеет несколько перегруженных операторов присваивания.
symbol_ является char [], вам нужно использовать stcpy для его заполнения. В методе набора:
this->symbol_ = sym;
должен стать
stncpy(this->symbol_, sym, 20);
Или проще определить символ_ как замену std :: string:
char symbol_[20];
с
std::string symbol_;