оператор перегрузки <<в классе в C++

Я просто хотел резюмировать опции, упомянутые прежде, добавляя некоторые новые:

  1. пустой указатель возврата
  2. выдает Исключение
  3. , используют шаблон несуществующего объекта
  4. , предоставляют булев параметр Вам метод, таким образом, вызывающая сторона может, выбрал, если он хочет, чтобы Вы выдали исключение
  5. , обеспечивают дополнительный параметр, таким образом, вызывающая сторона может установить значение, которое он возвращает, если никакое значение не найдено

, Или Вы могли бы объединить эти опции:

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

Object findObjectOrNull(String key);
Object findObjectOrThrow(String key) throws SomeException;
Object findObjectOrCreate(String key, SomeClass dataNeededToCreateNewObject);
Object findObjectOrDefault(String key, Object defaultReturnValue);

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

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

5
задан aaronstacy 29 July 2009 в 14:41
поделиться

3 ответа

Как мне перегрузить оператор << для my_struct ТОЛЬКО внутри класса?

Определите его как

static std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...

или

namespace {
    std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...
}

в файле .cpp в который вы реализуете MyClass .

РЕДАКТИРОВАТЬ: Если вам действительно, действительно нужна область видимости класса и ничего больше, тогда определите ее как частную статическую функцию в указанном классе. Он будет в области видимости только этого класса и его подклассов. Он скроет все остальные пользовательские operator << , определенные для несвязанных классов (опять же, только внутри класса и его подклассов), если они не могут быть найдены с помощью ADL или не являются членами ] std :: ostream уже.

9
ответ дан 18 December 2019 в 07:55
поделиться

Если под «только перегруженным в My_Class» вы имеете в виду только видимый / используемый моим классом, вы можете использовать перегрузку, не являющуюся членом, которая видна только My_Class. Например,

   struct my_struct {
      int a;
      char c;
   };

   class My_Class
   {
      publiC:
         My_Class();
   }

Затем в My_Class.cpp:

namespace {
    ostream& operator(ostream& os, const my_struct& mystruct ) {
         os << mystruct.a << mystruct.c;
    }
}
1
ответ дан 18 December 2019 в 07:55
поделиться

Не использовать оператор <<. Используйте именованную функцию-член и сделайте ее закрытой.

class My_Class
{
  public:
    My_Class();
 private:
    void Print( ostream & os, const my_struct & m );
};

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

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

10
ответ дан 18 December 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: