Как исправить ошибку списка инициализатора этого дочернего класса? - PullRequest
1 голос
/ 16 апреля 2020

Родительский класс - Автомобиль, дочерний класс - Автомобиль. Пришлось использовать список инициализаторов для всех конструкторов, что оказалось для меня проблемой. Я продолжаю получать следующую ошибку из-за того, что у меня есть:

car.cpp:7:1: error: redefinition of 'Car::Car()'
Car::Car()
^
In file included from car.cpp:3:0:
car.h:12:5: note: 'Car::Car()' previously defined here
     Car() : Vehicle("NoID", -1, "NoMake", "NoModel", "NoColor") {}
     ^

Как новичок, я слегка знаком со списками инициализации basi c, но не когда дело доходит до их использования в дочерних классах. В случае, если это не было явно очевидно, это для назначения; Я просто ищу помощь в диагностике вышеуказанной ошибки, а не полное решение.

vehicle.h

#ifndef VEHICLE_H
#define VEHICLE_H

#include <iostream>
#include <string>
using namespace std;

class Vehicle
{
protected:
    /* Each of these data item represent something any type of vehicle
    will have, so it makes sense these would be in the base class. */

    // added a parent constructor so child classes can use
    // these variables in initializer list
    Vehicle(string id, int year, string make, string model,
            string color) : id(id), year(year), make(make),
                            model(model), color(color) {}
    string id;
    int year;
    string make;
    string model;
    string color;

public:
    Vehicle();
    // Vehicle(string id, int year, string make, string model, string color);
    Vehicle(ifstream &infile);
    // virtual ~Vehicle();
    string getID();
    void setID(string ID);
    virtual void printInfo(ofstream &out);
};

#endif

car.h

#ifndef CAR_H
#define CAR_H

#include <iostream>
#include <string>
#include "vehicle.h"
using namespace std;

class Car : public Vehicle
{
private:
    Car() : Vehicle("NoID", -1, "NoMake", "NoModel", "NoColor") {}
    int doors;
    string paymentType;

public:
    // Car();
    Car(string id, int year, string make, string model, string color, int doors, 
string paymentType);
    Car(ifstream &infile);

    int getDoors();
    void setDoors(int numdoors);

    string getPaymentType();
    void setPaymentType(string pt);

    void printInfo(ofstream &out);
};

#endif

авто. cpp

#include <iostream>
#include <string>
#include "car.h"
#include "vehicle.h"
using namespace std;

Car::Car()
{
    // default constructor initialization list?
}

Car::Car(string id, int year, string make, string model,
         string color, int doors, string paymentType)
{
    // parameterized constructor
}

Car::Car(ifstream &infile)
{
    // regular constructor i think
}

int Car::getDoors()
{
    return doors;
}

void Car::setDoors(int numdoors)
{
    doors = numdoors;
}

string Car::getPaymentType()
{
    return paymentType;
}

void Car::setPaymentType(string pt)
{
    paymentType = pt;
}

void Car::printInfo(ofstream &out)
{
// unfinished
} 

1 Ответ

0 голосов
/ 16 апреля 2020

Вы объявили и определили ваш конструктор здесь

Car() : Vehicle("NoID", -1, "NoMake", "NoModel", "NoColor") {}

, поэтому определение в файле cpp является вторым определением, которое недопустимо

Car::Car()
{
    // default constructor initialization list?
}

Если вы хотите переместить реализацию в файл cpp, измените заголовок, чтобы просто иметь объявление

// car.h
class Car : public Vehicle
{
    Car();
    ...
};

// car.cpp
Car::Car()
: Vehicle("NoID", -1, "NoMake", "NoModel", "NoColor")
{
    // default constructor initialization list?
}
...