【问题标题】:C++ Printing Data on a STL listC++ 在 STL 列表上打印数据
【发布时间】:2012-06-05 22:17:06
【问题描述】:

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

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

我需要打印派生数据,也应该有基础数据。 代码如下:

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

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

【问题讨论】:

  • 永远不需要调用Base::Base,编译器会自动为你做这件事。基类构造函数总是在派生类构造函数之前。
  • 这似乎在我尝试时有效。你确定你正在编译和运行正确的东西吗?

标签: c++ list printing stl


【解决方案1】:

替换

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

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

然后再次运行它。我怀疑您的代码确实打印了这两个值,只是它掩盖了事实。可以这么说,新行去掉了伪装。

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

【讨论】:

  • Ufff,我知道这很愚蠢...首先它是 Derived() 中 Base 构造函数的调用,然后是“”
【解决方案2】:

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

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

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

注意:如果您想同时打印 3 和 4,您应该只在 Lista 插入 Derived* 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多