C ++:当两个类包含指向另一个的指针时,如何解决派生类之间的模板循环依赖关系?

问题描述 投票:2回答:2

我有一个父类和一些派生自它的类。我想“配对”两个派生类,这些派生类的eac都有指向另一个的指针。

代码示例:

template<typename DerivedClassName>
class Parent {
    // some stuff
    DerivedClassName* prtToPair;
};

template<typename DerivedClassName>
class DerivedA : public Parent<DerivedClassName> {

};


template<typename DerivedClassName>
class DerivedB : public Parent<DerivedClassName> {

};

// compile fails
DerivedA<DerivedB> dA;
DerivedB<DerivedA> dB;

dA.prtToPair = &dB;
dB.prtToPair = &dA;

我知道我可以使用虚函数来做到这一点,但是我试图找到一种使用模板的方法。

我从http://qscribble.blogspot.com/2008/06/circular-template-references-in-c.html找到了解决方案:

#include <stdio.h>

template<class Combo> struct A
{
  typedef typename Combo::b_t B;
  B* b;
};

template<class Combo> struct B
{
  typedef typename Combo::a_t A;
  A* a;
};

struct MyCombo {
  typedef A<MyCombo> a_t;
  typedef B<MyCombo> b_t;
};

int main(int argc, char* argv[])
{
  A<MyCombo> a;
  B<MyCombo> b;
  a.b = &b;
  b.a = &a;
  return 0;
}

但是它仅适用于两个固定的类A和B。考虑到我有很多派生类,并且我想将它们中的任何两个“配对”,如何解决这个问题?

更新1.修复第一个代码块中的错字更新2。我尝试下面的代码

template<typename DerivedClassName>
class Parent {
    // some stuff
public:
    DerivedClassName *prtToPair;
};

template<typename DerivedClassName>
class DerivedA : public Parent<DerivedClassName> {
public:
    void func() {
        std::cout << "A" << std::endl;
    }
};


template<typename DerivedClassName>
class DerivedB : public Parent<DerivedClassName> {
public:
    void func() {
        std::cout << "B" << std::endl;
    }
};

int main() {
    DerivedA<DerivedB<void>> A;
    DerivedB<DerivedA<void>> B;

    A.prtToPair = reinterpret_cast<DerivedB<void> *>(&B);
    B.prtToPair = reinterpret_cast<DerivedA<void> *>(&A);

    A.prtToPair->func();
    B.prtToPair->func();

    return 0;
}

它编译并打印了B A。但是,此代码是否正确?有副作用吗?

c++ templates cyclic-dependency
2个回答
0
投票

DerivedB不是课程;这是一个模板。您不能只拥有DerivedA<DerivedB>,因为那没有意义。 哪种


0
投票

类似以下内容?

© www.soinside.com 2019 - 2024. All rights reserved.