我有一个班级:
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);
};
我尝试了很多方法来实现info函数。但是没有一个成功。
我想在主要功能中使用它
Matrix<int> M(10,20);
cout<<info<<M;
我想输出Matrix类的cols和行信息。
我已经尝试了很多时间来实现朋友类信息,但失败了。
任何人都可以告诉我怎么做?
抱歉,我忘了把&lt;&lt;超载部分。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;
}
我的&lt;&lt;操作有趣。
但是当我想使用信息时,我遇到了错误。
我不确定,如何将自己的类型操纵器实现为友元函数。 我谷歌一些,但他们不是朋友的功能。而且,它是一种模板 功能
这就是我的意思:
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 :(得分: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
这样的通用名称。
但话说回来,所有这些都是不必要的。只需使用您拥有的<<
覆盖即可。
答案 1 :(得分: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 :(得分:0)
我相信只需创建ostream& operator<<(ostream& os);
作为Matrix类的成员即可。然后你可以去cout << M << endl;
答案 3 :(得分:0)
您应该尝试重载输出运算符。点击here获取有关如何操作的信息。如果您发布更新的代码,我会在必要时为您提供更多帮助。