C ++ Передача константы указателя в качестве параметра из основного в метод

0

Я пытаюсь инициализировать переменные в моем объекте, используя функцию с указателями 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: Я пытался понять это в течение долгого времени, и размещение здесь - последнее средство.

  • 1
    Есть много проблем с этим кодом. Даже если вы исправите вызов как ответ @simonc's simonc, сама функция-член не работает. Вам нужно будет скопировать строки, а не просто назначить (что фактически приведет к ошибке компиляции, поскольку вы не можете назначить указатель на массив.) Есть ли причина, по которой вы не используете std::string ?
  • 0
    Если честно, я новичок в C ++, с небольшим опытом. Я беспокойно изучаю концепции, но с их практической реализацией я сталкиваюсь с трудностями.
Теги:
string
pointers
initialization
argument-passing

2 ответа

1
Лучший ответ

В вашем коде есть несколько ошибок

  1. &symbol (где symbol char[21]) дает char(*)[21], используйте symbol напрямую и пусть он распадается на char* или явно использует &symbol[0]

  2. double weight; это неинициализированная локальная переменная, при которой она приводит к неопределенному поведению - вы должны ее инициализировать: double weight = 0.0;

  3. double w= 0; используемый для объявления члена class Molecule недействителен, вы можете использовать список инициализаторов конструктора:

    Molecule() : w(0.0) { } // initializes 'w' to '0.0'
    
  4. s = symbol; где s - char[21] а symbol - char* не будет копировать строки, поскольку C-стиль может использоваться для копирования strcpy (обратите внимание, что C и C++ - разные языки)

  5. вы вызвали new[] поэтому было бы неплохо и уместно также вызвать delete[] а вместо того, чтобы полагаться на очистку ОС после завершения программы: (иначе следуйте точке 6)

    Molecule *molecule = new Molecule[n];
    ...
    delete[] molecule;
    
  6. Если вам разрешено использовать векторы, замените Molecule *molecule = new Molecule[n]; с std::vector<Molecule> molecules(n);

  7. Если вам разрешено использовать объекты 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>

  • 0
    Большое спасибо за полное объяснение, после краткого исследования я буду изучать векторы и использовать их. Еще одна вещь, пожалуйста, какова тема std :: string, например, как я могу узнать больше об ее использовании? Спасибо
  • 0
    @ user3258542: Добро пожаловать :) Смотрите мои изменения.
Показать ещё 1 комментарий
1

В вызове

 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*

[Обратите внимание, что в отправленном коде есть много других ошибок. Исходя из вопроса, я предполагаю, что они просто опечатки. Пожалуйста, обновите свой вопрос, если вам нужна дополнительная информация о любой другой ошибке.]

  • 0
    Большое спасибо за полное объяснение, после краткого исследования я буду изучать векторы и использовать их. Еще одна вещь, пожалуйста, какова тема std :: string, например, как я могу узнать больше об ее использовании? Спасибо.
  • 0
    @ user3258542 Первое руководство по поиску в std :: string выглядит как приличный обзор

Ещё вопросы

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