构造函数不能重新声明 C++

Constructor cannot be redeclared C++

tp start,我想说我是C++新手。我试图声明我的构造函数 3 次,因为我还有 3 个派生的 classes,它们使用不同的变量。但是我得到了这个错误,所以我真的不知道该怎么做......任务是创建一个 class 和派生的 classes 不同的支付方式并使用多态对象数组。这就是为什么我使用派生的 classes

class employee{
private:
char type[25];
int hours;
int salary_per_hour;
int days;
int salary_per_day;
int sales_per_month;
int percent_per_sales;
public:
employee() {
    hours = salary_per_hour = days = salary_per_day = sales_per_month = percent_per_sales = 0;
    strcpy(type, "unknown");
}
employee(int h, int d, int sph, char *n) {
    hours = h;
    days = d;
    salary_per_hour = sph;
    strcpy(type, n);
}
employee(int d, int spd, char *n) {
    days = d;
    salary_per_day = spd;
    strcpy(type, n);
}
employee(int b, int spm, int pps, char *n) { //This one doesn't declare
    sales_per_month = spm;
    percent_per_sales = pps;
    strcpy(type, n);
}

int getHours() {
    return hours;
}
int getDays() {
    return days;
}
int getSPD() {
    return salary_per_day;
}
int getSPH() {
    return salary_per_hour;
}
int getSPM() {
    return sales_per_month;
}
int getPPS() {
    return percent_per_sales;
}

char *getType() {
    return type;
}

virtual int salary() {
    cout << "ERROR | salary() must be overridden.\n";
    return 0;
}};
class hourly_payment: public employee{
public:
 hourly_payment(int h, int d, int sph) : employee(h, d, sph, "hourly_payment") { }
 int salary()
 {
     return getHours()*getDays()*getSPH();
 }
};

class daily_payment: public employee{
public:
 daily_payment(int d, int spd) : employee(d, spd, "hourly_payment") { }
 int salary()
 {
    return getDays()*getSPD();
 }
 };

class percent_per_sales_payment: public employee{
public:
 percent_per_sales_payment(int b, int spm, int pps) : employee(b, spm, pps, "percent_per_sales_payment") { }
 int salary()
 {
    return getSPM()*getPPS();
 }
 };

那是因为你的构造函数被重新定义了。编译器不关心变量名,他在你的情况下看到的只是数据类型。

employee(int, int, int, char *)

两种情况相同

employee(int b, int spm, int pps, char *n) { //This one doesn't declare
    sales_per_month = spm;
    percent_per_sales = pps;
    strcpy(type, n);
}

employee(int h, int d, int sph, char *n) {
    hours = h;
    days = d;
    salary_per_hour = sph;
    strcpy(type, n);
}

两者原型相同employee(int, int, int, char *)

在您的情况下最简单的解决方案是更改参数的顺序。

你可以这样做,例如:

employee(char *n, int h, int d, int sph) {
    hours = h;
    days = d;
    salary_per_hour = sph;
    strcpy(type, n);
}

在这种情况下,您有一个与任何其他原型都不匹配的新原型。

employee(char *, int, int, int)

如果构造函数中有相同类型的变量,另一种处理方法是使用 enums 作为名为 employee_type 的参数,并根据传递给 [=17 的类型=], 你可以在你的构造函数中选择你想做什么样的赋值。

每个重载都必须有不同的签名;它们不能仅在参数名称上有所不同 - 出于重载决议的目的,这些名称将被忽略。

您有两个带有签名的声明:

employee::employee( int, int, int, char * ) ;