autoreferencing this class to use in another for C++
在Java中,我们可以做到这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class A{ public static void main(String...str){ B b = new B(); b.doSomething(this); //How I do this in c++ ? the this self reference } } public class B{ public void doSomething(A a){ //Importat stuff happen here } } |
我如何做同样的事情,但在C++中,我指的是在B中使用该方法的自引用?
首先,在静态方法中没有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class A { public: void f() { B* b = new B(); b->doSomething(this); } void g() { // ... }; }; class B { public: void doSomething(A* a) { // You can now access members of a by using the -> operator: a->g(); } }; |
在C++ EDCOX1中,0是指向"当前"对象的指针。因此,如果您将
或者,您可以通过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class A { public: void f() { B* b = new B(); b->doSomething(*this); } void g() { // ... }; }; class B { public: void doSomething(A& a) { // You can now access members of a by using the . operator: a.g(); } }; |
要访问引用的成员,需要使用
C++具有EDOCX1×0关键字。但它是指针而不是引用。在您的情况下,您需要将B类剂量测量的签名更改为
EDOCX1·0是指向当前对象的C++中的关键字。也许您需要
我认为这是一种过时的错误;引用在大多数现代C++代码中比指针更常见,如果EDCOX1 0定义为引用,那么一切都会很好。
但不便不大。
Java是一种"现代"编译器。模块被正确编译,包括它们的交叉引用。C++是一个"老"编译器,它足够聪明地在一次传递源代码中完成所有的事情。但是,这意味着它将允许您从B引用A,甚至从A引用B,前提是您只使用指向它们的指针。实际上,当C++编译A时,它不知道你有B类。好的,我们可以通过在a的声明前面加上:
1 | class B; |
这等于对编译器说:好吧,在其他地方有一个B类。好极了。现在您可以放置"b*b"类型的参数,因为指针只是一个指针(32位体系结构中的4个字节…)。但是,您将无法按值"b b"编译类似的参数,因为除其他外,编译器还需要知道类b的大小,因为它还没有编译它。
关于您的代码还有其他的考虑,特别是关于传递这个(这是一个指针),但是这些方面已经得到了回答。