2010-05-26 2 views
0

У меня есть класс:C++ манипулятор

template<class T> 
class matrix 
{ 
private: 
    int COLS,ROWS; 
public: 
    inline matrix(int r,int c){ 
     this->COLS=r; 
     this->ROWS=c; 
    } 

    template<class T2> 
    friend ostream& info(ostream& os); 
}; 

я пытался во многих способах реализации информации function.but никто не удастся.

я хочу использовать его в основной функции

Matrix<int> M(10,20); 

cout<<info<<M; 

я хочу из положить COLS Класс Matrix и информацию строк.

Я пробовал столько раз в реализации информации о классе друзей, но не смог.

любой может сказать мне, как это можно сделать?

Извините, я забыл поставить перегрузочную деталь < <.

template<class T2> 
friend ostream& operator<< (ostream &out,matrix<T2> &cMatrix); 

реализация:

template<class T2> 
ostream & operator<<(ostream &out, matrix<T2> &cMatrix) { 
    out<<cMatrix.getCOLS();// sorry for didn't put the get function, it's not easy to put code line by line here. 
    out<<cMatrix.getROWS(); 
    return out; 
} 

< < мой эксплуатации работ удовольствие.

но когда я хочу использовать информацию, я получил ошибки.

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

вот что я Тринг:

template<class T2> 
ostream& info(ostream& os,matrix<T2> &cMatrix) 
{ 
    int cols=cMatrix.getCOLS(); 
    int rows=cMatrix.getROWS(); 
    os<<rols<<"X"<<rows<<" matrix "<<endl; 
    return os; 
} 
+0

Не забудьте правильно отпечатать свой исходный код. – Phong

+0

Зачем вам нужен манипулятор? Свободная или членская функция будет намного проще. Другой альтернативой будет использование [прокси-класса] (http://stackoverflow.com/questions/535444/custom-manipulator-for-c-iostream). –

+0

hostly, я tring, чтобы выполнить одно из моих заданий. Учитель позволяет нам практиковать манипулятор. Итак, он позволил мне реализовать это как необходимую функциональность. – robert

ответ

0

Я считаю, что это может работать, просто создавая в качестве члена вашего класса Matrix. Тогда вы можете пойти cout << M << endl;

+1

Вы не хотите 'operator <<' член класса Matrix, потому что вызывающая последовательность будет 'M << cout' –

0

Вы должны попытаться перегрузить выходной оператор. Нажмите here для получения информации о том, как это сделать. Если вы разместите обновленный код, я поможем вам, если потребуется, еще немного.

1

Один из возможных подходов, если вам не нужно быть липкими:

class InfoPrinter { 
    std::ostream& os_; 
public: 
    InfoPrinter(std::ostream& os) : os_(os) {} 
    template<class T> std::ostream& operator<<(const Matrix<T>& m) { 
     return os_ << m.getCols() << ", " << m.getRows(); 
    } 
}; 

struct Info {} info; 

InfoPrinter operator<<(std::ostream& os, const Info&) { 
    return InfoPrinter(os); 
} 

Использования будет, например:

std::cout << info << Matrix<int>(2,3); 
2

Если вы хотите эмулировать манипулятор как cout << setw(8) << …, нет никакого стандарта для этого, и это невозможно с помощью только функции.

Манипуляторы, которые принимают аргументы, являются заводскими функциями, которые создают специальные функторы. Возвращаемый объект запоминает параметр манипулятора и реализует operator<<, чтобы использовать его.

В примере кода есть два отдельных подхода.

cout<<info<<M; // info changes cout somehow? 

и

ostream& info(ostream& os,matrix<T2> &cMatrix) // info behaves like operator<<? 

Первый подход, при добавлении в состояние cout, возможно, но слишком сложным для этого.

Второй подход вызывает вопрос, почему вы не просто назовите его operator<< и сделайте это.

В качестве альтернативы, вы можете позвонить второй непосредственно: info(cout << "hello", M) << "world";

Если вы ищете синтаксис cout << info(M), который больше похож на манипуляторе, вам нужно что-то вроде

struct print_info { 
    Matrix &m; 
    print_info(Matrix &in) : m(in) {} 
    friend ostream &operator<<(ostream &str, print_info const &pi) { 
     str << pi.m.getcols(); 
     … 
    } 
}; 

print_info info(Matrix &in) 
    { return print_info(in); } 

Собственно функция не нужно, но лучше не давать классу с такой специфической функцией что-то такое общее имя, как info.

Но опять же, все это не нужно. Просто используйте переопределение <<, которое работает.

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