2013-12-14 167 views
0

我有這樣一段代碼:奇C++訪問私有成員問題

class object 
{ 

public: 
    virtual ~object(){ } 

    bool equals(const object& J)const 
    { 
     return &J == this; 
    } 
    int operator==(const object& J)const 
    { 
     return equals(J); 
    } 
    virtual int getHash()const; 
    virtual void getType()const; 
    void* operator new(size_t size) 
    { 
     void*mem = malloc(size); 
     return mem; 
    } 
}; 

class notcopyable 
{ 
private: 
    notcopyable(const notcopyable&){} 
    notcopyable& operator=(const notcopyable&){} 
public: 
    notcopyable(){} 
}; 

class exception : 
    public object,public notcopyable 
{ 
private: 
public: 
    virtual ~exception(); 
    virtual const char* info(); 
}; 

class exception_not_implemented : 
    public exception 
{ 
public: 
    exception_not_implemented() 
    { 
    } 
    virtual const char* info() 
    { 
     return "exception_not_implemented: "; 
    } 
}; 

class exception_oob :public exception 
{ 
public: 
    exception_oob() 
    { 

    } 
    virtual const char* info() 
    { 
     return "Index out of boundary"; 
    } 
}; 

有兩個函數拋出exception_not_implemented:

void object::getType()const 
{ 
    throw exception_not_implemented(); 
} 

int object::getHash()const 
{ 
    throw exception_not_implemented(); 
} 

而且收到此錯誤:

error C2248: 'js::notcopyable::notcopyable' : cannot access private member declared in class 'js::notcopyable' 

的編譯器輸出說:

This diagnostic occurred in the compiler generated function 'js::exception::exception(const js::exception &)' 

如果我刪除上面顯示的兩個投擲,它運作良好。但同樣的錯誤不會發生在exception_oob上。我無法弄清楚爲什麼。

+0

你確定錯誤在這裏,而不是在你的程序中的其他地方? – pyon

+0

這段代碼適合我編譯。 –

+0

@EduardoLeón它可能是...因爲行號指向我的代碼中顯示的最後一行。 – babel92

回答

0

錯誤應該發生在您調用(私人)複製構造函數的其他地方。

例如:

異常a; 異常b = a; //錯誤:無法訪問私有成員...

+0

我確實嘗試過,然後刪除了它......錯誤仍然顯示出來...... – babel92

+0

@babel:然後您的其他代碼無意中調用了複製構造函數。 –

+0

@BenVoigt我明確定義了一個副本,錯誤消失了,但函數根本沒有被調用。 – babel92

1

您可以臨時添加一個私人副本構造函數聲明,該聲明將在生成副本的位置生成一個錯誤。然後,您可以修復該代碼以避免複製。

+0

我明確定義了一個複製ctor,它根本沒有被調用......我在同一個頭文件中編寫了一些模板。這很重要嗎? – babel92

+0

@ babel92:如果你沒有得到一個錯誤,因爲它是私有的,可能這個流氓副本發生在可以訪問私有構造函數(成員或朋友)的上下文中。如果你聲明它沒有定義它,你會得到一個未解決的外部錯誤? –

+0

不是......似乎錯誤是由於私人訪問。並沒有鏈接問題。 – babel92