Язык C++. При определении конструктора класса через builder компилятор выдаёт предупреждения

153
30 января 2020, 02:30

Создал класс через Builder.

Из-за чего компилятор выдаёт предупреждения в файле Patient.cpp на определении двух конструкторов класса и как это пофиксить?

Выдаёт два таких предупреждения:

Warning C26495 Variable 'Patient::id' is uninitialized. Always initialize a member variable (type.6).

Код файла Patient.h:

    #pragma once
    #include <string>
    class Patient
    {
    public:
        Patient();
        Patient(int id,std::string surname, std::string name, std::string patronymic, std::string address, std::string work_place, std::string last_date);
        ~Patient();
    protected:
        int id;//номер медицинской карты
        std::string surname;//фамилия
        std::string name;//имя
        std::string patronymic;//отчество
        std::string address;//адрес
        std::string work_place;//место работы
        std::string last_date;//дата последней флюрографии ???
    };

Код файла Patient.cpp:

    #include "Patient.h"
    #include <iostream>
    Patient::Patient()
    {
        std::cout << "Объект класса Patient создан\n";
    }
    Patient::Patient(int id, std::string surname, std::string name, std::string patronymic, std::string address, std::string work_place, std::string last_date)
    {
    this->id = id;
    this->surname= surname;//фамилия
    this->surname= name;//имя
    this->patronymic= patronymic;//отчество
    this->address= address;//адрес
    this->work_place= work_place;//место работы
    this->last_date= last_date;//дата последней флюрографии ???
    std::cout << "Объект класса Patient с использованием формальныъх параметров создан.\n";
        std::cout << "Объект класса Patient с использованием формальныъх параметров создан.\n";
    }

Patient::~Patient()
{
    std::cout << "Объект класса Patient удалён.\n";
}

Новая ошибка:

Error C2274 '->': illegal as right side of '.' operator Lab10

При попытке заменить -> на точку поддчеркивает this и выдаёт:

expression must have class type

Answer 1

В конструкторе Patient::Patient() у вас поля инициализируются конструктором по-умолчанию, так что поле int id; с тривиальным конструктором остается неинициализированным (то бишь заполнено мусором). Соответственно его необходимо инициализировать:

Patient::Patient(): m_id{}
{
    std::cout << "Объект класса Patient создан\n";
}

Далее, в другом конструкторе все поля точно так же инициализируются конструктором по-умолчанию и только затем им присваиваются новые значения. Правильная инициализация выглядит так:

Patient::Patient(int id, std::string surname, std::string name, std::string patronymic, std::string address, std::string work_place, std::string last_date)
:   m_id{id}
,   m_surname{surname}
...

Ну и конечно имеет смысл использовать для полей такие имена, которые не приводят к конфликтам.

Answer 2

Компилятор ожидает от вас именно инициализации поля id в конструкторе по умолчанию. Сгенерировать такую инициализацию вы можете либо явно написав список инициализации конструктора, либо неявно - указав инициализатор для id в теле класса

class Patient
{
  ...
protected:
  int id = 0;
  ...
};
READ ALSO
Сортировка по глубине в r-tree

Сортировка по глубине в r-tree

Использую r-tree из boost (geometry) для создания графической 2D сцены и возник такой вопрос: как сортировать объекты (box) по глубинеНа данный момент...

129
Вопрос по двунаправленному итератору [закрыт]

Вопрос по двунаправленному итератору [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»

153
Компиляция в mingw64 в линукс для windows

Компиляция в mingw64 в линукс для windows

У меня ubuntu и я случайно узнал что в ubuntu есть пакет mingw64 ( а потом и о проекте в сети )Я установил их

142
Как показать html страницу?

Как показать html страницу?

Как на windows, qt 512

190