it-swarm.com.de

Trennung des Klassencodes in eine Header- und eine CPP-Datei

Ich bin verwirrt darüber, wie Implementierungs- und Deklarationscode einer einfachen Klasse in eine neue Header- und CPP-Datei aufgeteilt werden kann. Wie würde ich beispielsweise den Code für die folgende Klasse trennen?

class A2DD
{
  private:
  int gx;
  int gy;

  public:
  A2DD(int x,int y)
  {
    gx = x;
    gy = y;
  }

  int getSum()
  {
    return gx + gy;
  }
};
145
drdrdr

Die Klassendeklaration geht in die Header-Datei. Es ist wichtig, dass Sie das #ifndef Wachen einschließen, oder wenn Sie sich auf einer MS-Plattform befinden, können Sie auch #pragma once. Auch ich habe das Private weggelassen, standardmäßig sind C++ Klassenmitglieder privat.

// A2DD.h
#ifndef A2DD_H
#define A2DD_H

class A2DD
{
  int gx;
  int gy;

public:
  A2DD(int x,int y);
  int getSum();

};

#endif

und die Implementierung erfolgt in der CPP-Datei:

// A2DD.cpp
#include "A2DD.h"

A2DD::A2DD(int x,int y)
{
  gx = x;
  gy = y;
}

int A2DD::getSum()
{
  return gx + gy;
}
205
Ferenc Deak

Im Allgemeinen enthält Ihre .h-Datei die Klassendefinition, bei der es sich um alle Ihre Daten und Methodendeklarationen handelt. So in deinem Fall:

A2DD.h:

class A2DD
{
  private:
  int gx;
  int gy;

  public:
  A2DD(int x,int y);    
  int getSum();
};

Und dann enthält Ihre .cpp die Implementierungen der Methoden wie folgt:

A2DD.cpp:

A2DD::A2DD(int x,int y)
{
  gx = x;
  gy = y;
}

int A2DD::getSum()
{
  return gx + gy;
}
15
Nick

Grundsätzlich eine modifizierte Syntax von Funktionsdeklarationen/-definitionen:

a2dd.h

class A2DD
{
private:
  int gx;
  int gy;

public:
  A2DD(int x,int y);

  int getSum();
};

a2dd.cpp

A2DD::A2DD(int x,int y)
{
  gx = x;
  gy = y;
}

int A2DD::getSum()
{
  return gx + gy;
}
5
Corbin

Es ist wichtig, die Leser auf diese Frage aufmerksam zu machen, wenn sie das Thema ausführlicher untersuchen, dass die Prozedur der akzeptierten Antwort nicht erforderlich ist, wenn Sie Ihr Projekt nur in Dateien aufteilen möchten. Es wird nur benötigt, wenn Sie mehrere Implementierungen einzelner Klassen benötigen. Wenn Ihre Implementierung pro Klasse eine ist, ist nur eine Headerdatei für jede ausreichend.

Daher wird vom Beispiel der akzeptierten Antwort nur dieser Teil benötigt:

#ifndef MYHEADER_H
#define MYHEADER_H

//Class goes here, full declaration AND implementation

#endif

Die Präprozessordefinitionen #ifndef usw. ermöglichen die mehrfache Verwendung.

PS. Das Thema wird klarer, sobald Sie feststellen, dass C/C++ 'dumm' ist und #include nur die Möglichkeit bietet, "dump this text at this spot" zu sagen.

4
j riv

A2DD.h

class A2DD
{
  private:
  int gx;
  int gy;

  public:
  A2DD(int x,int y);

  int getSum();
};

A2DD.cpp

  A2DD::A2DD(int x,int y)
  {
    gx = x;
    gy = y;
  }

  int A2DD::getSum()
  {
    return gx + gy;
  }

Die Idee ist, alle Funktionssignaturen und Member in der Header-Datei zu behalten.
Dadurch können andere Projektdateien sehen, wie die Klasse aussieht, ohne die Implementierung kennen zu müssen.

Außerdem können Sie dann anstelle des Headers andere Header-Dateien in die Implementierung aufnehmen. Dies ist wichtig, da die in Ihrer Header-Datei enthaltenen Header in jeder anderen Datei, die Ihre Header-Datei enthält, übernommen werden.

4
Yochai Timmer

Sie belassen die Deklarationen in der Header-Datei:

class A2DD
{
  private:
  int gx;
  int gy;

  public:
    A2DD(int x,int y); // leave the declarations here
    int getSum();
};

Und fügen Sie die Definitionen in die Implementierungsdatei ein.

A2DD::A2DD(int x,int y) // prefix the definitions with the class name
{
  gx = x;
  gy = y;
}

int A2DD::getSum()
{
  return gx + gy;
}

Sie können die beiden Werte mischen (beispielsweise getSum() in der Kopfzeile belassen). Dies ist nützlich, da der Compiler zum Beispiel eine bessere Inlining-Chance hat. Das bedeutet aber auch, dass eine Änderung der Implementierung (wenn sie im Header verbleibt) eine Neuerstellung aller anderen Dateien auslösen kann, die den Header enthalten.

Beachten Sie, dass Sie für Vorlagen alles in den Kopfzeilen behalten müssen.

3
Mat

Normalerweise fügt man nur Deklarationen und wirklich kurze Inline-Funktionen in die Header-Datei ein:

Zum Beispiel:

class A {
 public:
  A(); // only declaration in the .h unless only a short initialization list is used.

  inline int GetA() const {
    return a_;
  }

  void DoSomethingCoplex(); // only declaration
  private:
   int a_;
 };
1