CLI类的C ++ / CLI循环引用问题

时间:2013-09-30 16:54:29

标签: c++ circular-dependency

我遇到了两个相互引用的类的问题。我试图使用一个接口来解决问题,但遇到其他问题,如类重新定义。我只是不确定如何正确地做到这一点。

这是我正在进行的一个例子。注意:我已经取出了实际上没有影响此问题的所有额外属性和方法。如何在不导致类重新定义和没有循环引用的情况下重做这些。如果可以,请使用此示例作为模板以正确布置语句。

// componentClass.h
//#include "controlClass.h" - Would cause a circular reference
namespace test
{
    //component class
    public ref class componentClass sealed : Component
    {
    internal:
        componentClass(controlClass ^control);
    private:
        controlClass ^_control;
    };
}

// controlClass.h
#include "componentClass.h";
namespace test
{
    //control class
    public ref class controlClass: Control
    {
    public:
        controlClass();
    private:
        componentClass ^_componentClass;
    };
}

// controlClass.cpp
#include "controlClass.h"
controlClass::controlClass()
{
    _componentClass = gcnew componentClass(this);
}

// componentClass.cpp
#include "componentClass.h"
componentClass::componentClass(controlClass ^control)
{
    _control = control;
}

1 个答案:

答案 0 :(得分:3)

通常,解决此问题的最简单方法是将两个类声明放在一个头文件中,然后向前声明第二个。例如:

namespace test
{
    // Forward declaration of controlClass
    ref class controlClass;

    //component class
    public ref class componentClass sealed : Component
    {
    internal:
        componentClass(controlClass ^control);
    private:
        controlClass ^_control;
    };

    //control class
    public ref class controlClass: Control
    {
    public:
        controlClass();
    private:
        componentClass ^_componentClass;
    };
}

可能使用多个头文件完成此操作,但使用单个头文件可以消除警告和复杂性。

您可以继续在不同的源文件中提供每个类的实现而不会出现问题。