ClassName не было объявлено как ошибка компилятора с унаследованной циклической зависимостью после однократного использования прагмы - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть три класса: человек, семья и график. Между человеком и семьей существует циклическая зависимость, и я пересылаю объявленного человека в семью. Они оба включены в График. При компиляции я получаю ошибку g ++, которая гласит (для каждого экземпляра Graph :: * в graph.cpp) «Graph» не называет тип », и все члены данных в graph.h говорят, что они не объявлены в этой области. (Они все публичные)

Проблема состоит в том, чтобы исправить ошибку компилятора и понять, как обрабатывать эту циклически наследуемую зависимость, чтобы класс Graph компилировался.

Я попытался объявить персонажа и семью в Graph, а также один раз использовать #pragma.

Family.h

#pragma once
//...

class Family{
   int foo;
};

Family.cpp

#include "person.h"
//...
void Family::functions(){}

Person.h

#pragma once
#include "family.h"
//...
class Person{
   int foo;
};

Person.cpp

#include "family.h"
void Person::functions(){}

Graph.h

#pragma once
#ifndef GRAPH_H
#define GRAPH_H
#include "person.h"
#include "family.h"

class Graph{
   Person * people[NUM_PEOPLE];
   Family * families[NUM_FAMILY];
};

Graph.cpp

//...
class Family;
//...
Graph::Graph(){}
//Here Graph does not name a type

void Graph::GraphFunc1(int someParams){
//Here Graph does not name a type

   //implementation...
   //Lets say somewhere in this function we use people[] and families[]

   people[0] = something;
   families[1] = something;

   //Here families and people are not defined in this scope
   //Although they are declared PUBLICLY in Graph.h
}

Я ожидаю, что массив объектных указателей, людей и семей, будет определен в области действия graph.cpp, поскольку они публично определены в его заголовке. Это как-то связано с тем, что Graph не называет тип? FWIW, ошибка компилятора «График не называет тип» появляется раньше остальных.

...