2016-05-15 30 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

相关问题