2016-05-15 59 views
-5

爲什麼可以在main之外調用int方法但調用void方法會引發錯誤?void方法不同,或者爲什麼我不能調用void方法,當int方法工作正常?

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

錯誤是:產生

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錯誤。

當該行註釋掉,輸出爲:

called foo() 
called bar() 
123 
+2

因爲語句'a-> bar();'不是初始化。它屬於'main'。 – LogicStuff

+0

哇,降價! – frnhr

回答

3

int方法,如果你還沒有指定該

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

這是不工作,因爲你不能在全局範圍內調用函數,它沒有任何意義(即它們是否被執行多次,每個都是?)。

將返回值賦值給變量是有意義的,因爲這樣你就定義了一個全局變量,它具有你調用的函數的值。沒關係,即使它可能會導致問題,請參閱多個定義。

TL; DR您只能在全局範圍內定義,聲明和初始化變量/函數/結構體/類,而不是其他任何東西。

+0

我們也可以初始化全局範圍內的東西。我們還可以調用返回用於初始化更多內容的值的函數。認爲我們可以從函數內初始化東西似乎是合乎邏輯的。我們實際上可以從函數(!)中初始化東西,只要該函數還可以初始化* something *(即它的返回值用於初始化某個東西)。好吧,我可以忍受。 – frnhr

相關問題