Разделение кода класса в файл заголовка и cpp

Я путаюсь, как разделить код реализации и декларации простого класса на новый заголовок и файл cpp. Например, как я могу отделить код для следующего класса?

class A2DD
{
  private:
  int gx;
  int gy;

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

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

Ответ 1

Объявление класса входит в заголовочный файл. Важно, чтобы вы добавили защитные элементы #ifndef, или если вы находитесь на платформе MS, вы также можете использовать #pragma once. Также я опустил закрытый, по умолчанию члены класса С++ являются частными.

// A2DD.h
#ifndef A2DD_H
#define A2DD_H

class A2DD
{
  int gx;
  int gy;

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

};

#endif

и реализация идет в файле CPP:

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

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

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

Ответ 2

В общем, ваш .h содержит класс defition, который является всеми вашими данными и всеми объявлениями вашего метода. Как это в вашем случае:

A2DD.h:

class A2DD
{
  private:
  int gx;
  int gy;

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

И тогда ваш .cpp содержит реализации таких методов, как это:

A2DD.cpp:

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

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

Ответ 3

В основном модифицированный синтаксис объявления/определения функции:

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;
}

Ответ 4

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

Вы оставляете объявления в файле заголовка:

class A2DD
{
  private:
  int gx;
  int gy;

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

И поместите определения в файл реализации.

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

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

Вы можете смешать два (оставьте getSum() определение в заголовке, например). Это полезно, так как дает компилятору больше шансов на inlining, например. Но это также означает, что изменение реализации (если осталось в заголовке) может привести к перестройке всех других файлов, содержащих заголовок.

Обратите внимание, что для шаблонов вам необходимо сохранить все в заголовках.

Ответ 6

Обычно вы помещаете в заголовочный файл только объявления и действительно короткие встроенные функции:

Например:

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_;
 };