在 ABC C++ 中修改重载的 << 运算符
Modifing overloaded << operator in ABC C++
我目前正在开发一个读取 json 数据并将输出显示到屏幕的程序。我以令人满意的格式显示结果,但重载的 << 运算符无法按我需要的方式工作。这是程序的详细信息。
包含方程列表的 json 数据的 istream& 被传递给工厂 class。工厂 make() 方法读取数据并根据 json 文件中的方程数据创建 std::list of std::unique_ptr。
ABC 是一个 class 命名的 IEquation。 IEquation派生了一个叫做EquationBase的class,从EquationBase派生了另外四个实现加减乘除的classes。
在 classes 的最后,实现了一个 output() 方法。这个输出方法写法如下
void AddEquation::output(std::ostream& os)
{
os << getLeftNumber() << " + "
<< getRightNumber() << " = " << getAnswer() << std::endl;
}
在IEquation中,流插入运算符<<重载如下。
// Note: IEquation.output is called to do the work, this method is just a wrapper.
friend std::ostream& operator<<(std::ostream& os, IEquation& eq)
{
eq.output(os);
return os;
}
我需要以下代码才能在 main
中工作
void printEquations(std::list<std::unique_ptr<IEquation>>& equations)
{
for (auto &eq : equations)
{
std::cout << eq;
}
}
目前,此代码显示方程中每个方程的内存地址。我可以引用 eq 并让它显示我需要的内容,但我想知道为什么上面的 printEquations 函数不能按预期工作,以及除了取消引用 eq 之外我还能做什么来修复它。
范围循环正在遍历容器中的对象。并且由于容器equations
中的对象是指针,那么循环中的eq
将是一个指针。
重载的 operator<<
用于 IEquation
对象 (或者更确切地说是对它们的引用),而不是指向 IEquation
的指针,这是为什么需要在循环内取消引用指针 eq
。
如果你看到例如this range for
reference 你会看到正常的非范围 for
循环等价。
对于您的函数,等效的正常 for
循环类似于
for (std::list<std::unique_ptr<IEquation>>::iterator iter = equations.begin(); iter != equations.end(); ++iter)
{
std::unique_ptr<IEquation>& eq = *iter;
std::cout << eq;
}
在上面的循环中很清楚 eq
的类型是什么。
我目前正在开发一个读取 json 数据并将输出显示到屏幕的程序。我以令人满意的格式显示结果,但重载的 << 运算符无法按我需要的方式工作。这是程序的详细信息。
包含方程列表的 json 数据的 istream& 被传递给工厂 class。工厂 make() 方法读取数据并根据 json 文件中的方程数据创建 std::list of std::unique_ptr。
ABC 是一个 class 命名的 IEquation。 IEquation派生了一个叫做EquationBase的class,从EquationBase派生了另外四个实现加减乘除的classes。 在 classes 的最后,实现了一个 output() 方法。这个输出方法写法如下
void AddEquation::output(std::ostream& os)
{
os << getLeftNumber() << " + "
<< getRightNumber() << " = " << getAnswer() << std::endl;
}
在IEquation中,流插入运算符<<重载如下。
// Note: IEquation.output is called to do the work, this method is just a wrapper.
friend std::ostream& operator<<(std::ostream& os, IEquation& eq)
{
eq.output(os);
return os;
}
我需要以下代码才能在 main
中工作void printEquations(std::list<std::unique_ptr<IEquation>>& equations)
{
for (auto &eq : equations)
{
std::cout << eq;
}
}
目前,此代码显示方程中每个方程的内存地址。我可以引用 eq 并让它显示我需要的内容,但我想知道为什么上面的 printEquations 函数不能按预期工作,以及除了取消引用 eq 之外我还能做什么来修复它。
范围循环正在遍历容器中的对象。并且由于容器equations
中的对象是指针,那么循环中的eq
将是一个指针。
重载的 operator<<
用于 IEquation
对象 (或者更确切地说是对它们的引用),而不是指向 IEquation
的指针,这是为什么需要在循环内取消引用指针 eq
。
如果你看到例如this range for
reference 你会看到正常的非范围 for
循环等价。
对于您的函数,等效的正常 for
循环类似于
for (std::list<std::unique_ptr<IEquation>>::iterator iter = equations.begin(); iter != equations.end(); ++iter)
{
std::unique_ptr<IEquation>& eq = *iter;
std::cout << eq;
}
在上面的循环中很清楚 eq
的类型是什么。