Модификация перегруженного оператора << в AB C C ++ - PullRequest
0 голосов
/ 30 апреля 2020

В настоящее время я работаю над программой, которая читает json данные и отображает вывод на экран. У меня есть результаты, отображаемые в формате, который является удовлетворительным, но перегруженный оператор << не работает так, как мне нужно. Вот подробности программы. </p>

Данные istream & of json, содержащие список уравнений, передаются в заводской класс. Метод фабрики make () считывает данные и создает std :: list из std :: unique_ptr на основе данных уравнения в файле json.

AB C - это класс с именем IEquation. Класс под названием EquationBase получен из IEquation, а еще четыре класса получены из EquationBase, которые реализуют сложение, вычитание, умножение и деление. В финале для классов реализован метод output (). Этот метод вывода записывается следующим образом.

void AddEquation::output(std::ostream& os)
{
   os << getLeftNumber() << " + "
      << getRightNumber() << " = " << getAnswer() << std::endl;
}

В IEquation оператор вставки потока << перегружается следующим образом. </p>

// 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, чтобы исправить это.

1 Ответ

1 голос
/ 30 апреля 2020

Ранжированный l oop перебирает объекты в контейнере. А поскольку объекты в контейнере equations являются указателями, то eq внутри l oop будет указателем.

Перегруженный operator<< предназначен для IEquation объектов (точнее ссылки на них), а не для указателей на IEquation, поэтому вам нужно разыменовать указатель eq внутри l oop.


Если вы видите, например, этот диапазон for ссылка вы увидите нормальный недиапазон for l oop эквивалентности.

Для вашей функции эквивалентная нормальная for l oop будет чем-то как

for (std::list<std::unique_ptr<IEquation>>::iterator iter = equations.begin(); iter != equations.end(); ++iter)
{
    std::unique_ptr<IEquation>& eq = *iter;

    std::cout << eq;
}

В приведенном выше l oop совершенно ясно, какой тип eq на самом деле.

...