Одна перегруженная функция, но программа так не видит - PullRequest
1 голос
/ 15 февраля 2011

В следующем коде перегружена функция CandyBarFunc .Первый прототип определяет функцию так, что она изменяет значение структуры.Второй прототип определяет функцию так, чтобы она просто отображала содержимое переданной структуры.Проблема в том, что при запуске консольной программы на экране ничего не появляется, кроме нажатия любой клавиши ... Я попытался отладить его и обнаружил, что первый прототип работает правильно (я добавил функциональность отображения из второго прототипа в первый).) потому что он изменил и отобразил содержимое структуры.Поэтому кажется, что перегрузка не сработала, потому что второй прототип функции не вызывается во время выполнения, потому что на экране консоли ничего не отображается.Я не уверен, что сигнатура плохая, потому что компилятор не жалуется на неоднозначный вызов функции.Я что-то упустил в коде?

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

struct CandyBar
{
    char name[40];
    double weight;
    int calories;
};

void CandyBarFunc(CandyBar & astruct, const char * aname = "Millennium Munch", double aweight = 2.85, int acalories = 350);
void CandyBarFunc(const CandyBar & astruct);

int main(void)
{
    CandyBar MyCandyBar =
    {
        "Hi",
        1.5,
        456
    };
    cout << "1" << endl; 'little debug'
    CandyBarFunc(MyCandyBar); 'suppose to display the contents of MyCandyBar'
    CandyBarFunc(MyCandyBar, "Hello World Candy Bar", 1.25, 200); 'suppose to modify MyCandyBar
    CandyBarFunc(MyCandyBar); 'suppose to display the contents of MyCandyBar again'
    cout << "2"; 'little debug'
    return 0;
}

void CandyBarFunc(CandyBar & astruct, const char * aname, double aweight, int acalories)
{
    strncpy_s(astruct.name,aname,40);
    astruct.weight = aweight;
    astruct.calories = acalories;
    cout << "Name: " << astruct.name << endl; 'not suppose to be here, just for debug'
    cout << "Weight: " << astruct.weight << endl; 'not suppose to be here, just for _ debug'
    cout << "Calories: " << astruct.calories; 'not suppose to be here, just for debug'
}

void CandyBarFunc(const CandyBar & astruct)
{
    cout << "Name: " << astruct.name << endl;
    cout << "Weight: " << astruct.weight << endl;
    cout << "Calories: " << astruct.calories;
}

Упражнение:

Структура CandyBar содержит три члена.Первый участник владеет торговой маркой моноблока.Второй элемент содержит вес (который может иметь дробную часть) моноблока, а третий элемент содержит количество калорий (целочисленное значение) в моноблоке.Напишите программу, которая использует функцию, которая принимает в качестве аргументов ссылку на CandyBar, указатель на символ, double и int и использует последние три значения для установки соответствующих членов структуры.Последние три аргумента должны иметь значения по умолчанию «Millennium Munch», 2.85 и 350. Кроме того, программа должна использовать функцию, которая принимает ссылку на CandyBar в качестве аргумента и отображает содержимое структуры.При необходимости используйте const.

Ответы [ 2 ]

4 голосов
/ 15 февраля 2011

Так как MyCandyBar не является константой, компилятор выбирает первую (ссылка на неконстантную) перегрузку.

Если серьезно, если вы хотите, чтобы одна функция устанавливала свойства, а другая - выводила их., пожалуйста не злоупотребляйте перегрузкой, называя их одинаковыми именами.Просто назовите их по-другому, больше никаких проблем.

Кроме того, в C ++ мы предпочитаем std::string символьным массивам фиксированного размера и символьным указателям.

0 голосов
/ 15 февраля 2011

Поскольку MyCandyBar не является const, он всегда будет пытаться использовать функцию, которая принимает неконстантный CandyBar.Вы можете заставить его вызывать другую функцию, приведя ее к const:

CandyBarFunc((const CandyBar &)MyCandyBar);
...