如何将一个对象放入结构体中

5

创建新对象的常规方法:

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;
}

收到错误信息: < p > 错误:没有匹配的函数调用'RecPayments::datemake(const char*)'< /p > 请问正确的做法是什么?

1
C和C++不是同一种东西。 - R. Martinho Fernandes
@R.MartinhoFernandes 我正在使用的Date类是用C语言编写的,所以由于我混合使用了C和C++,我认为将两者都添加为标签是合适的。 - natli
@natili,这个类不是C结构体,因为它的成员包含非平凡构造函数和一个函数。 - Mooing Duck
哎呀,你在堆上创建的指针越多,以后管理它们就越头疼。 - Roman Byshko
4个回答

5
好的,编译器是正确的。你使用结构体的方式实际上给你提供了一个类。你声明了一个函数RecPayments::datemake(),但从未在任何地方定义它。更重要的是,你甚至没有调用你创建的这个函数版本--你发送了一个它不希望收到的参数。
你需要删除你已经声明的datemake变量中的(),或者将其完整定义为一个函数。根据问题描述,我不确定你想要哪一个。

4
你的 Date datemake(); 语句中的小括号 () 会让编译器产生困惑。
只需要将它们删除即可。
如果你想在 addRecurring() 中显式创建非默认构造函数的 Date 对象,则需要将其设置为指针并进行创建。
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,或者使用智能指针。

这并不是对问题的回答。 - Oliver Charlesworth

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");)在这种情况下,自动重载运算符=将被使用。


1
Date datemake();

这被定义为一个不带参数的函数。当您调用它时

newPaymentItem->datemake(stringToChar("4/12/2011"));

你正在将字符串从stringToChar()传递到datemake()函数中。

你可以先在你的结构体中创建一个日期变量,如下:

Date date;

然后将其赋值为

newPaymentItem->date = stringToChar("4/12/2011");

只有在 Date 类型可用复制构造函数/赋值运算符的情况下才能正常工作。 - Kashyap
@thekashayap 先生,我不知道 Date 类的定义。我只是假设它有一个复制构造函数。我对 MFC 类没有太多的了解(如果 Date 是 MFC 的话)。 - Veer Bahadur Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接