Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cli (如何)在C++中实现一个名为DISFACTION的方法CLI?_C++ Cli - Fatal编程技术网

C++ cli (如何)在C++中实现一个名为DISFACTION的方法CLI?

C++ cli (如何)在C++中实现一个名为DISFACTION的方法CLI?,c++-cli,C++ Cli,我有一个接口,不是IDisposable,它有一个方法void Dispose。我想在C++/CLI中实现这个接口。看来我不能。我试过了 virtual void Finish() = IThing::Dispose {} 但这带来了一些错误: 1>...: error C2039: 'Dispose': is not a member of '...IThing' 1>...: error C3653: 'Dispose': cannot be used as

我有一个接口,不是IDisposable,它有一个方法void Dispose。我想在C++/CLI中实现这个接口。看来我不能。我试过了

    virtual void Finish() = IThing::Dispose 
    {}
但这带来了一些错误:

1>...: error C2039: 'Dispose': is not a member of '...IThing'
1>...: error C3653: 'Dispose': cannot be used as a named override: a function being overridden not found; did you forget to name the function explicitly, using a:: operator?
1>...: error C3766: 'MyNamespace::MyClass' must provide an implementation for the interface method 'void ...IThing::Dispose(void)'
匿名的。C2039和C3766看起来很矛盾

我是错过了什么,还是这简直是不可能的


虽然我承认这是一个糟糕的设计决策,但更改接口不是一个选项,它是由数百个库类实现的。

Dispose是一个保留字,不能用于显式重写。最好的答案是取消提问并更改界面。 但是,

如果你不能改变界面

接口的Dispose的语义与IDispose::Dispose的语义非常接近

你可以忍受它带来的所有副作用


然后,为类声明析构函数将创建一个名为Dispose的方法,该方法将满足您的接口。

使用Dispose方法实际实现IDisposable以外的接口的唯一方法是:

使用另一种.NET语言(可能是C语言)引入一个基类(可能是abstract),该基类通过转发到一个具有不同名称(可能是I ThingDisposal)的抽象虚拟函数来实现Dispose方法。 在C++/CLI中,从该基类继承,并将Dispose实现置于步骤1中命名的方法的重写中。
如果已经有基类,则步骤1中的新基类应该继承旧基类,从而创建间接继承。如果您已经在同一个C++/CLI程序集中实现了一个基类,那么您将受到很大的伤害,因为您必须将程序集拆分为另一种语言可以使用的基类和将使用另一种语言基类的基类。我不羡慕你。

是的,很难对付,Dispose是C++/CLI中的保留标识符。您可以通过为类编写析构函数来实现它,如~RealThing。您可以做任何您想做的事情,就像接口方法应该做的那样。但它确实做得太多了,它还将调用GC::SuppressFinalize,您无法阻止它。C++/CLI类包装器通常需要终结器!RealTebe因为它们将指针封装到本地C++类。如果你不这样做,你会很幸运的。我认为,这与想要决定性地处理一件物品几乎是相反的;我根本不想让IDispose参与进来。它只是一个合同,不需要具体的实现。除了电话之外,你还得忍受。可以说,无论用什么语言编写接口,这都是一个缺陷,可能类似于C,Dispose在该语言中也意味着某种特殊的东西。给它一个析构函数确实能满足编译器的要求。在这种情况下,我可能可以忍受副作用。谢谢。这个问题让我很害怕,唯一好的建议就是让界面的作者来修复它,而这不是任何人都欣赏的建议。只需写下你自己的答案来结束你的问题,随意复制我的评论并将其标记为过时。