如何在托管C++中正确实现类返回"this"的方法?

How to correctly implement methods of a class returning "this" in Managed C++?

本文关键字:返回 this 方法 实现 C++      更新时间:2023-10-16

我有一个类,它的方法应该返回对象本身,就像在Java中做return this;。我尝试这样做:

foo:

namespace Foo {
    public ref class Bar {
    public:
        Bar quux();
    }
}

Foo.cpp:

Foo::Bar Foo::Bar::quux() {
    return this;
}
编译器报错:error C2440: 'return' : cannot convert from 'Foo:Bar ^const ' to 'Foo::Bar'

我怎么做才对?

   Bar quux();

这很可能是一个打字错误。很难诊断,c++/CLI编译器并不总是产生奇怪的错误消息。您应该返回一个引用Bar对象,它是一个引用类型,其对象存储在GC堆上。. net中没有自动克隆对象的机制。您不能依赖于自动生成的复制构造函数,您可能习惯于从本机c++中使用这种构造函数。在。net中,引用类型和值类型之间的区别很重要,原生c++根本没有这种区别,而是将所有对象都视为值。值类型可以复制,引用类型不能。

可以添加Bar(const Bar%)复制构造函数来保持编译器的快乐,它将自动使用它并停止抱怨quux()。但如果你想返回这个,那就不太可能是正确的。非常高的概率实际上意味着:

   Bar^ quux() { return this; }

注意添加的^ hat

但是,返回this是非常奇怪的,因为调用quux()已经需要对对象的引用。换句话说,如果您现在使用Bar^ foo = obj->quux();,那么您可以简单地编写Bar^ foo = obj;并完成它。不知道你为什么要这么做

你应该这样写

Foo::Bar const& Foo::Bar::quux() {
    return *this;
}