Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Разработка классов на С++. Ошибка: более 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;
}

По дате
По рейтингу
Аватар пользователя
Новичок

Ошибка "более 1 конструктора по умолчанию" возникает из-за того, что вы определяете два конструктора по умолчанию для класса Bus. Один из них находится в теле класса, а другой вне класса. Для исправления этой ошибки следует убрать одно из этих определений. В данном случае лучше оставить конструктор по умолчанию внутри класса, а конструктор с параметрами определить вне класса.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
 #include <iostream> 
#include <string.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() { 
        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; 
} 
 
Аватар пользователя
Высший разум

Для компилятора вот это вот:

1
 Bus::Bus(int BusNumber1 = 0, int route1 = 0, const char* brand1 = 0, int year1 = 0, int mileage1 = 0) 

неотличимо от этого:

1
 Bus::Bus() 

Каким образом компилятор может выбрать, где использовать конструктор вообще без параметров, а где использовать конструктор со всеми параметрами по умолчанию?