Compiler errors 需要C+中循环依赖的解决方案+/CLI(编译器错误)

Compiler errors 需要C+中循环依赖的解决方案+/CLI(编译器错误),compiler-errors,c++-cli,circular-dependency,Compiler Errors,C++ Cli,Circular Dependency,我试图在C++/CLI中解决以下问题,这会创建循环依赖项。也就是说,在EventHandler中,类还不存在;但是该类需要创建一个EventHandler,因此类的顺序也不能颠倒 我有理由让这两个类相互引用,但编译器不会识别这些类。(即编译器错误)。解决此问题的方法与在普通C++中相同:首先声明类型及其函数,然后使用它们,然后在类型的其余代码之外定义它们。因此,如果您希望将所有内容都放在一个文件中(而不是处理头文件等),可以执行以下操作: public ref class EventHandle

我试图在C++/CLI中解决以下问题,这会创建循环依赖项。也就是说,在EventHandler中,类还不存在;但是该类需要创建一个EventHandler,因此类的顺序也不能颠倒


我有理由让这两个类相互引用,但编译器不会识别这些类。(即编译器错误)。

解决此问题的方法与在普通C++中相同:首先声明类型及其函数,然后使用它们,然后在类型的其余代码之外定义它们。因此,如果您希望将所有内容都放在一个文件中(而不是处理头文件等),可以执行以下操作:

public ref class EventHandler
{
public:
    EventHandler(){} 

    void DataChanged(Object^ sender, DataTableEventArgs ^arg);
};

public ref class DTManager
{
    // all of DTManager's code goes here; you can use EventHandler::DataChanged
};

void EventHandler::DataChanged(Object^ sender, DataTableEventArgs ^arg);
{
    DTManager::DataChanged(arg);
}

正常的C++方式是在头文件中声明所有类型及其函数,并将它们的定义仅放入代码文件中。这样做对于大型项目来说要容易得多,尤其是当您有循环依赖关系时。

hmm我可能做错了什么,但我遇到了以下错误:错误3错误C3767:“MyNamespace::DTManager::DataChanged”:候选函数不可访问您是对的!在DTManager::DataChanged之前,我忘记使用public.:另外,你能告诉我我收到的错误吗?如果没有公共函数,为什么它被称为候选函数?我想这就是编译器选择调用哪个方法的部分的工作原理:首先使用正确名称的所有方法,然后删除那些不可访问的方法。而不是相反。在这种情况下,我认为这是对您有利的,因为否则您可能不会得到那么好的错误消息。编译器在使用所有类型时必须知道它们。谷歌“C++不完整类型”并将声明从定义中分离出来以生存。