我只发现了另一个关于这个问题的问题,而且我的上下文似乎没有任何意义。
基本上我正在尝试使用继承的类创建一个税表计算器。这看起来很简单,但显然我在代码中的某个地方搞砸了。
主类
class TaxFiler{
private:
string name;
double taxableIncome;
public:
TaxFiler(string n, double o) {
name = n;
taxableIncome = o;
}
string getName(){
return name;
};
double computeTax(double o){};
};
继承类(只有一个,直到我能解决这个问题)
class SingleFiler : public TaxFiler {
public:
SingleFiler(string n, double o) : TaxFiler(n) {
}
double taxableIncome(double o) : TaxFiler {
if (0 < o && o <= 8925)
return (o*.10);
else if (8925 < o && o <= 36250)
return (892.50 + (o* .15))
else if (36250 < o && o <= 87850)
return (4991.25 = (o* .25))
else if (87850 < o && o <=183250)
return (17891.25 (o * .28))
else if (183250 < o && o <= 398350)
return (44603.25 + (o * .22))
else if (398350 < o && o <= 40000)
return (115586.25 + (o * .35))
else
return (116163.75 + (o . 39.6))
}
};
main()的
main() {
TaxFiler *filers[] = {
new SingleFiler("Jack", 100050),
};
for( int i=0 ; i<1 ; i++ )
cout << filer[i]->getName() << ": " << filer[i]->computeTax() << endl;
};
每当我尝试运行我遇到的程序时:
||In constructor 'SingleFiler::SingleFiler(std::string, double)':|
|27|error: no matching function for call to 'TaxFiler::TaxFiler(std::string&)'|
|27|note: candidates are:|
|13|note: TaxFiler::TaxFiler(std::string, double)|
|13|note: candidate expects 2 arguments, 1 provided|
我愿意打赌这是我忽略的一些简单因为我在校对我的代码和/或仍然是继承类的新手时非常糟糕。谢谢你的任何帮助!
答案 0 :(得分:2)
为了更容易获得有关堆栈溢出的帮助,您可能需要考虑使用类似sscce的内容将代码整形为ideone,以验证您发布的代码是否接近可编辑。您发布的示例有很多语法错误和拼写错误。
您遇到的核心问题是命名冲突。在“TaxFiler”中,“taxableIncome”是double类型的变量。在你的派生类中,你已经使它成为一个函数。
double taxableIncome(double o) : TaxFiler
这个语法无效,我不确定你要做什么,但是如果你想在基类中描述接口函数然后在派生类中提供实现,你需要使用{{ 1}}标签:
virtual
在类或结构或枚举声明之后,您需要一个class Base {
public:
virtual double transform1(double in) { return 0.0; } // base implementation
virtual double transform2(double in) = 0; // special syntax, see below
};
class Derived : public Base {
public:
double transform1(double in) override { return 1.5 * in; }
double transform2(double in) override { return 2.0 * in; }
};
,但在函数之后不需要它:)
;
您还将值传递到您的int main() {
}; // <-- not required, and may cause the compiler to complain
class Foo {}; // <-- required, because you COULD do this:
class Foo {} foo; // <-- describes Foo and creates an instanced called foo.
函数中,这似乎是多余的,您已经描述了文件管理器的应税收入。您需要将变量calculateTax
设为taxableIncome
,以便派生类可以看到它,或者更好,提供一个访问器。这样做的好处是,您的基类可以控制谁可以更改它,并且可以划分事物。
我已经通过其他一些更改来清理代码:
。我给成员变量一个“m_”前缀,因此它们很突出(通常的做法是'g_'表示全局变量,'s_'表示静态)
。我用过std :: unique_ptr&lt;&gt; from来保存指针:当容器超出范围时,这将确保它们被释放(通过protected
)
。我用过std :: vector&lt;&gt;而不是数组。
。我简化了你的delete
语句逻辑:我只需为每个if
检查一个值,因为如果值较低,它将满足先前的if情况并返回。
。我已经使用了“ranged for”迭代器来结束向量。
if
答案 1 :(得分:1)
通过以下修复,您将获得此输出:
Jack: 0
在解决您的问题之前,指出程序中的众多语法错误可能会有所帮助。到此为止。
computeTax应该返回一些东西。
double computeTax(double o){
return 0.0;
};
: TaxFiler
不应该在成员函数之后:
double taxableIncome(double o) {
使用一个参数而不是两个参数调用基础构造函数:
SingleFiler(string n, double o) : TaxFiler(n, o)
缺少分号:
return (892.50 + (o* .15));
我无法理解等号的来源,所以假设你想要添加(也用分号):
return (4991.25 + (o* .25));
分号:
return (17891.25 + (o * .28));
天啊,为什么不做其余的事情:
else if (183250 < o && o <= 398350)
return (44603.25 + (o * .22));
else if (398350 < o && o <= 40000)
return (115586.25 + (o * .35));
else
return (116163.75 + (o * 39.6));
main
必须返回一个int:
int main() {
您的意思是使用filers
:
cout << filers[i]->getName() << ": " << filers[i]->computeTax() << endl;
其次,您没有将参数传递给computeTax
:
filers[i]->computeTax(0.0)
答案 2 :(得分:0)
你正在使用TaxFiler构造函数,它接受2个参数,只有一个参数在SingleFiler构造函数中传递。您应该为double o指定默认值,或者使用一个参数定义构造函数,或者使用带有2个参数的构造函数。
答案 3 :(得分:0)
编译器不知道如何将“Jack”直接转换为std :: string(因为当你把一个字符串放在引号中时,它被编译器认为是const char *,而不是字符串。所以它使得一个笨重的尝试从const char *复制构造一个字符串对象,但是返回一个字符串引用,而不是一个字符串)。必须通过创建字符串对象来明确地将其转换为字符串。这样做的原因是C ++始终保持效率和紧凑性而不是用户友好性,而const char *是存储字符串的最有效方式(不涉及类开销)。解决这个问题的一种有效方法是将构造函数的类型更改为const char *,然后在构造函数中创建一个字符串。这样就可以避免两次创建字符串的开销,即在构造函数调用之前一次,以及一次将字符串对象通过值(即复制)传递给类变量时。