2016-04-26 77 views
0

我獲得了與純虛函數的類像下面這樣:如何在純虛函數中使用C++類?

class IRecordingHour{ 
    public: 
     virtual int getData() const = 0; 
}

現在,我已經另一類使用IRecordingHour類:

 class ProcessRecordingHours { 
public:
ProcessRecordingHours (IRecordingHour &);
proteted:
IRecordingHour & recordingHour;
}

有人告訴我,我不能說實現IRecordingHour類(具有純虛函數的類)。

我的問題是:沒有實施IRecordingHour類,我如何在ProcessingRecordingHours中使用它?也就是說,如何創建IRecordingHour的實例並將其傳遞給ProcessRecordingHours的構造函數?

回答

0

我認爲你的老師計劃將IRecordingHour的實現注入到ProcessRecordingHours中。

此外,除非您爲IRecordingHour生成存根,否則您不能使用該類,或者使用一些虛擬返回值自己實現一個存根。

/// <summary> 
/// in C# and interface can only contain virtual methods. so no need to say virtual. 
/// </summary> 
interface IRecordingHour 
{ 
    int getData(); 
} 

class MockRecordingHour : IRecordingHour 
{ 
    public int getData() 
    { 
     //just return something. This will be enough to get ProcessRecordingHours to work 
     return 100; 
    } 
} 

/// <summary> 
/// this class expects a IRecordingHour. 
/// 
/// how we get a IRecordingHour depends on who's implementing it. You, some 3rd party vendor or another developer who's using this class that you've written. 
/// 
/// Oh wait. Since you're building ProcessRecordingHours, you need a IRecordingHour to get against. You can use a mocking tool or create one yourself that returns some dummy data 
/// </summary> 
class ProcessRecordingHours 
{ 
    private IRecordingHour _recording; 

    public ProcessRecordingHours(IRecordingHour recording) 
    { 
     this._recording = recording; 
    } 

    public void DoSomething() { 
     Console.WriteLine("Recording Data: {0}", this._recording.getData()); 
    } 

} 
+0

KMC,謝謝你的回覆。如何生成IRecordingHour的存根?另外,我的老師計劃在ProcessingRecordingHours類中注入IRecordingHour實現的含義是什麼?你能給一些代碼嗎? –

+0

既然你說「有人告訴我不允許我實施IRecordingHour課程」,我以爲你是一名學生,你的老師正在給你這項任務,作爲一個團隊項目的一部分,在這個項目中你建立ProcessRecordingHours並且其他人執行IRecordingHour 。閱讀單元測試,嘲笑的概念就會出現。 – dfdsfdsfsdf

+0

我道歉,如果我做了錯誤的假設。當我在大學時,這是一個標準練習。 – dfdsfdsfsdf

0

您應該創建IRecordingHour的一個子類,並實現該方法的getData,像

class ARecordingHour : public IRecordingHour 
{ 
    public: 
     int getData() const override //override is valid from C++11 
     { 
     return 42; 
     } 
} 

然後你就可以這樣做:

ARecordingHour arh{}; 
ProcessRecordingHours prh{arh}; //{}- Modern C++ initialization 

你可以在一個不錯的C找到類似的例子++編程書籍,如The C++ Programming Language

0

雖然你把它們等同起來,你的兩個問題實際上ns很不相同。

如何在ProcessingRecordingHours中使用它?

沒有實施ProcessingRecordingHours而沒有實施IRecordingHour的子類別沒有特別的問題。你不需要做任何特別的事情。你只是避免依賴任何未被IRecordingHour聲明的東西,這與你應該做的沒有什麼不同。

如何創建IRecordingHour的實例並將其傳遞給ProcessRecordingHours的構造函數?

你不行。具有純虛擬方法的類不能直接實例化。你的ProcessRecordingHours可以與延伸IRecordingHour的班級聯合使用,但是如果你不允許創建這樣的班級,那麼你不能鍛鍊ProcessRecordingHours班級中取決於IRecordingHour的那些部分。

然而,也許你誤解了這個問題。你可能會被禁止實施IRecordingHour::getData(),但不能實現一個覆蓋該方法的子類。這樣的子類可以實例化,並且可以與ProcessRecordingHours一起使用。

+0

感謝您的回覆。我可能會像你所說的那樣誤解了這個問題。以下是完整的說明:

 Implement the ProcessRecordingHours class and provide unit tests using GoogleTest and GoogleMock. You do not need to implement the IRecordingHour class. All constraints placed on the return value for its getData() function can be relied on and do not need to be tested"