Bezdepbonusu7Программирование: статьи и ответы

Вопрос

C++: перегрузка строкового оператора

Автор вопроса: texasbruceОтветов: 3

Могу ли я перегрузить существующую функцию/оператор в существующем классе?

Я пытался сделать:

#include <iostream>
#include <string>
using namespace std;

string& string::operator<<(const string& str) {
  this->append(str);
}

Но это дает мне ошибку:

test.cpp:5: error: too few template-parameter-lists

Как я могу это сделать? Или я не могу?

  • Вы действительно пытаетесь вернуть string& (в отличие от чего-то вроде ostream&)? Вместо того, чтобы вводить синтаксис, я думаю, вам лучше просто делать то, что вы хотите, т.е. если у вас есть std::string с именем x и вы хотите добавить y, используйте для этого существующие механизмы в std::string (например, x += y) без добавления << перегрузка. Если, с другой стороны, это опечатка, и вы действительно хотите печатать в поток, обновите свой вопрос. Kevin Grant 17.07.2012
  • @KevinGrant Ну, это не домашнее задание или рабочий вопрос. Это просто практика перегрузки операторов и классов. texasbruce 17.07.2012
  • @KevinGrant И я думаю, что эти двое не противоречат друг другу? ostream#<< - это еще одна функция, отличная от string#<<, верно? И ‹‹ имеет ассоциативность слева направо, поэтому это не повлияет на cout. texasbruce 17.07.2012
  • Да, operator<< на ostream& предназначено для изменения потока, а не строки; это отличается от того, что вы написали, но я подумал, может быть, вы действительно хотели это сделать. (Гораздо более типично перегружать << для работы с потоком.) Kevin Grant 17.07.2012

c++operator-overloadingc++-standard-library

Ответы

Ответ 1 · рейтинг 6 · Benjamin Lindley

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

string& operator<<(string & lhs, const string & rhs) {
    return lhs += rhs;
}

Ответ 2 · jxh

Я полагаюсь на ответ Бенджамина для создания потокового интерфейса для объекта string. Однако вместо этого вы можете использовать stringstream.

#include <sstream>

std::istringstream ss;
ss << anything_you_want;

std::string s = ss.str(); // get the resulting string
ss.str(std::string());    // clear the string buffer in the stringstream.

Это дает вам потоковый интерфейс, который вы хотите на string, без необходимости определять новую функцию.

Этот метод можно использовать в целом для расширения функциональности string. То есть определение класса-оболочки, который обеспечивает расширенную функциональность, а класс-оболочка также предоставляет доступ к базовому string.

Ответ 3 · Bandula Dharmadasa

Использовать

std::острингстрим

#include <sstream>
#include <iostream>

using namespace std;

int main()
{
    std::ostringstream ss;
    ss << "Hello" << " " << "world";

    std::string s = ss.str();
    ss.str(std::string());

    cout << s << endl;
    return 0;
}

https://onlinegdb.com/rkanzeniI

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы