注:我發現我的Xcode是如何編譯下面的問題,它似乎與此處討論的主題無關。當我有更多的細節時,我會在這裏提供。如何轉發聲明一個自定義構造函數?
我建議投票結束我的問題爲「過於本地化」,因爲它是一個Xcode問題,與C++代碼本身無關。非常感謝這些幫助,因爲我從答案中學到了東西。
下面的問題(現在回答和解決)是由於Xcode目標文件混淆排除引起的,因此即使文件有問題也沒有編譯器錯誤。
我有一個純虛擬接口,想定義它的工廠方法,它返回這個接口的子類。這工作得很好:
struct MyVirt{
...all virtual stuff
};
class SubVirt; //forward declaration allows factory:
MyVirt*CreateClass(){
return new SubVirt;
}
更新:一些評論說,前申報是不夠的,實現上述目標,但這是不正確的。您可以在沒有SubVirt
類的完整定義的情況下完成上述罰款。
現在,我想要做的是有一個自定義構造函數,它需要參數。因此:
MyVirt*CreateClass(){
return new SubVirt(arg 1, etc);
}
問題是,class
前向聲明已不夠用。它需要查看類定義或其標題。這意味着我可以將工廠方法移動到定義了SubVirt
的文件中,或者我必須將該文件包含在上面的文件中,該文件會創建一個循環依賴關係。
有沒有辦法轉發聲明自定義構造函數呢?這會讓這一切變得更簡單。
我有麻煩理解:'新SubVirt'也需要看到'SubVirt'的定義,對不對?所以頭部必須包含 –
當返回一個指針時,編譯器需要知道具體的指針大小,所以前向聲明是不夠的。 – billz
@SebbyJohanns:在'new'符*需求*看到類的定義,你不能只提供一個向前聲明。如果使用不完整的類型,它將不會編譯。所以這意味着你必須在某個地方包含一個頭文件。 –