0

如果我有这个代码

struct Unit{
    int coef; //coefficient
    int exp;  //exponent
};

class Func: private std::list<Unit>{
    public:
        Func();
        friend std::ostream& operator<<(std::ostream &, Func);
};

如何打印出来?我尝试使用这里的概念:http ://www.cplusplus.com/forum/beginner/5074/ 但没有成功:

ostream& operator<<(ostream &output, Func &pol)
{
    list<Unit>::iterator i;

    for( i = pol.begin(); i != pol.end(); ++i)
    {
        Unit test = *i;

        output << test.coef << " ";
    }

    return output;
}

我是否正确初始化它?

Func::Func()
{
    Unit test;
    test.coef = 0;
    test.exp = 0;
    Func::push_back(test);
}

对不起。关于继承的新手。尽管关于我自己制作的课程并不难。

更新代码:

struct Unit{
    int coef; //coefficient
    int exp;  //exponent
    Unit():coef(0),exp(0){}
};

class Func : public std::list<Unit>{
    public:
        Func();
        friend std::ostream& operator<<(std::ostream &, const Func &);
};

Func::Func()
{
    Unit test;
    Func::push_back(test);
}

ostream& operator <<(std::ostream &output, const Func& pol)
{
    for (list<Unit>::const_iterator i =  pol.begin(); i != pol.end(); output << i->coef << " " << i->exp << " ", ++i);

    return output;
}
4

2 回答 2

1

我不清楚你想做什么。是从 STL 列表继承的要求吗?我不会这样做的。

但这至少是一个解决方案。

struct Unit{
    int coef; //coefficient
    int exp;  //exponent
};

std::ostream& operator<<(std::ostream &os, Unit const& v)
{
  os << v.coef << " " << v.exp << std::endl;
  return os;
}

int main()
{
  std::list<Unit> myList;
  Unit element;
  element.coef = 0;
  element.exp = 0;
  myList.push_back(element);

  std::ostringstream os;
  for (std::list<Unit>::const_iterator it = myList.begin(); it != myList.end(); ++it)
  {
    os << *it;
  }
  std::cout << os.str() << std::endl;
}

使用 C++11 可以更好地实现,但我不知道您使用的是什么编译器。到目前为止我还没有编译它,只是把它砍掉了;很抱歉语法错误。

于 2013-04-30T18:16:19.387 回答
0

首先,关于您的印刷。您可以通过多种方式进行操作,最强大的是为每种类型定义自由运算符。如:

struct Unit{
    int coef; //coefficient
    int exp;  //exponent
};

std::ostream& operator <<(std::ostream& os, const Unit& unit)
{
    os << unit.coef << "X^" << unit.exp;
    return os;
}

函数稍微复杂一些。最好将列表用作成员变量并为该类提供用于流插入的运算符。如:

#include <iostream>
#include <iterator>
#include <list>
#include <cstdlib>

struct Unit
{
    int coef; //coefficient
    int exp;  //exponent

    Unit(int coef, int exp=0)
        : coef(coef), exp(exp)
    {}

    friend std::ostream& operator <<(std::ostream&, const Unit&);
};

std::ostream& operator <<(std::ostream& os, const Unit& unit)
{
    os << unit.coef << "X^" << unit.exp;
    return os;
}

class Func
{
public:
    std::list<Unit> units;

    friend std::ostream& operator <<(std::ostream&, const Func&);
};

std::ostream& operator <<(std::ostream& os, const Func& func)
{
    std::copy(func.units.begin(), func.units.end(),
              std::ostream_iterator<Unit>(os, " "));
    return os;
}

int main()
{
    Func func;
    func.units.push_back(Unit(3, 2));
    func.units.push_back(Unit(2, 1));
    func.units.push_back(Unit(1, 0));
    std::cout << func << endl;
    return EXIT_SUCCESS;
}

输出

3X^2 2X^1 1X^0 

注意:我没有正确隐藏成员、提供访问器等。我留给你,但是关于如何提供输出流操作符的总体思路应该是显而易见的。您可以通过以下方式显着进一步增强 `Unit 的输出运算符:

  • 不打印指数1
  • 0仅打印(无 X)指数的系数,
  • 不打印1指数大于的任何项的系数0
  • 不打印任何带有0系数的项。

这些任务我留给你。

于 2013-04-30T18:23:24.677 回答