Проблемы с первым аргументом, являющимся строкой при перегрузке оператора + в C ++ - PullRequest
4 голосов
/ 07 мая 2010

У меня есть самодельный класс String:

//String.h
String & operator = (const String &);
String & operator = (char*);
const String operator+ (String& s);
const String operator+ (char* sA);
.
.

//in main:
String s1("hi");
String s2("hello");

str2 = str1 + "ok";//this is ok to do 
str2 = "ok" + str1;//but not this way

//Shouldn't it automatically detect that one argument is a string and in both cases?

Ответы [ 4 ]

9 голосов
/ 07 мая 2010

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

String operator +( const String & s1, const String & s2 ) {
    String result( s1 );
    return result += s2;
}

Как и предполагали другие, вы можете перегружать для const char * по возможным причинам эффективности, но единственная функция выше - это все, что вам действительно нужно.

Обратите внимание, что ваш код в том виде, в каком он есть, должен выдавать ошибку:

String s1("hi");
String s2("hello");
str2 = str1 + "ok";    // not OK!!! 

что-то вроде:

warning: deprecated conversion from string constant to 'char*'

в качестве строкового литерала (константа) "ok" - это const char *, а не char *. Если ваш компилятор не выдает это предупреждение, вам следует серьезно подумать об его обновлении.

1 голос
/ 08 мая 2010

На вопрос был дан ответ, поэтому просто несколько замечаний

String & operator = (char*);
const String operator+ (char* sA);

Если вы не изменяете таблицу символов, на которую указывает аргумент (и я так не думаю, это приведет к неопределенному поведению в случае строковых литералов), объявите параметр как const char *. char * позволяет передавать строковый литерал в текущей версии языка, но в следующей он будет недопустимым.

const String operator+ (String& s);
const String operator+ (char* sA);

Это не должны быть методы, как вы знаете, из других ответов, но если они должны были быть, они должны быть const, а не возвращать const String.

String operator+ (const String& s) const;
String operator+ (const char* sA) const;
1 голос
/ 07 мая 2010

Глобальные функции - ваш друг

String operator +( const char* pStr, const String& str )
{
   return String( pStr ) + str;
}
1 голос
/ 07 мая 2010

Нет, это не сработает. Когда вы определяете бинарный оператор как член класса, объект всегда должен быть слева.

Вы можете определить функцию, которая не является членом вашего класса.

что-то вроде:

String operator + ( const char* left, const String& right)
{
    // implementation here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...