以下代码重载了 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。
答案 0 :(得分:4)
由于MyCandyBar
不是const,编译器会选择第一个(引用非const)重载。
但严重的是,如果你想要一个函数来设置属性而另一个函数要打印出来,请不要滥用重载,只要给它们相同的名字。只是用不同的名字命名,不再有问题。
另外,在C ++中,我们更喜欢std::string
到固定大小的字符数组和字符指针。
答案 1 :(得分:0)
由于MyCandyBar不是const,它总是会尝试使用接受非const CandyBar的函数。您可以通过将其强制转换为const来强制它调用另一个函数:
CandyBarFunc((const CandyBar &)MyCandyBar);