Возвращаемое значение для функции оператора << класса пользовательских строк в C ++ - PullRequest
3 голосов
/ 09 августа 2009

Я пытаюсь создать свой собственный std :: string wrapper для расширения его функциональности. Но у меня возникла проблема при объявлении оператора <<. Вот мой код: </p>

мой класс пользовательских строк:

class MyCustomString : private std::string
{
public:
  std::string data;
  MyCustomString() { data.assign(""); }
  MyCustomString(char *value) { data.assign(value); }
  void Assign(char *value) { data.assign(value); }
  // ...other useful functions
  std::string & operator << (const MyCustomString &src) { return this->data; }
};

Основная программа:

int main()
{
  MyCustomString mystring("Hello");
  std::cout << mystring; // error C2243: 'type cast' : conversion from 'MyCustomString *' to 'const std::basic_string<_Elem,_Traits,_Ax> &' exists, but is inaccessible

  return 0;
}

Я хотел, чтобы cout рассматривал класс как std :: string, так что мне не нужно было делать что-то вроде:

std::cout << mystring.data;

Буду признателен за любую помощь!

Спасибо.

Просто к сведению: моя IDE - Microsoft Visual C ++ 2008 Express Edition.

Ответы [ 4 ]

6 голосов
/ 09 августа 2009

Если вы посмотрите, как объявлены все потоковые операторы, они имеют вид:

ostream& operator<<(ostream& out, const someType& val );

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

ostream& operator<< (ostream& out, const MyCustomString& str )
{
    return out << str.data;
}

Обратите внимание, что если ваш объект «data» был закрытым, что, как говорит базовый ООП, вероятно, должен, вы можете объявить вышеуказанный оператор внутри себя как функцию «friend». Это позволит ему получить доступ к закрытой переменной данных.

3 голосов
/ 09 августа 2009

Вам нужна отдельно стоящая функция (друг вашего класса, если вы сделаете свой data личным, как вы, вероятно, должны!)

inline std::ostream & operator<<(std::ostream &o, const MyCustomString&& d)
{
    return o << d.data;
}
2 голосов
/ 09 августа 2009

Во-первых, у вас, похоже, проблема с определением MyCustomString. Он наследуется в частном порядке от std::string, а также содержит экземпляр самого std::string. Я бы удалил одно или другое.

Предполагая, что вы реализуете новый строковый класс и хотите иметь возможность выводить его, используя std::cout, вам понадобится оператор приведения, чтобы вернуть строковые данные, которые std::cout ожидает:

operator const char *()
{
    return this->data.c_str();
}
1 голос
/ 09 августа 2009

Это не то, как вы перегружаете оператор <<. Вам нужно передать ссылку на ostream и вернуть ее (чтобы вы могли сложить несколько <<, как <code>std::cout << lol << lol2).

ostream& operator << (ostream& os, const MyCustomString& s);

Тогда просто сделайте это:

ostream& operator << (ostream& os, const MyCustomString& s)
{
   return os << s.data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...