Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Разработка классов на С++. Ошибка: более 1 конструктора по умолчанию

Марина Ратушняк Ученик (106), закрыт 1 неделю назад
#include<iostream>
#include<conio.h>
#include<string.h>
#include<Windows.h>
using namespace std;
//Определение класса "Bus"
class Bus {
int BusNumber; //Номер автобуса
int route; //Номер маршрута
char* brand; //Марка автобуса
int year; //Год начала эксплуатации
int mileage; //Пробег

//Методы класса
public:
//Определение конструктора по умолчанию
Bus() :BusNumber(0), route(0), brand(nullptr), year(0), mileage(0) {};
//Прототип конструктора с параметрами
Bus(int, int, const char*, int, int);
//Прототип конструктора копирования
Bus(const Bus&);

//Внешнее определение конструктора с параметрами
Bus::Bus(int BusNumber1 = 0, int route1 = 0, const char* brand1 = 0, int year1 = 0, int mileage1 = 0)
{
BusNumber = BusNumber1;
route = route1;
if (!brand1)brand = 0;
else {//Динамически выделяем память под марку машины
brand = new char[strlen(brand1) + 1];
//Копируем параметр-марку в выделенную область памяти
strcpy_s(brand, strlen(brand1) + 1, brand1);
}
year = year1;
mileage = mileage1;
cout << endl << "Объект класса создан конструктором с параметрами" << endl;
}

//Внешнее определение конструктора копирования
Bus::Bus(const Bus& obj)
{
BusNumber = obj.BusNumber;
route = obj.route;
if (!obj.brand)brand = 0;
else {//Динамически выделяем память под марку машины
brand = new char[strlen(obj.brand) + 1];
//Копируем марку в выделенную область памяти
strcpy_s(brand, strlen(obj.brand) + 1, obj.brand);
}
year = obj.year;
mileage = obj.mileage;
cout << endl << "Объект класса создан конструктором копирования" << endl;
}
Лучший ответ
Татьяна Просветленный (28804) 2 недели назад
Ошибка "более 1 конструктора по умолчанию" возникает из-за того, что вы определяете два конструктора по умолчанию для класса Bus. Один из них находится в теле класса, а другой вне класса. Для исправления этой ошибки следует убрать одно из этих определений. В данном случае лучше оставить конструктор по умолчанию внутри класса, а конструктор с параметрами определить вне класса.
 #include  
#include
using namespace std;

// Определение класса "Bus"
class Bus {
int BusNumber; // Номер автобуса
int route; // Номер маршрута
char* brand; // Марка автобуса
int year; // Год начала эксплуатации
int mileage; // Пробег

public:
// Определение конструктора по умолчанию
Bus() : BusNumber(0), route(0), brand(nullptr), year(0), mileage(0) {}

// Прототип конструктора с параметрами
Bus(int, int, const char*, int, int);

// Прототип конструктора копирования
Bus(const Bus&);

~Bus() {
delete[] brand; // Освобождение памяти в деструкторе
}
};

// Внешнее определение конструктора с параметрами
Bus::Bus(int BusNumber1, int route1, const char* brand1, int year1, int mileage1)
: BusNumber(BusNumber1), route(route1), year(year1), mileage(mileage1) {
if (!brand1) {
brand = nullptr;
} else {
// Динамически выделяем память под марку машины
brand = new char[strlen(brand1) + 1];
// Копируем параметр-марку в выделенную область памяти
strcpy_s(brand, strlen(brand1) + 1, brand1);
}
cout << endl << "Объект класса создан конструктором с параметрами" << endl;
}

// Внешнее определение конструктора копирования
Bus::Bus(const Bus& obj)
: BusNumber(obj.BusNumber), route(obj.route), year(obj.year), mileage(obj.mileage) {
if (!obj.brand) {
brand = nullptr;
} else {
// Динамически выделяем память под марку машины
brand = new char[strlen(obj.brand) + 1];
// Копируем марку в выделенную область памяти
strcpy_s(brand, strlen(obj.brand) + 1, obj.brand);
}
cout << endl << "Объект класса создан конструктором копирования" << endl;
}

int main() {
// Примеры создания объектов
Bus bus1;
Bus bus2(123, 45, "Mercedes", 2020, 15000);
Bus bus3(bus2);

return 0;
}
Марина РатушнякУченик (106) 2 недели назад
Спасибо!
Остальные ответы
Андрей Высший разум (432715) 2 недели назад
Для компилятора вот это вот:
 Bus::Bus(int BusNumber1 = 0, int route1 = 0, const char* brand1 = 0, int year1 = 0, int mileage1 = 0) 
неотличимо от этого:
 Bus::Bus() 
Каким образом компилятор может выбрать, где использовать конструктор вообще без параметров, а где использовать конструктор со всеми параметрами по умолчанию?
Похожие вопросы