重载<< ostream的运算符,用于虚函数

时间:2013-04-23 22:08:33

标签: c++

overloaded << opreator这样:

ostream& operator<<(ostream&os, const Computer& c) {
     for (int i = 0; i != c.listOfComponents.size() - 1; i++) {
        os << c.listOfComponents[i].getInfo(os) << endl;    
    }
    return os;
}

其中listoOfComponentsvector<Component>

我的Component课程和其中一个子课程在这里:

class Component {
public:

    Component() {
    };

    ~Component() {
    };

  virtual ostream &getInfo(ostream& os)const;
};

ostream &Component::getInfo(ostream& os)const {
    return os;
}

class CPU : public Component {
public:

    CCPU(int cores, int freq) {
        this->cores = cores;
        this->freq = freq;
    };

    ~CPU() {
    };

    virtual ostream &getInfo(ostream& os)const;

    int cores;
    int freq;
};

ostream &CPU::getInfo(ostream& os)const {
        os<<"CORES:"<<cores<<" FREQ:"<<freq<<endl;
 }

最后是Computer类:

class Computer {
public:
    // constructor

    Computer(string name) {
        this->name = name;
    };
    // destructor

    ~Computer() {

    };


    // operator <<
    friend ostream& operator<<(ostream& os, const CComputer& c);

    CComputer & AddComponent(Component const & component) {
        this->listOfComponents.push_back(component);
        return *this;
    };

    CComputer & AddAddress(const string & address) {
        this->address = address;
        return *this;
    };

    string name;
    string address;
    vector<Component> listOfComponents;
};

但是,当我想通过cout<<os;将其打印出来时,它只打印出地址(即0x6c180484)。 但我无法弄清楚,如何编写它以便能够编译它并获得正确的值......

3 个答案:

答案 0 :(得分:1)

此:

os << c.listOfComponents[i].getInfo(os) << endl;

应该是:

c.listOfComponents[i].getInfo(os) << endl;

这当然是假设os返回std::ostream对象。


按照你的方式,你打印一个指针,它返回它的地址(十六进制)。

答案 1 :(得分:1)

首先,为什么打印到名为get_info的流的方法?将其称为put_info()(具有相同的返回类型/参数)并将其用作

c.listOfComponents.put_info(os) << endl;

不要忘记从put_info返回信息流。

执行此操作后,它仍然无法正常工作,因为vector<Component>精确地保留了组件 - 如果您推入CPU,则会被残酷地截断为Component

答案 2 :(得分:0)

  

但是,当我想通过cout<<os将其打印出来时;它只打印出地址(即0x6c180484)。但我无法弄清楚,如何编写它以便能够编译它并获得正确的值......

我猜你正在将对象的指针传递给std::cout,它将被打印为其地址(十六进制数)。如果你有一个指针,请确保在将它传递给流时取消引用它:

std::cout << *pointer;