Перегрузка + добавить два указателя

У меня есть класс String, и я хочу перегрузить +, чтобы добавить два указателя String*. что-то вроде этого не работает:

String* operator+(String* s1, String* s2);

Есть ли способ избежать передачи по ссылке. Рассмотрим этот пример:

String* s1 = new String("Hello");
String* s2 = new String("World");

String* s3 = s1 + s2;

Мне нужно такое дополнение для работы. Пожалуйста, предложите.


person Jeet    schedule 14.06.2010    source источник
comment
Есть ли причина, по которой вы не используете std::string?   -  person Andrew Russell    schedule 14.06.2010
comment
У вас есть опыт работы с Java или C#? Кроме того, зачем вам добавлять указатели на два разных объекта String и какой результат вы ожидаете от s3?   -  person Alerty    schedule 14.06.2010
comment
C++ 101: не используйте указатели, когда они вам не нужны. Тогда вы 1) сможете избежать утечек памяти, 2) получите более краткий и читаемый код и 3) сможете заставить работать дополнение.   -  person jalf    schedule 14.06.2010


Ответы (4)


Вы не можете. Вы не можете перегружать операторы для встроенных типов. В любом случае, зачем вообще использовать указатели? Избегайте динамического размещения, насколько это возможно!

String s1("Hello");
String s2("World");

String s3 = s1 + s2;

Так намного лучше и не течет. Теперь вы можете перегрузить:

String operator+(const String& s1, const String& s2);

как вы желаете. Это, конечно, пустая трата времени, потому что std::string существует. :)

person GManNickG    schedule 14.06.2010
comment
Вы не можете перегружать операторы для встроенных типов. Упоминается ли этот факт в стандарте? Где? - person Aaron S; 14.06.2010
comment
@6pack Это основной принцип языка. C++ должен быть расширяемым, но не изменяемым. - person fredoverflow; 14.06.2010

Вы не можете перегружаться только указателями. У вас должен быть хотя бы один тип класса или перечисляемое значение. Стандартный способ — перегрузить двумя значениями:

String operator+(String s1, String s2);
person R Samuel Klatchko    schedule 14.06.2010

У меня есть класс String, и я хочу перегрузить +, чтобы добавить два указателя String*.

Почему?

что-то вроде этого не работает:

Оператор String*+(String* s1, String* s2);

Это основная функциональность С++. Вы не можете изменить это так.

Есть ли способ избежать передачи по ссылке.

Вы можете передавать по ссылке, указателю или значению.

По значению неэффективен (поскольку временные объекты создаются и копируются без уважительной причины*).

По указателям в этом случае нельзя использовать (добавление указателей — это основная функциональность языка). На самом деле в язык были добавлены ссылки, чтобы совместить эффективность передачи указателей в качестве аргументов (к перегруженным операторам) с удобным синтаксисом передачи значений. Другими словами, ссылки — это языковая функция, созданная с учетом конкретной ситуации. Они являются оптимальным решением.

По ссылке — это обычно принятое решение. Не могли бы вы рассказать нам, почему это не хорошо в вашей ситуации?

Рассмотрим этот пример:

Строка* s1 = новая строка ("Привет"); Строка* s2 = новая строка ("Мир");

Строка* s3 = s1 + s2;

Это похоже на код Java или C#, переведенный в синтаксис C++. Не делайте этого. Этот менталитет называется «Я могу программировать на C на любом языке», и обычно он сочетает врожденные проблемы любого менталитета, который вы пытаетесь перенести на C++, с присущими C++ проблемами, без преимуществ ни того, ни другого.

Я не говорю, что вы это делаете, я просто говорю, что вы этого еще не делаете :).

Мне нужно такое дополнение для работы. Пожалуйста, предложите.

Вы можете определить дополнительный класс интеллектуальных указателей для хранения ваших строк. Для этого не нужно делать многого (достаточно будет struct ptr { String* _value; /* add your syntax sugar and operators here */ }. Тем не менее, по-прежнему плохая идея делать это только ради добавления указателей.

person utnapistim    schedule 14.06.2010

Не уверен, что вы уже поняли это, но String* s3 = s2 + s1; добавляет 2 указателя и не 2 строки, и вы никак не можете изменить здесь семантику.

Вы можете иметь свой собственный класс String, но, пожалуйста, убедитесь, что это именно то, что вам действительно нужно. В самом общем случае достаточно std::string.

И пока вы это делаете, постарайтесь не слишком сильно отклоняться, если, конечно, нет уважительной причины из-за открытого API аналогичных классов из стандарта. Итак, возможно, вы могли бы сделать оператор + с 1 строкой и 1 строкой *, но вы действительно этого хотите? Если людям нужно поддерживать ваш код, и они приходят из фона STL/Boost, ожидается, что все будет работать определенным образом. Это значительно упрощает отладку.

Арпан

person Fanatic23    schedule 14.06.2010