我有一個實現一個接口的對象集合,我想讓它有getters來獲取單獨的實現,只有在C++中。在Java中,我會這樣做:如何在不定義類型的情況下爲C++中的類型編寫getter?
interface IFooBar { }
class Foo implements IFooBar { }
class Bar implements IFooBar { }
class Container extends HashSet<IFooBar> {
public Container() { }
public Container(Collection<? extends IFooBar> c) { super(c); }
Foo getFoo() {
return getFoos().iterator().next();
}
Set<Foo> getFoos() {
HashSet<Foo> result = new HashSet<>();
for(IFooBar item:this) if (item instanceof Foo) result.add((Foo) item);
return result;
}
Bar getBar() { /* ... same ... */ }
Set<Bar> getBars() { /* ... same ... */ }
}
現在我試着在C++中做同樣的事情。對於項目需求,我必須使用我的對象的shared_ptr<>
。這是多遠我就來了:
class IFooBar { }
class CFoo : IFooBar { }
class CBar : IFooBar { }
class CContainer {
public:
CContainer();
CContainer(std::vector<const std::shared_ptr<IFooBar>> cPrivData);
const std::shared_ptr<CFoo> CFoo();
std::vector<const std::shared_ptr<CFoo>> CFoos();
/* ^^^^ : Function CContainer::CFoo is not a type name */
const std::shared_ptr<CBar> CBar();
std::vector<const std::shared_ptr<CBar>> CBars();
private:
std::vector<const std::shared_ptr<IObject>> m_cPrivData;
};
顯然,這是不行的,我不能給吸它應有的名字(我認爲)。我收到了指示的錯誤。該函數似乎取消定義類型名稱。現在我不知道這將是我在C++中給出的Java示例的一個直觀可用的實現?或者,吸氣劑的推薦名稱是什麼?我瞭解到,在C++中,getter命名時不帶前導'get',函數名稱以大寫字母開頭。我想讓getter反映它返回的類類型。
也許我應該去完全其他的方式?我可以定義一個賦值構造函數,而不是函數CFoo()
,如果是這樣,怎麼辦?我是否必須重載shared_ptr<>
才能這樣做?如果是這樣,怎麼樣?像這樣的東西是我的想法:
class CSharedFooBarPointer : std::shared_pointer<IFooBar> {
public:
shared_ptr<Foo> operator=(std::vector<const std::shared_ptr<IFooBar>>& cContainer);
shared_ptr<Bar> operator=(std::vector<const std::shared_ptr<IFooBar>>& cContainer);
}
(也許是我想太多Java'ish這裏,但我很新的C++)。也許這種做法是不好的,因爲也許我不能在網上使用。或者我可以嗎?從上面的Java示例中,我希望能夠執行諸如container.getFoo().doSomethingFooSpecific();
之類的操作。在C++中,我必須使用什麼語法?有沒有像((CFoo)cContainer).DoSomethingFooSpecific();
?如果可能的話,我只需要使用一次變量就不需要分配變量。
什麼是'IObject' ? –
另外,C++並沒有真正擁有所有人都遵循的通用代碼約定,並且使用'Get'引導方法名稱是我見過的很多。 –
名稱衝突可以通過添加'::'來解決。像'''const std :: shared_ptr <::CFoo> CFoo();''' – user5821508