将左移运算符 << 重载到对象
Overload left shift operator << to object
我无法重载左移运算符“<<”,因此我可以使用以下代码:
Foo bar;
bar << 1 << 2 << 3;
我的 class Foo 看起来像这样:
class Foo{
private:
vector<int> list;
public:
Foo();
void operator<<(int input);
};
实现方式如下:
void Foo::operator<<(int input)
{
// here i want to add the different int values to the vector
// the implementation is not the problem
}
代码无效 我收到错误“左操作数的类型为 'void'”。当我将 return 类型更改为 Foo& 时,它告诉我 return 某种类型 Foo。问题是我做不到。我缺少对象 bar.
的对象引用
我搜索了很多,但只找到描述输出到 cout 的运算符的页面。
要启用链接,您必须 return 来自操作员的引用。当你写
bar << 1 << 2 << 3;
实际上是
((bar << 1) << 2) << 3;
ie operator<<
在 bar << 1
的结果上调用,参数为 2
.
The problem is I can't. I am missing a object reference of the object bar.
您似乎没有注意到您的 operator<<
是一个成员函数。在 bar
的成员函数中 *this
是对 bar
对象的引用:
#include <vector>
#include <iostream>
class Foo{
private:
std::vector<int> list;
public:
Foo() {}
Foo& operator<<(int input);
void print() const { for (const auto& e : list) std::cout << e << ' ';}
};
Foo& Foo::operator<<(int input)
{
list.push_back(input);
return *this;
}
int main() {
Foo bar;
bar << 1 << 2 << 3;
bar.print();
}
PS:虽然 bar << 1 << 2 << 3;
等结构可以在早于 C++11 的几个库中找到,但如今它看起来有点过时了。您宁愿使用列表初始化或提供 std::initializer_list<int>
构造函数来启用 Foo bar{1,2,3};
.
我无法重载左移运算符“<<”,因此我可以使用以下代码:
Foo bar;
bar << 1 << 2 << 3;
我的 class Foo 看起来像这样:
class Foo{
private:
vector<int> list;
public:
Foo();
void operator<<(int input);
};
实现方式如下:
void Foo::operator<<(int input)
{
// here i want to add the different int values to the vector
// the implementation is not the problem
}
代码无效 我收到错误“左操作数的类型为 'void'”。当我将 return 类型更改为 Foo& 时,它告诉我 return 某种类型 Foo。问题是我做不到。我缺少对象 bar.
的对象引用我搜索了很多,但只找到描述输出到 cout 的运算符的页面。
要启用链接,您必须 return 来自操作员的引用。当你写
bar << 1 << 2 << 3;
实际上是
((bar << 1) << 2) << 3;
ie operator<<
在 bar << 1
的结果上调用,参数为 2
.
The problem is I can't. I am missing a object reference of the object bar.
您似乎没有注意到您的 operator<<
是一个成员函数。在 bar
的成员函数中 *this
是对 bar
对象的引用:
#include <vector>
#include <iostream>
class Foo{
private:
std::vector<int> list;
public:
Foo() {}
Foo& operator<<(int input);
void print() const { for (const auto& e : list) std::cout << e << ' ';}
};
Foo& Foo::operator<<(int input)
{
list.push_back(input);
return *this;
}
int main() {
Foo bar;
bar << 1 << 2 << 3;
bar.print();
}
PS:虽然 bar << 1 << 2 << 3;
等结构可以在早于 C++11 的几个库中找到,但如今它看起来有点过时了。您宁愿使用列表初始化或提供 std::initializer_list<int>
构造函数来启用 Foo bar{1,2,3};
.