一个重载函数,但程序没有这样看

时间:2011-02-15 18:18:18

标签: c++ overloading

以下代码重载了 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结构包含三个成员。第一个成员拥有该品牌   糖果酒吧的名字。第二个成员保持重量(可能有一个分数   糖果条的第一部分,第三个成员保持卡路里的数量(整数   价值)在糖果吧。编写一个使用函数的程序,该函数作为参数a   引用CandyBar,一个指向char的指针,一个double和一个int,并使用最后三个   值以设置结构的相应成员。最后三个论点   应具有默认值“Millennium Munch”,2.85和350.此外,该程序   应该使用一个函数来引用CandyBar作为参数并显示   结构的内容。在适当的地方使用const。

2 个答案:

答案 0 :(得分:4)

由于MyCandyBar不是const,编译器会选择第一个(引用非const)重载。

但严重的是,如果你想要一个函数来设置属性而另一个函数要打印出来,不要滥用重载,只要给它们相同的名字。只是用不同的名字命名,不再有问题。

另外,在C ++中,我们更喜欢std::string到固定大小的字符数组和字符指针。

答案 1 :(得分:0)

由于MyCandyBar不是const,它总是会尝试使用接受非const CandyBar的函数。您可以通过将其强制转换为const来强制它调用另一个函数:

CandyBarFunc((const CandyBar &)MyCandyBar);