“候选人期待2个论点,1个提供”

时间:2013-11-22 06:34:18

标签: c++ class inheritance

我只发现了另一个关于这个问题的问题,而且我的上下文似乎没有任何意义。

基本上我正在尝试使用继承的类创建一个税表计算器。这看起来很简单,但显然我在代码中的某个地方搞砸了。

主类

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|

我愿意打赌这是我忽略的一些简单因为我在校对我的代码和/或仍然是继承类的新手时非常糟糕。谢谢你的任何帮助!

4 个答案:

答案 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”迭代器来结束向量。

现场演示:http://ideone.com/Q73z1I

if

答案 1 :(得分:1)

Live example

通过以下修复,您将获得此输出:

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 *,然后在构造函数中创建一个字符串。这样就可以避免两次创建字符串的开销,即在构造函数调用之前一次,以及一次将字符串对象通过值(即复制)传递给类变量时。