2017-01-26 4 views
0
template <typename T> 
class Node { 
    private: 
    T data; 
    Node<T> * next; 
    public: 

    Node(T _data, Node<T> * _next): data(_data), next(_next){} 

    T get_data() const { 
     return this->data; 
    } 

    Node<T> * get_next() const { 
     return this->next; 
    } 

    void set_data(T data) { 
     this->data = data; 
    } 

    void set_next(Node<T> * next) { 
     this->next = next; 
    } 
}; 

jetzt versuche ich, die ‚set_next()‘ Funktion auf dem dereferenzierte Objektzeiger aufzurufen:C++ - Aufruf Memberfunktion auf dereferenzierte Objektzeiger

Node<T> new_element(element, NULL); 
Node<T> * tmp = this->get_last(); // returns a pointer to the last element 
*tmp.set_next(&new_element); 

, wenn ich versuche, die Konsole druckt diese errer zu kompilieren Nachricht:

Ich verstehe nicht, warum der Compiler möchte, dass ich '->' weil '.' ist eine vollkommen gute Möglichkeit, eine öffentliche Mitgliederfunktion aufzurufen, richtig?

Allerdings, wenn ich gesagt:

Node<T> new_element(element, NULL); 
Node<T> * tmp = this->get_last(); 
*tmp->set_next(&new_element); 

ich diese:

error: void value not ignored as it ought to be 
*tmp->set_next(&new_element); 

Ich verstehe nicht, was das bedeutet, kann mir jemand helfen?

Antwort

2

Aufgrund Operatorpräzedenz,

*tmp.set_next(&new_element); 

ist die gleiche wie

*(tmp.set_next(&new_element)); 

das ist eindeutig nicht das, was Sie wollen.

können Sie verwenden

(*tmp).set_next(&new_element); 

oder

tmp->set_next(&new_element); 
0
tmp->set_next(&new_element); 

ist die richtige Verwendung.

Die Fehlermeldung tritt auf, weil * versucht, den Rückgabewert zu dereferenzieren, der void ist.

+0

Dank für die Antwort danken! – cmplx96

+0

Wenn Sie eine Funktion für einen Zeiger auf ein Objekt aufrufen, verwenden Sie -> und der Zeiger wird automatisch dereferenziert? – cmplx96

+0

Die '->' dereferenziert den Zeiger und greift auf das Mitglied zu, '()' ruft die Methode auf. – mch

Verwandte Themen