2009-12-01 27 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 2009-12-01 03:34:44

+1

你的問題到底是什麼?你在期待什麼,你有什麼? – fserb 2009-12-01 03:34:50

+0

你有問題嗎,還是剛剛分享? – 2009-12-01 03:34:57

回答

2

在這種情況下使用this將指針傳遞給調用者類,它是A,到b.DoSth。看來你做得對。 this關鍵字始終指向您正在使用它的類實例。

8

在C++中,this是一個關鍵字,它定義爲「指向當前對象實例的指針」。所以你上面的代碼是正確的。

根據ClassAClassB之間的繼承關係/構成關係,可能有更好的方法來實現你正在做的工作,而不是使用this指針。

0

this是一個指向對象實例的指針,所以你所做的是正確的。

閱讀this瞭解更多信息。

0

this是一個指向它自己對象的常量指針。 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上都會有不同的結果y構造的對象比完整的對象(在某些情況下,您可能有未定義的行爲)。

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