构造函数不能重新声明 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 * ) ;
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 * ) ;