Я пытаюсь инициализировать переменные в моем объекте, используя функцию с указателями const в качестве параметров.
Я продолжаю получать ошибки во многих попытках, вот мой код:
class Molecule
{
private:
char s[21];
char d[21];
double w= 0;
public:
Molecule();
void set(const char*, const char*, double);
void display() const;
};
int main() {
int n;
cout << "Molecular Information\n";
cout << "=====================" << endl;
cout << "Number of Molecules : ";
cin >> n;
Molecule *molecule = new Molecule[n];
for (int i = 0; i < n; i++) {
char symbol[21];
char description[21];
double weight;
molecule[i].set(&symbol,&discription,weight);
//...
}
//implementation of class
#include "Molecule.h"
#include <iostream>
#include <cstring>
void Molecule::set(const char*, const char*, double)
{
s = &symbol;
d = &discription;
w = &weigth;
}
Мой вопрос: как я правильно вызову функцию-член из массива объектов, используя постоянные символы в качестве параметра, и каков правильный способ установить их в мои переменные в моем классе.
PS: Я пытался понять это в течение долгого времени, и размещение здесь - последнее средство.
В вашем коде есть несколько ошибок
&symbol
(где symbol
char[21]
) дает char(*)[21]
, используйте symbol
напрямую и пусть он распадается на char*
или явно использует &symbol[0]
double weight;
это неинициализированная локальная переменная, при которой она приводит к неопределенному поведению - вы должны ее инициализировать: double weight = 0.0;
double w= 0;
используемый для объявления члена class Molecule
недействителен, вы можете использовать список инициализаторов конструктора:
Molecule() : w(0.0) { } // initializes 'w' to '0.0'
s = symbol;
где s
- char[21]
а symbol
- char*
не будет копировать строки, поскольку C-стиль может использоваться для копирования strcpy
(обратите внимание, что C и C++ - разные языки)
вы вызвали new[]
поэтому было бы неплохо и уместно также вызвать delete[]
а вместо того, чтобы полагаться на очистку ОС после завершения программы: (иначе следуйте точке 6)
Molecule *molecule = new Molecule[n];
...
delete[] molecule;
Если вам разрешено использовать векторы, замените Molecule *molecule = new Molecule[n];
с std::vector<Molecule> molecules(n);
Если вам разрешено использовать объекты std::string
1) замените char[21]
/char*
на std::string
objects
Другие предложения:
используйте значащие имена для переменных, если вы хотите явно различать частные члены из других локальных переменных, хорошим соглашением является использование _
в конце имени:
class Molecule {
private:
std::string symbol_;
std::string description_;
double weight_;
1) В основном то, что вам нужно знать о std::string
это то, что это шаблон, который обертывает raw char*
и он уже содержит четко определенное копирование, конкатенацию с использованием оператора +
и самое главное: вам не нужно беспокоиться о памяти управление. Просто #include <string>
В вызове
molecule[i].set(&symbol,&discription,weight);
вы передаете указатель на массив char
. Это не соответствует char*
, что set
ожидает.
Самое простое/лучшее решение - изменить это на
molecule[i].set(symbol,description,weight);
опираясь на symbol
и description
массивов char
автоматически разлагающихся на указатели.
Кроме того, вы также можете написать
molecule[i].set(&symbol[0],&description[0],weight);
явно передать char*
[Обратите внимание, что в отправленном коде есть много других ошибок. Исходя из вопроса, я предполагаю, что они просто опечатки. Пожалуйста, обновите свой вопрос, если вам нужна дополнительная информация о любой другой ошибке.]
std::string
?