2016-05-15 13 views
-5

Warum ist es in Ordnung, eine int-Methode außerhalb von main aufzurufen, aber das Aufrufen einer void-Methode gibt einen Fehler aus?Wie unterscheiden sich Void-Methoden oder warum kann ich keine void-Methode aufrufen, wenn eine int-Methode funktioniert?

#include <iostream> 

using namespace std; 

class A 
{ 
    public: 
     int foo(); 
     void bar(); 
}; 

int A::foo() { 
    cout << "called foo()" << endl; 
    return 123; 
}; 

void A::bar() { 
    cout << "called bar()" << endl; 
}; 


A* a = new A(); 
int a_val = a->foo(); 
a->bar();        // error: unknown type name 'a' 


int main(int argc, char* argv[]) 
{ 
    a->bar(); 
    cout << a_val << endl ; 
} 

Der Fehler ist:

main.cpp:24:1: error: unknown type name 'a' 
a->bar(); // error: unknown type name 'a' 
^ 
main.cpp:24:2: error: cannot use arrow operator on a type 
a->bar(); // error: unknown type name 'a' 
^ 

2 Fehler erzeugt.

Wenn diese Zeile kommentiert geführt wird, ist die Ausgabe:

called foo() 
called bar() 
123 
+2

Weil die Anweisung 'a-> bar();' keine Initialisierung ist. Es gehört in 'main'. – LogicStuff

+0

Wow, die Downvotes! – frnhr

Antwort

3

Die int Methode funktioniert nicht, auch wenn Sie es nicht vergeben

a->foo(); //error: unknown type name 'a' 

Das ist, weil Sie nicht können Call-Funktionen im globalen Bereich, macht es keinen Sinn (dh werden sie für jede #include mehrere Male ausgeführt).

Das Zuweisen des Rückgabewerts zu einer Variablen ist sinnvoll, da Sie dann eine globale Variable definieren, die den Wert der Funktion hat, die Sie aufrufen. Das ist in Ordnung, obwohl es Probleme verursachen kann, siehe mehrere Definitionen.

TL; DR Sie können Variablen/Funktionen/Strukturen/Klassen nur im globalen Gültigkeitsbereich definieren, deklarieren und initialisieren, sonst nichts.

+0

Wir können Sachen auch im globalen Bereich initialisieren. Wir können auch Funktionen aufrufen, die Werte zurückgeben, die dazu verwendet werden, mehr Zeug zu initialisieren. Es scheint nur logisch zu denken, dass wir Dinge innerhalb einer Funktion initialisieren können. Und wir können tatsächlich Dinge innerhalb einer Funktion (!) Initialisieren, solange diese Funktion auch * etwas * initialisiert (d. H. Ihr Rückgabewert wird verwendet, um etwas zu initialisieren). Nun gut, ich kann damit leben. – frnhr