2013-01-31 55 views
1

自從我在5年前開始轉向C#以來,我從未在C++中進行過硬核開發。我非常熟悉在C#中使用接口並始終使用它們。例如正確使用C++中的「接口」?

public interface IMyInterface 
{ 
    string SomeString { get; set; } 
} 

public class MyClass : IMyInterface 
{ 
    public string SomeString { get; set; } 
} 

// This procedure is designed to operate off an interface, not a class. 
void SomeProcedure(IMyInterface Param) 
{ 
} 

這是所有偉大的,因爲你可以實現許多類似的類,並通過他們周圍,而你實際使用不同類的沒有一個人是明智的。但是,在C++中,你不能傳遞接口,因爲當你看到你試圖實例化一個沒有定義好所有方法的類時,你會得到一個編譯錯誤。

class IMyInterface 
{ 
public: 
    ... 
    // This pure virtual function makes this class abstract. 
    virtual void IMyInterface::PureVirtualFunction() = 0; 
    ... 
} 



class MyClass : public IMyInterface 
{ 
public: 
    ... 
    void IMyInterface::PureVirtualFunction(); 
    ... 
} 


// The problem with this is that you can't declare a function like this in 
// C++ since IMyInterface is not instantiateable. 
void SomeProcedure(IMyInterface Param) 
{ 
} 

那麼,什麼是正確的方式來獲得的C#風格的界面感覺在C++?

+1

不要忘記爲你的'IMyInterface'類添加虛擬析構函數。 –

+0

-1不是真實代碼 –

回答

6

當然可以,但你需要通過引用或指針,而不是由價值(當然,迂腐地講,指針是按值傳遞以及):

void SomeProcedure(IMyInterface& Param) 

我認爲這是類似於C#中這方面,只有C#默認傳遞類的引用,而在C++中,您明確地說要通過引用傳遞它。

通過值傳遞將嘗試創建對象的副本,並且抽象類型(接口)的對象沒有意義,而是錯誤。

+0

使用這樣的指針感覺有點奇怪。我以爲只有一些我不知道的語法會讓我得到我想要的。但是,使用指向我的「界面」的指針工作得很好。感謝:D – Ultratrunks

3

然而,在C++中,你無法繞過的接口...

你可以通過一個指針參考到一個抽象類,如:

void SomeProcedure(IMyInterface& Param) { ... } 

void SomeProcedure(const IMyInterface& Param) { ... } 
1

您無法將抽象(接口類)傳遞給函數的原因是在創建副本時需要知道對象的大小。

如果所有的類都是相同的大小,這顯然不會有什麼區別,但編譯器通常無法知道您的意圖是什麼,並且實現實際上具有不存在的成員變量在基類/接口類[實際上,一個乾淨的實現應該不包含任何數據]。

爲了避免必須知道大小,我們傳遞一個指針或引用。現在編譯器只需要知道指針的大小 - 這是編譯器隨時可以知道的。

正如其他答案所說,你傳遞一個引用,常量引用或指向接口的指針,並且可以傳入實現對象而無需確切知道它是哪一個。類似的,如果你想存儲相同基類的一些實現,你需要存儲引用或指向基的指針,然後讓這些引用/指向實現類的實際對象。

0

當前的代碼中的問題:

class IMyInterface 
{ 
public: 
    ... 
    // This pure virtual function makes this class abstract. 
    virtual void IMyInterface::PureVirtualFunction() = 1; 
    ... 
} 

只是有太多錯誤與此有關。

  • IMyInterface::的是一個語言的擴展,如果它與任何編譯器(使用用Visual C編譯++類似的東西)進行編譯。

  • = 1是語法錯誤。可能作者的意思是= 0

  • 沒有分號的}會導致以後的解析錯誤。

診斷在後來的代碼作爲OP的問題的原因一個特定的事物,因爲現有的答案爲止做的,因此是純粹的猜測。可能的,是的。但是,嘿,當OP寫道,問題是

「,因爲你會得到一個編譯錯誤」

他或她已經獲得該上述幻想的代碼。

繼續的問題的代碼:

class MyClass : public IMyInterface 
{ 
public: 
    ... 
    void IMyInterface::PureVirtualFunction(); 
    ... 
} 

// The problem with this is that you can't declare a function like this in 
// C++ since IMyInterface is not instantiateable. 
void SomeProcedure(IMyInterface Param) 
{ 
} 

運用超長距離迭代收斂心靈感應電路,我猜像下面可能已經意味着代碼:

class IMyInterface 
{ 
public: 
    // ... 
    virtual void pureVirtualFunction() = 0; 
}; 

class MyClass 
    : public virtual IMyInterface 
{ 
public: 
    // ... 
    void PureVirtualFunction(); 
}; 

void SomeProcedure(IMyInterface const& param) 
{ 
} 

然後,糾正了無數的語法錯誤等,只是爲了使代碼編譯,沒有明顯的問題需要處理:毫無疑問。

聲明:不受編譯器的影響。此外,由於沒有問題,沒有討論。我只是提出編程需要智能,它不能簡化爲適用於機器的規則,因此不要將上述作爲絕對的規則來遵循。

+0

+1是(我猜) – SChepurin