2011-08-23 28 views
1

簡化代碼來表達概念:一個類的私有函數可以從一個本地函數中調用嗎?

class classA 
{ 

public: 

private: 
    int a; 
    seta(int x); 
}; 

//local prototype 
void somefunction(); 

int main() 
{ 
    classA object; //create an object of the class 

    somefunction(object); 
    return 0; 
} 

void somefunction(classA &object) 
{ 

    object.seta(5);  
} 

}

如果我提出seta()的類的公共部分沒有任何錯誤,它執行。

但是,如果我移動seta()私有部分,我得到以下錯誤:

error C2248: ' anonymous-namespace'::classA::seta' : cannot access private member declared in class ' anonymous-namespace'::classA'

如果功能是私人的,只有這個類調用它,爲什麼會出現問題?

EDIT我傳遞的對象從主到本地函數

+0

您在main中的評論是錯誤的 - 您正在創建一個類的實例(這是一個對象),而不是創建一個類。 – razlebe

+0

'void main()'應該是'int main()'。 –

+0

你顯然對什麼私人手段有誤解。你引用的例子顯然是非法的,我努力想象爲什麼你認爲它應該是好的。如果你想獲得一些理解,也許你需要解釋你的推理。或者,如果你想從中調用私有方法,只需要將某個功能變成classA的一個朋友。 – john

回答

6

調用seta()的函數不是classA的一部分,所以這是一個錯誤;這就是private的定義。如果您要使somefunction()成爲classA的成員,或者將其聲明爲friendclassA,那麼這將起作用。

+0

很清楚謝謝。 –

2

功能somefunction()不是classA的成員函數。這是一個全局範圍的功能,不能訪問私有功能seta(),就像main()不能訪問私有功能seta()一樣。

1

私人會員只能由會員和朋友訪問。同樣,C++中的每個成員函數都應該有一個返回類型。隨着中說 -

void main() // 1 
{ 
    classA object; //2 

    somefunction(); 
} 
  1. main返回類型應該是INT
  2. object的範圍僅在main中,無法在somefunction中訪問,而無法將其明確地傳遞給該函數。

在您編輯:

你是按值傳遞給objectsomefunction(classA)。因此,object(主要範圍)的副本製作爲somefunction範圍object。儘管它們具有相同的名稱,但兩者都不相同。

void somefunction(classA object) 
{     // ^^^^^^ Is a copy of the parameter passed. 
    object.seta(5); // This call isn't actually modifying the original parameter passed. 

}// life time of argument,object, ends here. 

如果您想修改參數傳遞本身,您應該通過引用傳遞它。

+0

是的,參考是我需要的,謝謝。 –

1

這與「本地功能」(功能定義裏面其他功能)無關。這只是關於公共和私人成員。

如果一個成員是private,那麼它可以只有可以被該類的其他成員或該類的顯式朋友訪問。

1

私人表示只有會員功能和朋友可以訪問它。既要在類聲明中列出,但不是:

class classA 
{ 

public: 

private: 
    int a; 
    seta(int x); 
}; 

作爲一個在同一個文件不會使該函數的類的一部分 - 只有類的聲明是用來確定哪些訪問。

1

首先,要回答你的首要問題:

If the function is private and only this class is calling it, why is there an issue?

的問題是,private類成員只能由類中的其他成員被調用。功能somefunction()不是classA的成員,因此無權訪問私人會員seta()

順便說一句,你還應該仔細考慮你從main通過objectsomefunction()時你在做什麼。您按值通過object,因此您創建的object的副本範圍爲somefunction(),只要somefunction()終止,該副本將被銷燬。那是你要的嗎?

我懷疑你打算通過引用從main傳遞objectsomefunction(),在這種情況下,你需要聲明somefunction()作爲

void somefunction(classA &object) 
+0

是的,應該參照,謝謝。 –

1

seta(int x)ClassA私有成員,所以只有ClassAfriend class of ClassA可以訪問此會員。 somefunction()是他們中的任何一個。

相關問題