关于java:自动引用此类以在另一个C ++中使用

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中使用该方法的自引用?


首先,在静态方法中没有this参数。不管怎样,假设主()不是静态的,这里是如何在C++中实现它的。

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是指向"当前"对象的指针。因此,如果您将doSomething()定义为接受指向a的指针(即:doSomething(A* a)),则可以接收Athis。->operator将允许您访问A参数的成员,如下所示:a->g()

或者,您可以通过*this并定义doSomething()以引用A(即:doSomething(A& a)):

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();
   }
};

要访问引用的成员,需要使用.操作符:a.g()


C++具有EDOCX1×0关键字。但它是指针而不是引用。在您的情况下,您需要将B类剂量测量的签名更改为doSomething(A* pA),并像b.doSomething(this);一样使用它。


EDOCX1·0是指向当前对象的C++中的关键字。也许您需要*this,它是对当前对象的引用。

我认为这是一种过时的错误;引用在大多数现代C++代码中比指针更常见,如果EDCOX1 0定义为引用,那么一切都会很好。

但不便不大。


Java是一种"现代"编译器。模块被正确编译,包括它们的交叉引用。C++是一个"老"编译器,它足够聪明地在一次传递源代码中完成所有的事情。但是,这意味着它将允许您从B引用A,甚至从A引用B,前提是您只使用指向它们的指针。实际上,当C++编译A时,它不知道你有B类。好的,我们可以通过在a的声明前面加上:

1
class B;

这等于对编译器说:好吧,在其他地方有一个B类。好极了。现在您可以放置"b*b"类型的参数,因为指针只是一个指针(32位体系结构中的4个字节…)。但是,您将无法按值"b b"编译类似的参数,因为除其他外,编译器还需要知道类b的大小,因为它还没有编译它。

关于您的代码还有其他的考虑,特别是关于传递这个(这是一个指针),但是这些方面已经得到了回答。