制作新物品的正常方法:
std::string date1 = "10/1/2010"; Date d1(stringToChar(date1);
但我无法弄清楚如何在结构中使用它。结构:
struct RecPayments
{
std::string name;
Date datemake();
float cost;
};
试着像这样使用它:
void addRecurring()
{
//New recurring payment
RecPayments * newPaymentItem = new RecPayments;
//Set recurring payment properties
newPaymentItem->name = "Test Payment";
newPaymentItem->datemake(stringToChar("4/12/2011"));
newPaymentItem->cost = 5;
}
收到错误:
error: no matching function for call to ‘RecPayments::datemake(const char*)
这样做的正确方法是什么?
答案 0 :(得分:5)
好吧,编译器是对的。你使用struct的方式给了你(实际上)一个类。您声明了一个函数RecPayments::datemake()
,但从未在任何地方定义它。更重要的是,你甚至没有调用你创建的这个版本的函数 - 你发送了一个它没想到的参数。
您需要删除您声明的datemake变量中的()
,或者从中创建一个完整的函数。我不确定你想问哪一个。
答案 1 :(得分:2)
()
中的大括号Date datemake();
让编译器感到困惑。
删除它们。
如果你想用非默认的c'tor在Date
里面显式创建addRecurring()
对象,那么把它作为一个指针并创建它。
struct RecPayments
{
std::string name;
Date* date;
float cost;
};
void addRecurring()
{
//New recurring payment
RecPayments * newPaymentItem = new RecPayments;
//Set recurring payment properties
newPaymentItem->name = "Test Payment";
newPaymentItem->date = new Date(stringToChar("4/12/2011"));
newPaymentItem->cost = 5;
}
显然,当您使用new
时,您现在也需要某处delete
或使用智能指针..
答案 2 :(得分:1)
此
std::string date1 = "10/1/2010";
是使用重载运算符=
的初始化。
此
Date d1(stringToChar(date1);
是构造函数的初始化。
在
struct RecPayments
{
std::string name;
Date datemake();
float cost;
};
Date datemake();
是函数的声明,它返回Date
,而不是Date
类型的成员字段。所以你需要删除那些括号。
另外
newPaymentItem->datemake(stringToChar("4/12/2011"));
是一个函数调用,但你真正想做的就是一个赋值。所以它应该更改为newPaymentItem->datemake = stringToChar("4/12/2011");
后者意味着您的Date
类具有适当的运算符=
重载。如果没有超载,那么您可能会说newPaymentItem->datemake = Date(stringToChar("4/12/2011");)
在这种情况下会自动重载运算符=
。
答案 3 :(得分:1)
Date datemake();
这被定义为不带参数的函数。当你把它称为
时newPaymentItem->datemake(stringToChar("4/12/2011"));
你将字符串从stringToChar()传递给你的函数datemake()。
您可以做的是首先在结构中创建一个Date变量
Date date;
然后将其值指定为
newPaymentItem->date = stringToChar("4/12/2011");