伙计们,我是C ++的新手,并且对此运算符有疑问:(在stackoverflow中也是新功能)
这是我的课程TestList:
class TestList{
public:
TestList() : listItems(10), position(0){};
TestList(int k) : listItems(k), position(0){};
int listItems;
int position;
std::vector<int> arr;
};
//my current operator is: What should be changed?
ostream& operator <<(ostream&, const TestList& tlist, int input){
os << tlist.arr.push_back(input);
return os;
}
//
int main() {
testList testlist(5);
testlist << 1 << 2 << 3; //how should I overload the operator to add these number to testlist.arr ?
return 0;
}
我希望有人能帮助我或给我任何提示? :)
答案 0 :(得分:1)
其他答案是绝对正确的,我只想在operator<<
上说些普通话。由于它始终是二进制运算符,因此它始终具有签名T operator<<(U, V)
,因此它必须有两个自变量。自链条
a << b << c;
被评估为
(a << b) << c;
// That calls
operator<<(operator<<(a, b), c);
类型T
和U
通常应该相同,或至少兼容。
此外,将operator<<
的结果分配给某物(例如result = (a << b)
)是可能的,但很奇怪。一个好的经验法则是“我的代码不奇怪”。因此,类型T
应该主要是引用(所以X&
),因为否则它将仅是未使用的临时副本。在大多数情况下,这是毫无用处的。
因此,在所有情况的90%中,您的operator<<
应该具有签名
T& operator<<(T&, V);
答案 1 :(得分:0)
我想你是说以下
TestList & operator <<( TestList &tlist , int input )
{
tlist.arr.push_back( input );
return tlist;
}
这是一个演示程序
#include <iostream>
#include <vector>
class TestList{
public:
TestList() : listItems(10), position(0){};
TestList(int k) : listItems(k), position(0){};
int listItems;
int position;
std::vector<int> arr;
};
TestList & operator <<( TestList &tlist , int input )
{
tlist.arr.push_back( input );
return tlist;
}
std::ostream & operator <<( std::ostream &os, const TestList &tlist )
{
for ( const auto &item : tlist.arr )
{
std::cout << item << ' ';
}
return os;
}
int main()
{
TestList testlist(5);
testlist << 1 << 2 << 3;
std::cout << testlist << '\n';
return 0;
}
程序输出为
1 2 3
您甚至可以编写代替这两个语句的
testlist << 1 << 2 << 3;
std::cout << testlist << '\n';
只有一条语句
std::cout << ( testlist << 1 << 2 << 3 ) << '\n';
请注意声明中有错字
testList testlist(5);
应该有
TestList testlist(5);