我在类A,B,C之间的循环依赖关系上遇到麻烦。来自类A的用户类型cfunction指向C :: F1的静态方法。这是代码:

文件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


文件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


最后,在C的init()方法中,存储了指向A的共享指针。方法F1使用模板参数F3调用F2。这是代码:

文件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


文件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


主文件:main.cpp

#include "C.h"

int main(){
    List <double> l;
    C::init(l);
    return 0;
}


抱歉,代码有些复杂。较简单的代码版本可以很好地工作,但是这种“完整”的变体很容易实现。我无法解决g ++的问题;编译选项:-std = c ++ 11。

谢谢你的帮助...

最佳答案

好的,因此您可以通过一些小的调整就可以解决您的问题。如您所指出的,当前您有一些循环依赖项,但是仅需进行1个基本修改并稍加修改就可以打破它们:即,删除引用AC默认构造函数。您实际上并不需要它-因为它不会使用您的代码。即使您这样做,也可以将X成员设置为nullptr并稍后在外部对其进行初始化。

删除此内容后,您现在可以拥有一个简单的包含顺序:A.hB.hC.hC.hpp

在那之后,我还必须解决其他几个编译器错误:您似乎正在为一个不存在的B成员b初始化。同样,即使您的A析构函数是纯虚拟的,也需要定义。最终代码如下:

EDIT(2):我现在已对此进行了修改,因此不再排除A的默认构造函数。相反,稍后可以在C.h的定义可用后在C中简单定义。

啊:

#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 ();
        A (const cfunction <T> &pX ) : X(pX){};
        virtual ~A() = 0;
};

template <typename T>
A<T>::~A() {}

#endif


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


C.h:

#ifndef C_H
#define C_H

#include "A.h"
#include "B.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);
};

template<typename T>
A<T>::A() : X(&C::F1)
{}

#include "C.hpp"
#endif


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

10-08 11:07