2016-04-26 8 views
0

ich eine Klasse mit rein virtuelle Funktion wie folgt vergeben:Wie verwendet man eine C++ Klasse mit reiner virtueller Funktion?

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

Nun, ich eine andere Klasse haben, die verwendet die IRecordingHour Klasse:

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

Mir wurde gesagt, dass ich nicht erlaubt bin Implementieren der IRecordingHour-Klasse (die mit der reinen virtuellen Funktion).

Meine Frage ist: ohne die IRecordingHour clas, wie verwende ich es in den ProcessingRecordingHours? Das heißt, wie erstelle ich eine Instanz der IRecordingHour und übergebe sie an den Konstruktor der ProcessRecordingHours?

Antwort

0

Ich denke, dass Ihr Lehrer plant, eine Implementierung von IRecordingHour in ProcessRecordingHours zu injizieren.

Sie können diese Klasse auch nicht verwenden, es sei denn, Sie generieren einen Stub für IRecordingHour, oder Sie implementieren einen selbst mit Dummy-Rückgabewerten.

/// <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, danke für Ihre Antwort. Wie erzeuge ich Stub für IRecordingHour?Was meinst du mit meinem Lehrer, eine Implementierung von IRecordingHour in ProcessingRecordingHours clas zu injizieren? Würden Sie bitte etwas Code geben? –

+0

Da du gesagt hast "Mir wurde gesagt, dass ich die IRecordingHour-Klasse nicht implementieren darf" dachte ich, du wärst ein Student und dein Lehrer gab dir diese Aufgabe als Teil eines Gruppenprojekts, in dem du ProcessRecordingHours ausbaust und jemand anderes IRecordingHour implementiert . Gehen Sie auf Unit Tests lesen und das Konzept der Spott wird auftauchen. – dfdsfdsfsdf

+0

Ich entschuldige mich, wenn ich die falsche Annahme gemacht habe. Als ich am College war, war das eine Standardübung. – dfdsfdsfsdf

0

Sie sollten eine Unterklasse von IRecordingHour erstellen und implementieren die Methode getData, wie

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

Und dann können Sie tun:

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

Sie ähnliche Beispiele in einem guten C finden ++ Programmierbuch wie The C++ Programming Language

0

Obwohl Sie sie gleichsetzen, Ihre zwei questio ns sind tatsächlich ganz anders.

Wie verwende ich es in den ProcessingRecordingHours?

Es gibt kein besonderes Problem ProcessingRecordingHours bei der Umsetzung ohne eine Unterklasse von IRecordingHour zu implementieren. Sie müssen nichts Besonderes tun. Sie vermeiden einfach, sich auf etwas zu verlassen, das nicht von IRecordingHour erklärt wurde, was nicht anders ist, als Sie ohnehin tun sollten.

Wie erstelle ich eine Instanz der IRecordingHour und übergebe sie an den Konstruktor der ProcessRecordingHours?

Sie können nicht. Eine Klasse mit einer rein virtuellen Methode kann nicht direkt instanziiert werden. Ihre ProcessRecordingHours kann in Verbindung mit Klassen verwendet werden, die IRecordingHour erweitern, aber wenn Sie nicht berechtigt sind, eine solche Klasse zu erstellen, dann können Sie nicht die Teile Ihrer ProcessRecordingHours Klasse ausüben, die von IRecordingHour abhängen.

Vielleicht haben Sie das Problem jedoch falsch verstanden. Es kann Ihnen verboten sein, IRecordingHour::getData() zu implementieren, jedoch keine Implementierung einer Unterklasse, die diese Methode durch eine konkrete überschreibt. Eine solche Unterklasse könnte instanziierbar sein und wäre in Verbindung mit ProcessRecordingHours verwendbar.

+0

danke für deine antwort. Ich hätte das Problem vielleicht falsch verstanden, wie du gesagt hast. Hier ist die vollständige Beschreibung:

 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"

Verwandte Themen