Ошибка "более 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;
}
#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;
}