2011-02-05 40 views
0

我有一個類Foo它看起來像這樣無法轉換這個指針

class Foo 
{ 
public: 
    void set_bar(int val) 
    { 
     _bar = val; 
    } 

protected: 
    int _bar; 
}; 
其由被聲明爲 Baz類繼承

如下:

class Baz 
    : public Foo 
{ 
public: 
    void set_baz(int val) 
    { 
     _baz = val; 
    } 

protected: 
    int _baz; 
}; 

,然後我有一個Factory類包含類型爲Baz的成員變量。

class Factory 
{ 
protected: 
    Baz _baz; 
public: 
    const Baz& get_baz() const 
    { 
     return _baz; 
    } 
}; 

如果我用Factory這樣的:

Factory f; 
f.get_baz().set_bar(1); 

它拋出這個error C2662: 'Foo::set_bar' : cannot convert 'this' pointer from 'const Baz' to 'Foo &'

回答

1

您需要提供廠:: get_baz的非const版本,返回非const引用巴茲:

class Factory 
{ 
protected: 
    Baz _baz; 
public: 
    const Baz& get_baz() const 
    { 
     return _baz; 
    } 

    Baz& get_baz() 
    { 
     return _baz; 
    } 
}; 

當使用一個const廠,get_baz的const版本將會被調用,否則將調用get_baz的非const版本。

你也應該避免在名字中使用前導下劃線。見What are the rules about using an underscore in a C++ identifier?

+1

我不用在實際代碼中用下劃線來加我的代碼,謝謝你的閱讀。 – SimpleButPerfect 2011-02-05 14:47:12

1

通過get_baz返回的對象是固定的,不能修改其內容。

+0

哎唷,我沒看到..謝謝。 – SimpleButPerfect 2011-02-05 14:40:55

0

調用get_baz後,你會得到常量對象和常量對象只能調用常量函數。

0

如果您向對象返回非常量引用,則只能更改該值。

如果您返回一個非const引用,爲什麼不公開成員?你會得到同樣的效果...