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

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

class A2DD
{
  private:
  int gx;
  int gy;

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

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

7 ответов


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

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

В общем ваш .h содержит определение класса, которое является всеми вашими данными и всеми объявлениями методов. Вот как в вашем случае:--3-->

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

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

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

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

идея состоит в том, чтобы сохранить все сигнатуры функций и члены в файле заголовка.
Это позволит другим файлам проекта видеть, как выглядит класс, без необходимости знать реализацию.

и кроме того, вы можете включить другие файлы заголовков в реализацию вместо заголовка. Это важно, потому что любые заголовки, включенные в файл заголовка, будут включены (наследуется)в любом другом файле, который включает файл заголовка.


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

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() определение в заголовке, например). Это полезно, Так как это дает компилятору больше шансов на встраивание например. Но это также означает, что изменение реализации (если оставить в заголовке) может вызвать перестройку всех остальных файлов, которые включают в себя заголовок.

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


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

например:

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

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

следовательно, из примера принятого ответа только эта часть нужны:

#ifndef MYHEADER_H
#define MYHEADER_H

//Class goes here, full declaration AND implementation

#endif

#ifndef и т. д. определения препроцессора в несколько раз.

PS. Тема становится яснее, как только вы понимаете, что C / C++ "тупой", а #include-это просто способ сказать "сбросить этот текст в этом месте".