Мне нужно включить два заголовочных файла друг к другу, не используя предварительную декларацию, потому что получаю ошибку "неполного типа" - PullRequest
0 голосов
/ 04 июня 2018

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

вот что я хочу сделать:

// A.hpp file
#ifndef H_A_H
#define H_A_H
#include "B.hpp"
class A {
private:
  vector<B*> b;
public:
  void function() {
  // using methods of B
  }
};
#endif


// B.hpp file
#ifndef H_B_H
#define H_B_H
#include "A.hpp"
class B {
private:
  vector<A*> a;
public:
  void function() {
  // using methods of A
  }
};
#endif

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

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

// HeaderA.h file
#ifndef H_A_H
#define H_A_H
#include "HeaderB.h"
class A {
private:
  int b;
public:
  void function() {
  // using methods of B
      B b;
      b.function();
  }
};
#endif

// HeaderB.h file
#ifndef H_B_H
#define H_B_H

class A;

class B {
private:
  int a;
public:
  void function();
};
#endif

// Main.cpp
#include "HeaderA.h"
#include "HeaderB.h"

 void B::function()
 {
  // using methods of A
      A a;
      a.function();
 }

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
0 голосов
/ 04 июня 2018

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

В этой статье также рассматриваются циклические зависимости.

Если вы на 100% не обращаетесьЯ не хочу использовать предварительные объявления, и, возможно, вы можете разделить логику в другом классе и использовать композицию.

// SomeLogic.h
class SomeLogic
{
};

// A.h
#include "SomeLogic.h"
class A
{
    SomeLogic someLogic;
};

// B.h
#include "SomeLogic.h"
class B
{
    SomeLogic someLogic;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...