C ++在STL列表上打印数据

时间:2012-06-05 22:17:06

标签: c++ list printing stl

我有一个Base类和一个Derived类;另一方面,我创建了一个使用STL的List类。基类有一个名为PrintData()的虚函数,它打印一个属于Base类的整数。在Derived类中;相同的函数printData()打印一个属于Derived的整数和另一个来自Base类的整数。

问题是,在类List中,我只是从Base获取数据,无论我是否在列表中插入了Derived实例。

我需要打印Derived数据,它也应该包含Base数据。 这是代码:

 #pragma once;
#include <iostream>
#include <sstream>
using namespace std;

class Base{
protected:
    int x;

public:
    Base(){
        x=3;
    }
    void setX(int a){
        x=a;
    }
    int getX(){
        return x;
    }
    virtual string printData(){
        stringstream f;
        f<<getX()<<endl;
        return f.str();
    }
};

class Derived : public Base{

    int a;

public:
    Derived(){
        this->Base::Base();
        a=4;
    }
    void setA(int x){
        a=x;
    }
    int getA(){
        return a;
    }
    string printData(){
        stringstream a;
        a<<getA()<<getX()<<endl;
        return a.str();
    }


};

这是List类:

 #pragma once;
#include "Prueba.cpp"
#include <list>

    class Lista{
        list<Base*> lp;
    public:
        Lista(){

        }

        void pushFront(Base* c){
            lp.push_front(c);
        }

        void pushBack(Base* c){
            lp.push_back(c);
        }

        void printList(){

            list<Base*>::const_iterator itr;
                for(itr=lp.begin(); itr!=lp.end(); itr++){ 
                    cout<<(*itr)->printData(); 

                }
        }

         ~Lista(){

        }
    };

    int main(){
        Derived* d=new Derived();
        Lista* l=new Lista();
        l->pushFront(d);
        l->printList();
        system("Pause");
        return 0;
    }

我只是获取Base类数据,这是一个值为3的整数。 但我没有从Derived获得值为4的整数。

2 个答案:

答案 0 :(得分:0)

替换

    a<<getA()<<getX()<<endl;

    a<<getA()<<" "<<getX()<<endl;

再次运行它。我怀疑你的代码确实打印了两个值,只是它掩盖了这个事实。可以这么说,新的线条剥夺了伪装。

顺便说一下,@ MarkRansom是对的。没有必要显式调用Base构造函数。 (事实上​​,当我尝试你的代码时,我的编译器甚至不会允许它。)

答案 1 :(得分:0)

我编译了你的代码,它导致了Derived构造函数的编译错误。尝试将Derived构造函数更改为

Derived() : Base()
{
    a = 4;
}

我尝试了它,它可以正常工作。

注意:如果您要打印3和4,则应仅在Lista Derived*个对象上插入。