在 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 的类型是什么。