Как разместить объект в структуре - PullRequest
4 голосов
/ 04 декабря 2011

Обычный способ сделать новый объект:

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*)

Как правильно это сделать?

Ответы [ 4 ]

5 голосов
/ 04 декабря 2011

Ну, компилятор прав.То, как вы использовали структуру, дало вам (по сути) класс.Вы объявили функцию RecPayments::datemake(), но нигде не определяли ее.Более того, вы даже не вызывали эту версию созданной вами функции - вы отправили с ней аргумент, которого она не ожидала.

Вам необходимо удалить () в переменной datemake, которую выобъявили, или сделайте из него полную функцию.Я не уверен из вопроса, который вы хотели.

2 голосов
/ 04 декабря 2011

Скобки () в вашем Date datemake(); сбивают с толку компилятор.

Просто удалите их.

Если вы хотите явно создать объект 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 где-то еще ... или используйте умные указатели..

1 голос
/ 04 декабря 2011
Date datemake();

Это определяется как функция, которая не принимает аргументов.Когда вы называете это как

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

, вы передаете строку из stringToChar () в функцию datemake ().

Сначала вы можете создать переменную Date в вашей структуре как

Date date;

и затем присвоить ему значение как

newPaymentItem->date = stringToChar("4/12/2011");
1 голос
/ 04 декабря 2011

std::string date1 = "10/1/2010";

- это инициализация с использованием перегруженного оператора =.

.

Date d1(stringToChar(date1);

- инициализация с помощью конструктора.

In

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");), в этом случае будет использоваться автоматически перегруженный оператор =.

...