2013-05-30 58 views
-3

嗨我想在其他函數中調用對象函數,但我不能。爲什麼?在聲明它之前調用對象函數

class class1 
{ 
private: 
    int var; 
public: 
    class1(int x); 
    void functionO(); 
}; 

class1::class1(int x) 
{ 
    var = x; 
} 

void class1::functionO() 
{ 
    cout<<"text"; 
} 

void Callfunction() 
{ 
    object1->function0(); 
} 

int main() 
{ 
    class1 *object1; 

    object1 = new class1(x); 

    Callfunction(); 
} 

Compilator說

'object1':未聲明的標識符

似乎是合乎邏輯,但我怎麼可以調用對象的函數內起作用?

+3

它根本不在該範圍內。如果您需要共享變量,請使用參數,或* shudder * global。 –

+1

你不需要那個'new',並且你沒有釋放那個記憶。使用'class1 object1(x);'。 – chris

+2

你可能來自java或c#?因爲'object1 = new class1(x);'只是不必要的複雜性。簡單地用'class1 object1(x);' – Grizzly

回答

1

傳遞的對象作爲(參考)參數的函數:

class class1 
{ 
private: 
    int var; 
public: 
    class1(int x); 
    void function0(); 
}; 

class1::class1(int x) 
: var(x) // Note: Use member initializer lists 
{} 

void class1::function0() 
{ 
    std::cout << "text, var = " << var << std::endl; 
} 

void Callfunction(class1& object) 
{ 
    object.function0(); 
} 

int main() 
{ 
    class1 object1(10); 
    class1 object2(42); 

    Callfunction(object1); 
    Callfunction(object2); 
} 

預期輸出:

text, var = 10 
text, var = 42 

注意
聲明順序也很重要,當編譯器看到Callfunction()後聲明class1時,您可能需要使用正向聲明。

+0

或許將它作爲指針傳遞,因爲它是一個指針main() – Kotte

+0

@Kotte THX,已經修復了... –

1

您的問題與申報單無關(前後無關)。您的object1main的局部變量。這意味着它在main以外是不可見的,除非您明確地將它傳遞給需要它的函數或將指針存儲在全局變量中(但請不要)。爲了解決你的問題,你應該因此通過你的對象Callfunction

void Callfunction(class1& object1) 
{ 
    object1.function0(); 
} 

int main() 
{ 
    class1 object1(x);//<-- This asumes that you have actually defined x 
         //somewhere, otherwise replace it with an actual value 
    Callfunction(object1); 
} 

注意,我通過構建堆棧上的對象,而不是在堆上了清理不需要的間接(和內存泄漏)的自由。

3

在此代碼:

void Callfunction() 
{ 
    object1->function0(); 
} 

object1是外的範圍。也就是說,編譯器不知道CallFunction()範圍內名爲object1的任何內容。即使你有後main()定義CallFunction

注意,這仍然是正確的。所有變量都是聲明它們的範圍的局部變量。

一種選擇是使object1成爲全球性的,我相信你會被建議去做這件事。但請不要。全局變量將狀態引入到程序中,並伴隨着一系列其他難以解決的難題,而不會破壞程序。不要習慣使用全局變量來解決所有方法範圍問題。你會後悔的。

相反,爲什麼不通過class1指針指向CallFunction()?更好的是,傳遞一個參考。

void CallFunction(class1& obj1) 
{ 
    obj1.function0(); 
} 

int main() 
{ 
    class1 *object1; 

    object1 = new class1(x); 

    Callfunction(*object1); 
} 
相關問題