3

this配列 ( ) のため、へのポインターを返すコード行を書きたいと思いますstd::vector<foo**>。参照 ( &this) を使用することを考えましたが、うまくいきませんでした。

明確化が必要な場合は、お知らせください。

編集:私が何をしているのかを明確にするために、配列を使用してオブジェクトに直接アクセスしようとしています。そのように: (*ARRAY.at(i))->foo("bar");. ポインタを作るのは不可能だと言う人もいます。その場合、配列を使用してオブジェクトに直接アクセスするにはどうすればよいですか?

4

5 に答える 5

10

へのポインタを持つことはできませんthis。これは変数ではないため、現在のオブジェクトへのポインタに変換される予約済みのキーワードです。

コンパイラーの実装では、ポインターを裏付ける関数のローカル変数が存在する場合がありますがthis、これは実装の詳細であり、プログラマーはそのアドレスにアクセスできません。

あなたがやろうとしていることは非常に邪悪ですが、本当にそれをやりたいのであれば、自分で変数を作成する必要があります。

foo** evil_ptr_to_ptr = new foo*(this);
ARRAY.push_back(evil_ptr_to_ptr);

そして将来的にはそれを削除する必要があります:

// assuming you got all the elements in the array in the same way:
for(int i = 0; i < ARRAY.size(); ++i) {
  delete ARRAY[i];
}
于 2012-07-02T18:29:04.590 に答える
4

C++ ではthis左辺値ではありません。このため、 へのポインタを作成することはできませんthis。まったく同じ理由で、参照を に直接バインドすることもできませんthis

于 2012-07-02T18:33:09.627 に答える
2

this ポインターは、すべての非静的メンバー関数呼び出しに隠し引数として渡され、すべての非静的関数の本体内でローカル変数として使用できます。

したがって、 this ポインターのアドレスを取得しても、実質的に意味がありません。

次の非静的メンバー関数を考えてみましょう。

void my_struct::my_func(int a);

my_struct で呼び出すと、コンパイラは内部でこれを行います。

void my_struct__my_func(my_struct* this, int a);

this ポインターが値で渡されるという事実を考えると、そのアドレスを取得すると、関数が戻った後に存在しなくなるもののアドレスが得られます。

于 2012-07-02T18:40:39.593 に答える
0

他の返信/コメントが指摘したように、thisそれ自体がポインターです。

へのポインターを取得できたとしても、this:thisはローカル変数であり、実行中のメソッドに対してローカルであり、操作しているオブジェクトへのポインターです。

へのポインターを返すthisことは、他のローカル変数へのポインターを返すことと同じ効果がありますthis。定義されたスコープを離れたばかりなので、ガベージが返されます。

編集:私が何をしているのかを明確にするために、配列を使用してオブジェクトに直接アクセスしようとしています。そのように: (*ARRAY.at(i))->foo("bar");. ポインタを作るのは不可能だと言う人もいます。その場合、配列を使用してオブジェクトに直接アクセスするにはどうすればよいですか?

を返しthis、それを配列に格納し、次のようにアクセスします: myArray[idx]->foo("bar")

繰り返しますが、オブジェクトへthisポインターです。

編集:私は訂正しました。this非表示のメソッド パラメータとして実装された右辺値式です。ローカル変数の寿命があります。:)

于 2012-07-02T18:39:14.650 に答える
0

正解はたくさんありますが、別の方法で考えてみてください。

fooメモリ内のあるアドレスにクラスのオブジェクトが割り当てられているとします。thisこのアドレスは、クラスのスコープ内で効果的に表されます。ここで、元のオブジェクトのアドレスを保持する変数への別のアドレスが必要だとします。この変数は宣言され、オブジェクトの有効期間を持つ必要があります。明らかに、そのような変数はデフォルトでは存在しません。作成する意味があまりないからです。コンテナに保持したい場合はfoo**、おそらく の別のコンテナを保持する必要がfoo*あるため、前者が後者を指すことができます。繰り返しますが、ほとんどの場合、そうしても意味がありません。問題を別の方法で解決する必要があると思いますか? (SO で問題を提示して、助けを得たいと思うかもしれません。)

于 2012-07-02T18:46:11.880 に答える