2016-06-27 26 views
0

Ich mache hier etwas falsch, aber ich bin mir nicht sicher, was. Ich erwarte, dass die Ausgabe des Programms "Tacos!" Ist, aber ich bekomme stattdessen einen Speicherort.(C++ 14) Operator << überladen funktioniert nicht wie erwartet aus Vektor von Smart-Zeigern

Ich versuche, C++ 14 Funktionen zu verwenden. In diesem Programm versuche ich, intelligente Zeiger zu verwenden und den Operator < < zu überlasten.

Ein TacoCalendar-Objekt enthält einen Vektor-Smart-Pointer für TacoTuesdays-Objekte, von denen eines bei der TacoCalendar-Initialisierung erstellt wird. Die cout << month.my_tacoTuesdays.at(0).get(); Zeile sollte den Zeiger des ersten intelligenten Zeigers des Vektors tacoTuesdays in month an die Freundesfunktion friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt); senden, was zu "Tacos!" zurückgegeben und an std::cout gesendet werden.

Code:

#include <iostream> 
#include <vector> 
#include <string> 
#include <memory> 

class tacoTuesdays { 
public: 
    tacoTuesdays(int i) { 
     _i = i; 
    } 
    friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt); 
private: 
    int _i; 
}; 

std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt) { 
    std::string str_out = "tacos!"; 
    os << str_out; 
    return os; 
} 

typedef std::shared_ptr<tacoTuesdays> smart_tacoTuesdays_t; 

class tacoCalendar { 
public: 
    std::vector<smart_tacoTuesdays_t> my_tacoTuesdays; 
    tacoCalendar(int i) { 
     smart_tacoTuesdays_t tt(new tacoTuesdays(i)); 
     my_tacoTuesdays.push_back(tt); 
    } 
    ~tacoCalendar() { 
    } 
private: 
}; 

int main(int argc, char **argv) { 
    using namespace std; 
    tacoCalendar month(2); 
    cout << *month.my_tacoTuesdays.at(0).get(); 
    return 0; 
} 

Antwort

4

std::shared_ptr<T>::get() gibt einen T*, aber Ihre operator<< Überlastung (richtig) nimmt einen Verweis anstatt einen Zeiger.

ändern

cout << month.my_tacoTuesdays.at(0).get(); 

zu

cout << *month.my_tacoTuesdays.at(0); 

Oder wenn eine shared_ptr Instanz null sein kann,

if (auto* p = month.my_tacoTuesdays.at(0).get()) { 
    cout << *p; 
} 
+3

Sie nicht brauchen die' .get() 'entweder – povman

+1

@povman: In der Tat! – ildjarn

+0

Was macht "auto * p =" als Bedingung? –

3

Achten Sie auf die Art von cout:

cout << month.my_tacoTuesdays.at(0).get(); 

Es ist Drucken der std::vector<std::shared_ptr<tacoTuesdays>>::at(0).get(0), die ein Zeiger tacoTuesdays* ist, so cout Drucken Sie die rohe Zeigeradresse für Sie.

zu bekommen, was Sie wollen, sollten Sie tacoTuesdays ‚s const reference, wie dies passieren:

cout << *month.my_tacoTuesdays.at(0);