1

我不断收到以下错误:

"overloaded function not found in 'pizza'"

这指的是void outputDescriptiondouble computePrice功能,下面。我不知道出了什么问题。

我是 C++ 的初学者,但代码看起来不错。这是上课用的。我应该至少有 1 个 mutator 函数和 1 个 accessor 函数,一个计算价格的函数和一个输出比萨饼描述的函数。

这是我的代码:

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


class pizza
{
    public:
        void getOrder (string, string, int, int) ;
        void outputDescription (string&, string&, int&, int&) const;
        double computePrice (string&, int&, int&) const;
    private:
        string type;
        string size;
        int pepperoni;
        int cheese;
};

int main ()
{
    pizza customerpizza;
    double price;
    string type;
    string size;
    int pepperoni;
    int cheese;

    customerpizza.getOrder (type, size, pepperoni, cheese);
    customerpizza.outputDescription (type, size, pepperoni, cheese);
    price = customerpizza.computePrice (size, pepperoni, cheese);

    cout << "Total cost is $" << price << ".\n";

    system("PAUSE");
    return 0;
}

void pizza::getOrder (string type, string size, int pepperoni, int cheese)
{
    int pizzaType;
    int pizzaSize;

    cout << "Please choose 1 for deep dish, 2 for hand tossed, or 3\n";     cout << " for pan pizza.\n";
    cin >> pizzaType;

    switch(pizzaType)
    {
        case 1: type = "deep dish";
        break;
        case 2: type = "hand tossed";
        break;
        case 3: type = "pan";
        break;
        default: cout << "You entered an invalid choice. Please\n";              
                 cout << " enter 1 for deep dish, 2 for hand\n";             
                 cout << " tossed, or 3 for pan pizza.\n";
    }

    cout << "Please choose 1 for small, 2 for medium, or 3 for\n"; 
    cout << " large pizza.\n";
    cin >> pizzaSize;

    switch(pizzaSize)
    {
        case 1: size = "small";
        break;
        case 2: size = "medium";
        break;
        case 3: size = "large";
        break;
        default: cout << "You entered an invalid choice. Please\n";
                 cout << " enter 1 for small, 2 for medium, or\n";
                 cout << " 3 for large pizza.\n";
    }

    cout << "How many pepperoni servings on this pizza?\n";
    cin >> pepperoni;

    cout << "How many cheese servings on this pizza?\n";
    cin >> cheese;
}

void pizza::outputDescription (string type, string size, int pepperoni, int cheese) 
{
    cout << "You ordered a " << size << << type << " pizza with \n"; 
    cout << pepperoni << " servings of pepperoni and "<< cheese << endl;   
    cout << "servings of cheese.\n";

}

double pizza::computePrice (string size, int pepperoni, int cheese)
{
    double price;

    if (size = "small")
    {
        price = 10 + (2 * (pepperoni + cheese));
    }

    else if (size = "medium")
    {
        price = 14 + (2 * (pepperoni  + cheese));
    }

    else if (size = "large")
    {
        price = 17 + (2 * (pepperoni + cheese));
    }

    return price;
}       
4

5 回答 5

10

您以这种方式声明您的成员outputDescription()函数:

void outputDescription (string&, string&, int&, int&) const;
//                      ^^^^^^^  ^^^^^^

但是您提供的定义具有以下签名:

void pizza::outputDescription (
    string type, string size, int pepperoni, int cheese) const
//  ^^^^^^       ^^^^^^       ^^^            ^^^         ^^^^^
//                REFERENCES ARE MISSING!                Qualifier!

您忘记在函数定义中使用引用,并且忘记添加const限定符。成员函数定义中使用的签名必须与成员函数声明的签名匹配,而您的则不然。只需将这些参数类型引用stringandint并添加const限定符,与您声明函数的方式一致。

computePrice()成员函数也有同样的问题。这是您声明它的方式:

double computePrice (string&, int&, int&) const;
//                   ^^^^^^^  ^^^^  ^^^^

这是它的定义:

double pizza::computePrice (string size, int pepperoni, int cheese) const
//                          ^^^^^^       ^^^            ^^^         ^^^^^
//                              REFERENCES ARE MISSING!             Qualifier!

当然,解决方法是一样的。

于 2013-03-17T22:42:34.860 回答
2

错误是由于您在声明(头文件)中的方法签名和定义不同(您忘记了 &)

于 2013-03-17T22:44:14.817 回答
1

将我在其他地方的评论变成答案……</p>

实际的解决方案是删除所有这些参数 ( string type, string size, int pepperoni, int cheese),因为它们不必要地隐藏成员变量(正如John 在评论中指出的那样)并且应该由您的编译器指出!

您还需要确保方法上的cv 限定符对于声明和定义是相同的。

因此,您的声明应该是:

    void getOrder();
    void outputDescription() const;
    double computePrice() const;

定义应如下所示:

void pizza::getOrder()

void pizza::outputDescription() const

double pizza::computePrice() const

这将使调用main()看起来更整洁:

int main()
{
    pizza customerpizza;
    customerpizza.getOrder();
    customerpizza.outputDescription();
    double price = customerpizza.computePrice();

    cout << "Total cost is $" << price << ".\n";
}

还有一些其他的事情需要注意,也...

computePrice()中,您将相等 ( ==) 与赋值 ( =) 混淆了。那if (size = "small")应该是if (size == "small"),对于其他sizes) 也是如此)。

outputDescription()中,以下行缺少某些内容:

cout << "You ordered a " << size << << type << " pizza with \n"; 
// --------------------------------^
// Did you mean to include a space? (' ')?

学习阅读和理解编译器错误(和警告)是学习 C++ 的重要组成部分。继续练习!

于 2013-03-17T23:51:00.287 回答
1

你的方法有签名

void outputDescription(string&, string&, int&, int&) const;

但您将其定义为

void pizza::outputDescription(string type, string size, int pepperoni, int cheese) 

一方面,参数类型不匹配,并且您没有将后者限定为 const 成员函数。

由于您的方法不匹配,编译器会尝试找到合适的重载,如果找不到,则会出现错误。

于 2013-03-17T22:41:57.590 回答
0

其他人已经很好地回答了您的问题,但我想指出您的代码的另外两个问题。

  1. 成员函数void getOrder (string, string, int, int) ;应该使用变量的引用,否则您无法设置成员值的值。

  2. 在成员函数double pizza::computePrice中,您应该if (!size.compare("small"))使用if (size = "small").

于 2016-04-24T21:13:48.390 回答