У меня есть три класса: человек, семья и график. Между человеком и семьей существует циклическая зависимость, и я пересылаю объявленного человека в семью. Они оба включены в График. При компиляции я получаю ошибку 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, ошибка компилятора «График не называет тип» появляется раньше остальных.