打印出继承的结构化列表c ++

时间:2013-04-30 17:59:21

标签: c++ oop inheritance linked-list

如果我有这段代码

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;
}

2 个答案:

答案 0 :(得分: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,这可以实现得更好,但我不知道你正在使用什么编译器。到目前为止我没有编译它,只是把它砍掉了;很抱歉语法错误。

答案 1 :(得分: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 

注意:我 NOT 正确地隐藏了成员,提供了访问器等等。我留给您,但关于如何提供输出流操作符的一般想法应该是显而易见的。您可以显着进一步增强`Unit by:

的输出运算符
  • 不打印1
  • 的指数
  • 仅打印0(无X),
  • 的指数系数
  • 不打印指数大于1的任何字词的0系数
  • 不打印带有0系数的字词的任何内容

我留给你的这些任务。