2013-04-23 5 views
0

Я overloaded << opreator так:перегруженного << оператора ostream, используемый в виртуальных функциях

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

где listoOfComponents является vector<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). Но я не могу понять, как написать это, чтобы иметь возможность скомпилировать его и получить правильные значения ...

+0

Покажите нам класс «Компьютер». – 0x499602D2

+0

В отличие от названия, я не вижу никаких виртуальных функций и только один «оператор <<' перегрузки. –

+0

Ваш метод 'getInfo' ничего не возвращает. – 0x499602D2

ответ

1

Прежде всего, почему метод, который печатает в поток, называемый get_info? Назовите это put_info() (с тем же тип возвращаемого значения параметра /) и использовать его как

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

Не забудьте вернуть поток из put_info.

И после того, как вы сделаете это, он все равно не будет работать, потому что vector<Component> держит именно компоненты - если вы выталкивает CPU в, это жестоко усечен до Component.

+0

Кажется, что ты прав. Я могу скомпилировать его, тем не менее, я не могу получить доступ к этому методу в классе «ЦП»: -/И я действительно не понимаю, почему ....возможно, я должен создать новую должность для этого. – Dworza

0

Но тогда, когда я хочу, чтобы распечатать его с помощью cout<<os; он печатает только адрес (т.е. 0x6c180484). Но я не могу понять, как написать это, чтобы иметь возможность скомпилировать его и получить правильные значения ...

Я думаю, вы передаете указатель вашего объекта std::cout, который печатается как его адрес (шестнадцатеричное число). Если у вас есть указатель, убедитесь, что де-ссылки на него при переходе его в поток:

std::cout << *pointer; 
1

Это:

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

должно быть:

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

Это, конечно, при условии, что os возвращает объект std::ostream.


По пути у вас была печать указателя, который возвращает свой адрес (в шестнадцатеричном формате).

Смежные вопросы