2016-10-27 13 views
0

前述のように、thisポインタは、クラスで定義された構造体で呼び出されたときにどのように動作しますか? のは、私は次のコードを持っているとしましょう:この出力を生成クラス内の構造体、 "this"はどのように機能しますか?

class A { 
public: 
    struct { 
     void bar() { std::cout << this << std::endl; } 
    } foo; 
}; 

int main() { 
    A a; a.foo.bar(); 
    std::cout << &a << std::endl; 
    std::cout << &a.foo << std::endl; 
} 

0x62fe9f 
0x62fe9f 
0x62fe9f 

a.fooはどのようfoothisポインタに1つのアクセスはできる、aと同じアドレスを共有しますか? this->fooを使用して

がエラーを発生させる:

test.cpp:20:23: error: 'struct A::<anonymous>' has no member named 'foo'

+0

*ここでは 'this-> foo'を使用していますか? *失敗した*プログラムの[最小限の完全で検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 –

+0

a&fooは実際には同じアドレスを共有します.fooはAの最初のメンバーですから、オブジェクトの型を知ることが重要です。 – UKMonkey

+0

私はその質問を理解していません。まず、 'struct S'は完全に無関係です。あなたの質問は' A'と 'A :: foo'だけです。次に、 'A :: foo :: bar()' *は(A::) 'foo'の' this'ポインタにアクセスします。それで問題は何ですか? – zwol

答えて

6

をアドレスは、ほとんどがちょうどどこメモリオブジェクト「開始」の場合です。どのくらいオフセットする必要があるかは、クラス定義によって定義されます。

したがって、クラスAは「開始」0x62fe9fです。クラスAの開始時に

はそれの前に何もないので、それはまた、あなたが

class A { 
public: 
    int i; 
    struct { 
     void bar() { std::cout << this << std::endl; } 
    } foo; 
}; 

にクラスを変更すると0x62fe9f

あなたが見shloud対処しているメンバーfooです&a.i&aは、同じアドレスを有する&a.fooあるべき&a + sizeof(int)

注:sizeof(int)より大きい場合もあり、パディングの設定方法が異なる場合もあります。これは単純な例です。

+0

これは実際のコードでは使用されていませんが、どのように動作するのか不思議でした!テストの後、最適化フラグがなければ、私のコンパイラは 'sizeof(int)'を追加し、埋め込みはしません。 – Usiten

+0

@Usitenこれはあなたに向けられていませんでした。しかし、これらの答えは他の人のためのものです。それは他の誰もしないようにすることです。そして、デフォルトで 'sizeof(int)'は通常適合します。 'int'の代わりに' char'を使うと、それは 'sizeof(char)'(コンパイラとCPUに依存します)よりも大きくなることがあります。 – Hayt

+0

@ '多くの場合、' virtual'実装は '(a *)'インスタンス上で仮想呼び出しを処理するために必要な 'vtable'への最初のスロットポインタに置かれ、すぐに'&a.i'をシフトします。コンパイラがどのように仮想関数の呼び出しを実装するのか、プラットフォームごとに異なる可能性があります(特に32bと64b)。 (実際にはzwolの答えで 'A :: bar()'に 'virtual'を追加してください)。 – Ped7g

3

おそらく、この修正されたバージョンのプログラムとその出力が啓発されます。

#include <iostream> 
using std::cout; 

class A { 
public: 
    int data; 

    struct { 
    int data; 
    void bar() 
    { 
     cout << this << '\n'; 
     cout << &this->data << '\n'; 
    } 
    } foo; 

    void bar() 
    { 
    cout << this << '\n'; 
    cout << &this->data << '\n'; 
    cout << &this->foo << '\n'; 
    } 
}; 

int main(void) 
{ 
    A a; 
    cout << &a << '\n'; 
    a.bar(); 
    a.foo.bar(); 
} 
関連する問題