2009-12-01 11 views
10

C++のthisキーワードと混同していますが、私がthisを渡して正しいことをしているとは分かりません。C++で "this"を渡す方法

ClassA::ClassA(ClassB &b) { 

    b.doSth(this); 
    // trying to call b's routine by passing a pointer to itself, should I use "this"? 
} 

ClassB::doSth(ClassA * a) { 
     //do sth 
} 
+0

このコメントの「それ自体」は、ClassAオブジェクトまたはClassBオブジェクトを意味しますか? – Stobor

+1

あなたの質問は何ですか?あなたは何を期待していますか、何を得ていますか? – fserb

+0

あなたに質問がありますか、それとも共有していましたか? –

答えて

2

b.DoSthに、ある発信者クラスへのポインタを渡しますthisを使用して、この場合:ここで私が苦しんでいるコードの一部です。あなたは正しいことをしているようです。 thisキーワードは、使用しているクラスインスタンスを常に指しています。

8

C++では、thisは "現在のオブジェクトインスタンスへのポインタ"として定義されたキーワードです。上のコードが正しいです。

ClassAClassBの間の継承/構成の関係によっては、thisポインタを使用するよりも、実行していることを達成するためのより良い方法があります。

0

thisはオブジェクトインスタンスへのポインタなので、あなたがしていることは正しいです。

詳細については、thisをお読みください。

0

は、それ自身のオブジェクトへのconstポインタです。 thisポインタは変更不可能です。

ClassA::ClassA(ClassB &b) { 

     b.doSth(this); 
     // here 'this' refers to this object ie the instance of ClassA. 
     // When you pass 'this' to doSth function --> is equivalent to passing 
     // the instance of current object of ClassA. 
     // 
    } 
14

正しく使用しています。このポインタは現在のオブジェクトインスタンスを指します。

class helper 
{ 
public: 
    void help(worker *pWorker) { 
      //TODO do something with pWorker . . . 
    } 

    void help2(worker& rWorker) { 
      //TODO do something with rWorker . . . 
    } 
}; 

class worker 
{ 
public: 
    void dowork() { 
      //this one takes a worker pointer so we can use the this pointer. 
      helper.help(this); 

      //to pass by reference, you need to dereference the this pointer. 
      helper.help2(*this); 
    } 
    helper helper; 
}; 

さらに、worker *pW = new worker()と宣言します。 pWオブジェクトのメソッド(dowork)のいずれかを呼び出すと、thisポインタとpWが全く同じ値(両方が同じアドレス)であることがわかります。

(確かにそれがビルドされていることをテストしていないが、私はそうすべきだと思う)

5

「this」や「* this」を渡すことは間違いありません。

生涯危険性:あなたが与えてきた例について

一つのポイントは、あなたがClassAのコンストラクタからdoSthを呼び出しているということです。 doSthに渡されたオブジェクトは、おそらく部分的に構築されたオブジェクトである:

class ClassC { 
public: 
    ClassC() 
    : m_c() 
    {} 
    int m_c; 
}; 

class ClassA : public ClassC { 
public: 
    ClassA (ClassB & b) 
    : ClassC() 
    , m_b (b.doSth (this)) // ClassC constructed 
          // ClassA members partially init. 
    { 
    b.doSth (this);   // ClassA members initialized 
    } 

    // ... 
    int m_a; 
}; 

class ClassD : public ClassA { 
public: 
    ClassD(ClassB & b) 
    : ClassA (b)    // Partially init 
    , m_d() 
    { 
          // ClassC and ClassA constructed 
          // ClassD members initialized 
    } 
    int m_d; 
}; 

doSthがまだ初期化されていないメンバー使用している場合に問題があるかもしれません:オブジェクトの動的な型を使用して

void ClassB::doSth (ClassA * a) { 
    int i = a->m_c;  // OK m_c is initialized 

    int j = a->m_a;  // Not OK, m_a not initialized when called 
         // from member initialization list. 

    int k = static_cast<ClassD*> (a).m_d; // Not OK 
} 

を:

最後に、オブジェクトの動的な使用(例えば、仮想呼び出し、dynamic_cast、typeid)は、partiall (そして場合によっては未定義の動作を持つことができます)。

void ClassB::doSth (ClassA * a) { 
    if (ClassD * d = dynamic_cast<ClassD *> (a)) 
    { 
    // Never true when called from ClassA::ClassA 
    } 
} 
関連する問題