ここでどのようなタイプが装飾されているのか混乱しているようです。私は "装飾タイプは何ですか?"
答えはこれです:C++の装飾型は、追加のシンボルによって変換される型です。タイプを別のタイプに変換します。例を見てみましょう:
// The type of a is `int`. The type `int` is not decorated.
int a;
// The type of `b` is lvalue reference of int.
// We decorated int with a `&` to mean that it's a reference to int.
int& b = a;
// The type of `c` is lvalue reference to constant int.
// We decorated `int` with `const&` to mean that it's a reference to int, but constant.
int const& c = a;
// The type of `d` is pointer to int.
// We decorated the type `int` with the `*` to mean that it's a pointer to int.
int* d = &a;
// ^--- be careful here, the & in front of a variable does
// not mean it's a reference. We are not decorating a type here,
// The `&` operator is used to get the address of a variable.
さて、タイプがどのように装飾されているか分かったので、アングルブラケットの意味を見てみましょう。ご覧のとおり、std::vector
はクラスではありません。ただし、std::vector<int>
です。あなたは「私はリストがほしい」と言うことはできません。 「私は< that
のリストがほしい」と言わなければなりません。
角カッコ内に型を配置する必要があります。あなたのケースでは、タイプはA*
です。 A
はクラスであり、A*
は「A
へのポインタ」を意味する装飾型です。つまり、あなたが持っているベクトルはA
へのポインタのリストです!
今、あなたはA*
手段と、ベクターは、あなたの関数の宣言を読むことは容易であるかを知ること:
int foo(vector<A*>& s){....}
s
のタイプはdecoratedeタイプです。それはベクトルのリファレンスです。しかし、それはいくつかのA*
を含むベクトルの参照です。 A*
のタイプはA
で、*
で、それはA
へのポインタです。ここではA
へのポインタのベクトルの参照があります。
p[0] = &a;
これは違法であるのはなぜ?
理由を説明するために、部分的に表現を分割する必要があります。
p [0] = &a
// (1) (2) (3)
3つの部分があります。最初の部分はp
です。 p
とは何ですか?それは前と同じようにA*
のベクトルです。大きな問題ではない。
ここで、(2)
の意味は?これはオペレータ[]
の電話番号vector
です。ベクトルはリストです。 []
は、リストの特定の要素にアクセスしたいことを意味します。具体的には、位置0
の要素にアクセスしたいので、[0]
にアクセスします。だから、全体の表現をベクトルの最初のA*
と見ることができました。つまり、p[0]
はとなり、A*
となります。
はさんが再びあなたの表現を見てみましょう:&a
ある
p[0] = &a
// first A* = (3)
何?最初の例で覚えている場合、&
は変数a
のアドレスを取ることを意味します。
アドレスのタイプはポインタです。したがって、&a
式全体のタイプはvector<A>*
です。今私は今あなたの間違いだと思います。これを言うのは理にかなっていますか?
p[0] = &a
// an A* = a pointer to a vector of A
だから今。どのように機能foo
を使用しますか?あなたが最初の例を覚えているかどうかを確認
は、機能foo
はA.へのポインタのベクトルへの参照が必要になります。
ベクトルへ
int& b = a;
// a reference to an int = an int variable
リファレンスは、同じように動作します:
std::vector<A*>& b = a;
// a reference to an vector<A*> = a vector<A*> variable
関数が機能するためには、Aへのポインタへのベクトル:Aへのポインタへのベクトルを送る必要があります。
std::vector<A*> a;
foo(a);
最後のヒント1つ:自分自身を良いC++ブックにしてください。書籍やオンラインの資料では、これらのすべてを見つけることができます。あなたは、私のような誰かを見つけて、それを説明する良い本を見つけるよりも、あなたを助けるために自分の時間を費やしている可能性は低いです。
これは投票に値する人だとは思わないでください。ここでの使用法について正直な質問。 –
質問には研究が欠けていると思います。説明するリソースはたくさんあります: ''ベクトル ''( 'std'の文脈の中で)とは何か、それをいつどのように使うのか。 「なぜこの違法ですか?」という部分は大丈夫ですが、それ以上の研究があれば質問はおそらくそこにはありません – KABoissonneault
これは、Furkanがこれを学ぶとすぐに彼の人生はもっと複雑になるでしょう。 – Surt