Wie implementiert man Schnittstellen in C++? [duplicate]

Lesezeit: 4 Minuten

Wie implementiert man Schnittstellen in C duplicate
Beratungsstelle

Mögliches Duplikat:

Bevorzugte Methode zur Simulation von Schnittstellen in C++

Ich war gespannt, ob es in C++ Interfaces gibt, denn in Java gibt es die Implementierung der Design Patterns meist mit Entkopplung der Klassen über Interfaces. Gibt es dann eine ähnliche Möglichkeit, Schnittstellen in C++ zu erstellen?

  • Auch Duplikat von stackoverflow.com/questions/318064/…

    – Bleib fokussiert

    6. Juni ’18 um 18:39


  • Brauchen Sie wirklich Schnittstellen? C++ hat eine große Unterstützung für Vorlagen. Schreiben Sie einfach Ihre Funktionen, die Vorlagen erhalten, und stellen Sie sicher, dass die übergebenen Typen die erforderlichen Methoden haben, um keine Kompilierungsfehler zu verursachen, damit Sie Ihren Benutzern nicht auferlegen, von irgendetwas zu erben, um Ihre Methoden zu verwenden.

    – Peregring-lk

    1. Okt ’19 um 18:38

Wie implementiert man Schnittstellen in C duplicate
MD Sayem Ahmed

C++ hat keine integrierten Konzepte von Schnittstellen. Sie können es implementieren mit abstrakte Klassen die nur enthält rein virtuelle Funktionen. Da es Mehrfachvererbung ermöglicht, können Sie diese Klasse erben, um eine andere Klasse zu erstellen, die dann diese Schnittstelle (ich meine, Objektschnittstelle 🙂 ) darin enthält.

Ein Beispiel wäre so etwas –

class Interface
{
public:
    Interface(){}
    virtual ~Interface(){}
    virtual void method1() = 0;    // "= 0" part makes this method pure virtual, and
                                   // also makes this class abstract.
    virtual void method2() = 0;
};

class Concrete : public Interface
{
private:
    int myMember;

public:
    Concrete(){}
    ~Concrete(){}
    void method1();
    void method2();
};

// Provide implementation for the first method
void Concrete::method1()
{
    // Your implementation
}

// Provide implementation for the second method
void Concrete::method2()
{
    // Your implementation
}

int main(void)
{
    Interface *f = new Concrete();

    f->method1();
    f->method2();

    delete f;

    return 0;
}

  • Ihr Beispiel hat undefiniertes Verhalten weil Interface keinen virtuellen Destruktor hat.

    – CB Bailey

    18. März ’12 um 8:17

  • … obwohl Ihr Beispiel auch nicht kompiliert werden sollte, weil Sie Concrete::method1 und Concrete::method2 definieren, aber diese sind keine gültigen Member von Concrete und you.instantiate Concrete, obwohl es immer noch abstrakt ist.

    – CB Bailey

    18. März ’12 um 8:22

  • @CharlesBailey: Nun, ich habe keinen Compiler verwendet, habe ihn aus meinem Gedächtnis aufgeschrieben….wahrscheinlich habe ich deshalb so viele Dinge verpasst…

    – MD Sayem Ahmed

    18. März ’12 um 8:36

  • Komm 2018 immer noch kein grundlegendes Schnittstellensystem in C++, [email protected]# willen, ich hasse es, keine andere Wahl zu haben als C++

    – fdsfdsfdsfds

    29. März ’18 um 17:15

  • @fdsfdsfdsfds C++ hat Schnittstellen. C++ hat kein a Stichwort interface.

    – Caleth

    18. April ’19 um 13:33

Wie implementiert man Schnittstellen in C duplicate
iammilin

Eine “Schnittstelle” ist äquivalent zu a reine abstrakte klasse in C++. Idealerweise das Schnittstelle class sollte nur enthalten rein virtual public Methoden und static const Datenmitglieder. Beispielsweise:

struct MyInterface
{
  static const int X = 10;

  virtual void Foo() = 0;
  virtual int Get() const = 0;
  virtual inline ~MyInterface() = 0;
};
MyInterface::~MyInterface () {}

  • Wie wäre es mit einem virtuellen Destruktor?

    – CB Bailey

    18. März ’12 um 8:18

  • Ich würde einen virtuellen dtor hinzufügen, um mögliche Speicherlecks in Zukunft zu vermeiden.

    – barankin

    18. März ’12 um 8:19

  • @CharlesBailey, das habe ich verpasst. Habe den Beitrag bearbeitet. Als rein hinzugefügt virtual nur um die rein zu halten abstractKlasse und inline damit es ohne Linker-Fehler in der Header-Datei residieren kann.

    – iammilin

    18. März ’12 um 8:20


  • Einfacher wäre es, den Destruktor in der Klassendefinition zu definieren. Du könntest einfach tun virtual ~interfaceA() {}. Ihre Klasse ist bereits abstrakt, Sie gewinnen also nichts, wenn Sie den Destruktor zu einer rein virtuellen Funktion machen.

    – CB Bailey

    18. März ’12 um 8:39

  • @barankin: Speicherlecks haben nichts mit virtuellen Destruktoren zu tun. Es geht einfach darum, korrektes C++ zu schreiben.

    – Kerrek SB

    18. März ’12 um 9:58

1641816373 207 Wie implementiert man Schnittstellen in C duplicate
Alok Speichern

In C++ gibt es kein Schnittstellenkonzept,
Sie können das Verhalten mit einem simulieren Abstrakte Klasse.
Abstrakte Klasse ist eine Klasse, die mindestens eine reine virtuelle Funktion hat. Man kann keine Instanzen einer abstrakten Klasse erstellen, aber Sie könnten Zeiger und Referenzen darauf erstellen. Außerdem muss jede Klasse, die von der abstrakten Klasse erbt, die rein virtuellen Funktionen implementieren, damit ihre Instanzen erstellt werden können.

  • Und warum ist das nicht das Konzept der Schnittstellen? Weil abstrakte Basisklassen theoretisch noch mehr zulassen? Oder weil das Stichwort nicht „Schnittstelle“ ist?

    – Eisfeuer

    16. September ’21 um 16:54 Uhr

  • @IceFire: Weil C++ kein Schlüsselwort hat interface

    – Alok Speichern

    16. September ’21 um 17:38 Uhr

  • Ah. Wenn eine Sprache also etwas „wie“ Schnittstellen hätte, aber eine Kurzform wie „ifc“, hätte sie auch nicht das Konzept von Schnittstellen? Und JS (vor EC6) hatte keine Klassen, weil Sie „Funktion“ schreiben müssten? Hat Java auch keine Generika, weil es kein „generisches“ Schlüsselwort hat?

    – Eisfeuer

    16. September ’21 um 19:37 Uhr


.

300390cookie-checkWie implementiert man Schnittstellen in C++? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy