автоматическая ссылка на этот класс для использования в другом для C ++ - PullRequest
1 голос
/ 06 апреля 2010

в Java мы можем сделать это:

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 ++ я имею в виду самоссылку A для использования метода в B?

Ответы [ 4 ]

2 голосов
/ 06 апреля 2010

Во-первых, в статическом методе нет параметра this. Во всяком случае, если предположить, что main () не является статичным, вот как вы можете сделать это в C ++

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 ++ this - указатель на «текущий» объект. Таким образом, если вы определите doSomething() как указатель на A (то есть: doSomething(A* a)), то вы сможете получить this из A. Оператор -> предоставит вам доступ к членам параметра a следующим образом: a->g().

Кроме того, вы можете передать *this и определить doSomething(), чтобы взять ссылку на A (то есть: doSomething(A& a)):

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().

1 голос
/ 06 апреля 2010

C ++ имеет this ключевое слово.Но это указатель, а не ссылка.В вашем случае вам нужно изменить сигнатуру doSomething в классе B на doSomething(A* pA) и использовать ее как b.doSomething(this);

1 голос
/ 06 апреля 2010

this - это ключевое слово в C ++ , указывающее на текущий объект. Возможно, вы хотите *this, который является ссылкой на текущий объект.

Я бы сказал, что это анахронизм; ссылки встречаются чаще, чем указатели в большинстве современных программ на C ++, и все будет работать нормально, если this определено как ссылка.

Но неудобства невелики.

0 голосов
/ 06 апреля 2010

Java - это «современный» компилятор. Модули правильно скомпилированы, включая их перекрестные ссылки. C ++ - это «старый» компилятор, достаточно умный, чтобы делать все за один проход над исходным кодом. Однако это подразумевает, что он позволит вам ссылаться на A из B и даже B из A, при условии, что вы будете использовать только указатели на них. На самом деле, когда C ++ компилирует A, он не знает, что у вас есть класс B. Хорошо, мы можем исправить это, предшествуя объявлению A:

class B;

Что равносильно тому, чтобы сказать компилятору: хорошо, где-то есть класс B. Фантастика. Теперь вы можете поместить параметры типа "B * b", потому что указатель - это просто указатель (4 байта в 32-битных архитектурах ...). Однако вы не сможете скомпилировать что-то вроде, скажем, параметра по значению «B b», потому что, помимо прочего, компилятор должен знать размер класса B, поскольку он даже не скомпилировал это еще.

Существуют и другие соображения относительно вашего кода, особенно в отношении передачи this , ( this - указатель), но на эти аспекты все еще дан ответ.

...