2015-04-03 3 views
2

Мне было интересно, можно ли перегрузить << operator в необходимости печати объекта в классе двумя способами.Перегрузка ostream << оператор

К примеру, я строю домино игру, поэтому мне нужно напечатать мои кубики с цифрами: [1][6][6][3] И печатать компьютеры кубов: [ ][ ]

+0

IIRC, она * будет * Перегружаемые ... так что вы хотите сделать, это, вероятно, можно =) – Mints97

+0

Стандартные виды использования [потоковые манипуляторы] (http://en.cppreference.com/w/cpp/io/manip) для печати одних и тех же данных различными способами. –

+0

Ха-ха, я пытаюсь думать о способе, потому что я не знаю, что изменить в параметрах функции, поскольку они оба почти одинаковы, только выполнение отличается :( – imthaking

ответ

3

Вот один пример перегруженных извлечения и вставки операторов:

/* 
    Operator: << 
    This insertion operator outputs the data members of 
    class object instantiation in the format:(x,y) 
    The returning type ostream&, allows 
    you to chain more then one objects to be printed. 
*/ 
ostream& operator<< (ostream& os, class_name& object_name) { 
    return os << '(' << object_name.get_data_memberx() 
      << ',' << object_name.get_data_membery() 
      << ')'; 
} 

/* 
    Operator: >> 
    This extraction operator creates an input stream it 
    inserts to it values for of all the data members of 
    the class passed by reference and returns it. 
    Input format: (x,y) 
*/ 
istream& operator>> (istream& is, class_name& object_name) { 
    char par1, comma, par2; 
    double x, y; 

    is >> par1 >> x >> comma >> y >> par2; 
    // check if any input 
    if(!is) return is; 
    // check for valid input format 
    if (par1 != '(' || comma != ',' || par2 != ')') { 
     // set failbit to indicate invalid input format 
     is.clear(ios_base::failbit); 
     return is; 
    } 
    // assign input values to second argument 
    object_name = class_name(x,y); 
    return is; 
} 

Вы можете использовать приведенный выше пример и изменить форматы в соответствии с желаемым результатом.

+3

Это будет * оператор вставки *. Кроме того, я не думаю, что это отвечает как печатать объект двумя способами: –

+1

Этот оператор «вставляет» объект в поток. Оператор извлечения - тот, который обычно используется с 'cin' – Carcigenicate

+0

@Drew Dormann благодаря исправлению – Ziezi

0

Оператор < <, используемый для cout, фактически является оператором поразрядного сдвига влево, который перегружен, чтобы получить это поведение.

Я действительно не понимаю, чего вы хотите добиться точно (фрагмент кода был бы полезен). Но, похоже, вы хотите перегрузить < < для ostream и типа YourClass. У вас может быть что-то вроде:

void operator<<(ostream str, YourClass cls) { 
    // generate required output 
} 

Обратите внимание, что это действует как обычная функция, просто синтаксис вызова отличается.

+1

Он должен возвращать 'ostream &' not void –

+0

Но что, если я хочу добавить в дополнение к этой другой перегрузке, которая печатает по-другому? Например: X = Y = – imthaking

+0

Затем вы возвращаете ссылку и ссылку на этот ostream, так как @Alejandro Diaz предложил. Обратите внимание, что мой фрагмент кода - это скорее руководство, чем то, что вам действительно нужно – Paul92

2

В то время как другие ответили, как перегрузить operator<<, неясно, как иметь два разных формата. Я рекомендую это: временные объекты.

struct showdomino { 
    domino& d; 
}; 
std::ostream& operator<<(std::ostream& out, showdomino dom) 
{return out << '[' << dom->d.number << ']';} 

struct hidedomino {}; 
std::ostream& operator<<(std::ostream& out, hidedomino dom) 
{return out << "[ ]";} 

Тогда использование неоптимально, как это:

if (show_it) 
    std::cout << showdomino{d} << '\n'; 
else 
    std::cout << hidedomino{} << '\n'; 
+0

Что делает строка: if (show_it)? – imthaking

+1

Это ... стало самой простой линией из всего моего кода. Это просто оператор if в качестве заполнителя для любого вашего кода. –

+0

Ohhhh ок, спасибо! – imthaking

Смежные вопросы