Пожалуйста, объясните этот синтаксис C ++, который кажется неполным или не имеет назначения? - PullRequest
4 голосов
/ 05 августа 2011
reply_form::reply_form()
{
    using cppcms::locale::translate;
    author.message(translate("Author"));
    comment.message(translate("Comment"));
    send.value(translate("Send"));
    *this + author + comment + send;
    author.limits(1,64);
    comment.limits(1,256);
}

В данном определении конструктора кто-нибудь, пожалуйста, объясните, что означает этот синтаксис или его предполагаемое использование и преимущества:

*this + author + comment + send;

Мне кажется, что это конкатенация / сложение, которое выполняется без привязки к чему-либо, и это действительно смущает меня, так как я не могу понять его цель.

Я провел хороший поиск в сети с этой проблемой, но, вероятно, я не использую правильный термин для его поиска, так как не знаю, как именно этот тип синтаксиса называется.

Мне кажется, что это часть последних функций C ++ 1x, но я не уверен, поэтому не могу найти для него нужную книгу. Наконец выбрал stackoverflow для спасения: -)

EDIT:

Самое важное, что я мог бы предоставить, - это объявление в заголовочном файле:

struct reply_form : public cppcms::form {
    cppcms::widgets::text author;
    cppcms::widgets::textarea comment;
    cppcms::widgets::submit send;
    reply_form();
};

EDIT2: Revision2 (снова исправлено после проверки комментариев)

Хорошо, я смог отследить оператор + вещь и выяснил, как она была перегружена:

    inline form &operator + (form &f)
    {
        add(f);
        return *this;
    }

Так что это был случай перегрузки оператора. Спасибо за Ваш ответ. Я был недавно перенесен на C ++ и обнаружил некоторые странные вещи, как я разместил в этой теме: Объясните пустые функции класса в C ++ , которые мне показались как многофункциональный список с пустым телом, но позже я понял это как синтаксис и способ объявления переменной или вызова конструктора базового класса.

Спасибо за ваши ответы, это было очень полезно и очень быстро!

Ответы [ 5 ]

9 голосов
/ 05 августа 2011

Поскольку мы не знаем, что такое reply_form, на этот вопрос невозможно ответить в завершении.Ваш вопрос больше о программе, чем о C ++.

Строка *this + author + comment + send; может иметь побочные эффекты, если reply_form::operator+ имеет побочные эффекты.

Обычно,однако, это не так (потому что, как вы обнаружили, это не имеет интуитивного смысла).Итак, либо это ошибка в дизайне класса, либо строка должна выглядеть примерно так: *this += author + comment + send;.

5 голосов
/ 05 августа 2011

Скорее всего, беглый оператор перезаписывается для добавления полей в reply_form.Например,

reply_form& reply_form::operator+ (const field& value)
{
    this->add_field (value);
    return *this;
}
3 голосов
/ 10 августа 2011

Небольшая вещь:

Этот код

reply_form::reply_form()
{
    using cppcms::locale::translate;
    author.message(translate("Author"));
    comment.message(translate("Comment"));
    send.value(translate("Send"));
    *this + author + comment + send;
    author.limits(1,64);
    comment.limits(1,256);
}

Может и должен быть записан как:

reply_form::reply_form()
{
    using cppcms::locale::translate;

    author.message(translate("Author"));
    author.limits(1,64);

    comment.message(translate("Comment"));
    comment.limits(1,256);

    send.value(translate("Send"));

    add(author);
    add(comment);
    add(send);

}

И на самом деле новый код должен использовать это более многословно, но ясноAPI.

operator+ сохраняется для обратной совместимости и используется в некоторых устаревших примерах.

3 голосов
/ 05 августа 2011

Поскольку в C ++ почти все операторы могут быть перегружены, это может означать что угодно.В действительности рассматриваемая строка представляет собой последовательность вложенных вызовов функции operator+:

operator+(operator+(operator+(*this, author), comment), send);

Вам необходимо посмотреть, как класс reply_form перегружен operator+.

0 голосов
/ 05 августа 2011

Например,

reply_form& operator+(reply_form& lValue,const reply_form& rValue);

будет работать правильно в этом случае.

...