Разделение кода класса на заголовок и файл cpp - PullRequest
142 голосов
/ 06 марта 2012

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

class A2DD
{
  private:
  int gx;
  int gy;

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

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

Ответы [ 7 ]

201 голосов
/ 06 марта 2012

Объявление класса входит в заголовочный файл.Важно, чтобы вы добавили #ifndef include guard, или если вы работаете на платформе MS, вы также можете использовать #pragma once.Также я пропустил приватный, по умолчанию члены класса 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;
}
15 голосов
/ 06 марта 2012

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

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;
}
5 голосов
/ 06 марта 2012

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

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 голосов
/ 07 июля 2018

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

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

#ifndef MYHEADER_H
#define MYHEADER_H

//Class goes here, full declaration AND implementation

#endif

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

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

4 голосов
/ 06 марта 2012

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

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

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

3 голосов
/ 06 марта 2012

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

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

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

1 голос
/ 06 марта 2012

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

Например:

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_;
 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...