1

次のエラーが発生し続けます。

"overloaded function not found in 'pizza'"

これは、以下の機能を参照しvoid outputDescriptionています。double computePrice何が悪いのかわかりません。

私は C++ の初心者ですが、コードは正しく見えます。これは授業用です。少なくとも 1 つのミューテーター関数と 1 つのアクセサー関数、価格を計算する関数、およびピザの説明を出力する関数が必要です。

これが私のコードです:

#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修飾子を追加するのを忘れました。メンバー関数定義で使用されるシグニチャは、メンバー関数宣言のシグニチャと一致する必要がありますが、一致しません。これらのパラメーター型をとに参照し、関数を宣言する方法と一貫して修飾子を追加するだけです。stringintconst

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

あなたのメソッドには署名があります

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

しかし、あなたはそれを次のように定義しています

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

1つは、パラメータータイプが一致せず、後者をconstメンバー関数として修飾していないことです。

メソッドが一致しないため、コンパイラは適切なオーバーロードを見つけようとしますが、見つけられない場合はエラーになります。

于 2013-03-17T22:41:57.590 に答える
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()混同しています。それはそうあるべきであり、他の s についても同様です)。===if (size = "small")if (size == "small")size

ではoutputDescription()、次の行に何かが欠けています。

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

コンパイラ エラー (および警告) を読んで理解することは、C++ の学習に不可欠です。練習を続けてください!

于 2013-03-17T23:51:00.287 に答える
0

あなたの質問は他の人からよく答えられていますが、あなたのコードには他に 2 つの問題があることを指摘したいと思います。

  1. メンバー関数void getOrder (string, string, int, int) ;は変数の参照を使用する必要があります。そうしないと、メンバー値の値を設定できません。

  2. メンバー関数では、代わりにdouble pizza::computePrice使用する必要があります。if (!size.compare("small"))if (size = "small")

于 2016-04-24T21:13:48.390 に答える