2013-03-17 2 views
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; 
}  
+1

Поскольку это для класса, вам нужно будет научиться правильно ориентироваться в объекте. Ваши функции 'getOrder',' outputDescription' и 'computePrice' не должны иметь никаких аргументов. Они должны использовать переменные-члены, которые вы указали в 'pizza', а не аргументы. Как вы его написали, вы можете удалить переменные-члены пиццы, и ваш код будет работать одинаково. – john

+0

Было бы полезно, если бы вы могли включить полное сообщение об ошибке из своего компилятора в качестве части вашего вопроса. –

+0

Спасибо всем. Я никогда не использовал этот форум, потому что я предполагал, что ответы не придут своевременно, но, мальчик, я удивлен. Вы, ребята, потрясающие и очень полезные. К сожалению, я не видел ваших ответов, пока не нашел часть своей проблемы. Я получил его на работу, но Джон, спасибо за ваш комментарий об объектных функциях. Я переработал его с вашим предложением не отправлять аргументы, и программа отлично работает. – tysowell

ответ

1

Ваш метод имеет сигнатуру

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

но вы определяете его как

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

Для одного, типы параметров не совпадают и вы не квалифицируете последнее как функцию-член const.

Поскольку ваши методы не совпадают, компилятор пытается найти подходящую перегрузку, которая, если не удается найти, следовательно, ошибка.

8

Вы объявляете ваш член 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. Подпись, используемая в определении функции-члена, должна соответствовать сигнатуре объявления функции-члена, а ваша нет. Просто введите эти типы параметров ссылки на string и int и добавьте квалификатор const, в соответствии с тем, как вы заявляете функцию.

Такая же проблема для computePrice() участник функция. Вот как вы объявите его:

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

А вот его определение:

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

Конечно, решение одно и то же.

+1

Не забудьте 'const'-определитель методов. – Johnsyweb

+0

@Johnsyweb: Хорошая добыча! Я отредактирую, спасибо –

+0

Спасибо всем. Я никогда не использовал этот форум, потому что я предполагал, что ответы не придут своевременно, но, мальчик, я удивлен. Вы, ребята, потрясающие и очень полезные. К сожалению, я не видел ваших ответов, пока не нашел часть своей проблемы. Я получил его на работу, но Джон, спасибо за ваш комментарий об объектных функциях. Я переработал его с вашим предложением не отправлять аргументы, и программа отлично работает. Энди, спасибо за ваш ответ. – tysowell

2

Ошибка происходит из-за ваших методов подписи в декларации (файл заголовка) и Defenition разные (вы забыли &)

1

Обращаясь мои комментарии в других местах в ответ ...

Фактическое решение удалить все эти аргументы (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") и аналогичным образом для других size s).

В outputDescription(), следующая строка отсутствует что-то:

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

Научиться читать и понимать ошибки компилятора (и предупреждения) является важной частью обучения C++. Продолжайте практиковать!

0

На ваш вопрос были ответы другие, но я хотел бы указать еще две проблемы с вашим кодом.

  1. функция член void getOrder (string, string, int, int) ; должны использовать ссылки переменных, в противном случае вы не можете установить значения ваших значений членов.

  2. в функции члена double pizza::computePrice, вы должны использовать if (!size.compare("small")) вместо if (size = "small").

Смежные вопросы