【问题标题】:How can I fix "Overloaded member function not found" error?如何修复“未找到重载的成员函数”错误?
【发布时间】:2013-03-06 05:11:34
【问题描述】:

我不断收到以下错误:

"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;
}       

【问题讨论】:

  • 因为这是针对课堂的,所以您将不得不学习如何正确地进行面向对象。你的getOrderoutputDescriptioncomputePrice 函数应该没有参数。他们应该使用您在pizza 中声明的成员变量而不是参数。按照您的编写方式,您可以删除 Pizza 成员变量,并且您的代码将照常工作。
  • 如果您可以将来自编译器的完整错误消息作为问题的一部分包含在内,将会很有帮助。
  • 谢谢大家。我从来没有使用过这个论坛,因为我认为答案不会及时出现,但是,我很惊讶。你们太棒了,非常乐于助人。不幸的是,直到我发现部分问题后才看到您的回复。我让它工作了,但是约翰,谢谢你对对象函数的评论。我根据您的建议对其进行了重新设计,不发送参数,并且程序运行良好。
  • 其实,John,我以为我有它,但是当我再次编译它时,我遇到了麻烦。当我不向函数发送参数时,我会收到消息。错误 C2660:“pizza::getOrder”:函数不接受 0 个参数错误 C2660:“pizza::outputDescription”:函数不接受 0 个参数错误 C2660:“pizza::computePrice”:函数不接受 0 个参数跨度>
  • @tysowell: function does not take 0 arguments 表示您已从调用中删除了参数,但尚未从声明中删除参数。有关详细信息,请参阅下面的答案。

标签: c++ compiler-errors


【解决方案1】:

您以这种方式声明您的成员 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 限定符。成员函数定义中使用的签名必须与成员函数声明的签名匹配,而您的则不然。只需将这些参数类型引用设置为stringint,并添加const 限定符,与声明函数的方式一致。

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

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

这是它的定义:

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

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

【讨论】:

  • 不要忘记方法上的const-qualifier。
  • 谢谢大家。我从来没有使用过这个论坛,因为我认为答案不会及时出现,但是,我很惊讶。你们太棒了,非常乐于助人。不幸的是,直到我发现部分问题后才看到您的回复。我让它工作了,但是约翰,谢谢你对对象函数的评论。我根据您的建议对其进行了重新设计,不发送参数,并且程序运行良好。安迪,也谢谢你的回答。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你的方法有签名

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

    但您将其定义为

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

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

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

    【讨论】:

      【解决方案4】:

      将我的 cmets 在其他地方变成答案……

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

      您还需要确保方法上的cv-qualifiers 与声明和定义相同。

      因此,您的声明应该是:

          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++ 的重要组成部分。继续练习!

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-07
          • 2019-09-12
          • 1970-01-01
          • 2016-12-23
          • 2016-06-09
          • 2017-09-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多