Ich habe Probleme mit der zirkulären Abhängigkeit zwischen den Klassen A, B, C. Der Benutzertyp cfunction aus Klasse A verweist auf die statische Methode von C :: F1. Hier ist der Code:C++, zirkuläre Abhängigkeiten, Vorlagen und Benutzertypen
Datei A. h
#ifndef A_H
#define A_H
#include "C.h"
class C;
template <typename T> using cfunction = T(*)(T, T);
template <typename T>
class A{
public:
cfunction <T> X;
A() : X(&C::F1) {}
A (const cfunction <T> &pX) : X(pX){};
virtual ~A() = 0;
};
#endif
Datei B.h
#ifndef B_H
#define B_H
#include "A.h"
template <typename T>
class B : public A <T> {
public:
B() : A<T>(), b(0.0) {}
B(const T b_, const cfunction <T> &pX) : A <T>(pX), b(b_){}
virtual ~B() {};
};
#endif
Schließlich wird bei dem Verfahren init() von C ein gemeinsamer Zeiger auf A gespeichert wird. Die Methode F1 ruft F2 mit dem Template-Parameter F3 auf. Hier ist der Code:
Datei C. H
#ifndef C_H
#define C_H
#include "A.h"
template <typename T>
class A;
#include <memory>
#include <list>
template <typename T>
using List = std::list<std::shared_ptr<A<T> > >;
//Definition of all projections
class C {
public:
template <typename T, typename Function> static T F2(Function f, const T a, const T b);
template <typename T> static void init(List<T> l);
template <typename T> static T F1(const T a, const T b);
template <typename T> static T F3(const T a, const T b);
};
#include "C.hpp"
#endif
Datei C.hpp
#ifndef C_HPP
#define C_HPP
#include "B.h"
template <typename T>
class B;
template <typename T, typename Function>
T C::F2(Function f, const T a, const T b) { return f(a, b);}
template <typename T> void C::init(List<T> l) {
auto test = std::make_shared <B <T>> (0.0, F1<T>);
l.push_back(test);
}
template <typename T> T C::F1(const T a, const T b) { return F2(F3<T>, a, b);}
template <typename T> T C::F3(const T a, const T b) {return a + b;}
#endif
Die Hauptdatei: main.cpp
#include "C.h"
int main(){
List <double> l;
C::init(l);
return 0;
}
Sorry für die etwas komplizierten Code. Eine einfachere Version des Codes funktioniert gut, aber diese "volle" Variante trifft zu. Ich bin nicht in der Lage, das Problem für g ++ zu beheben; Übersetzungsoptionen: -std = C++ 11.
Danke für Ihre Hilfe ...
nicht beide '# include' und forward-declare (vorwärts-deklarieren "nach der Tat" ist sinnlos). Da Sie die Definition von "A" in "C.h" nicht benötigen, verschieben Sie ihr "# include" auf "C.hpp". Da Sie die Definition von "B" in "C.hpp" benötigen, entfernen Sie ihre Deklaration. – molbdnilo