2016-11-29 6 views
-2

私はこのようなコードを見たのだ、polimorphismを学んでいた。ポインタ手段のベクトルとは何ですか?

Class A {}; 

int foo(vector<A*> &s){....} 

vector<A*>の平均と何vector<A*> &sの平均であるとどのように私がfooののfuctionを使用することができますが何ですか?例えば

vector<A> a; 
vector<A> b; 
vector<A*> p; 
p[0]=&a; //Why this is illegal? 

foo(p); //Why this is illegal? 

と私の最後のquistionはvector<A>vector<A*>vector<A>*vector<vector<A>>vector<vector<*A>>

+0

これは投票に値する人だとは思わないでください。ここでの使用法について正直な質問。 –

+0

質問には研究が欠けていると思います。説明するリソースはたくさんあります: ''ベクトル ''( 'std'の文脈の中で)とは何か、それをいつどのように使うのか。 「なぜこの違法ですか?」という部分は大丈夫ですが、それ以上の研究があれば質問はおそらくそこにはありません – KABoissonneault

+0

これは、Furkanがこれを学ぶとすぐに彼の人生はもっと複雑になるでしょう。 – Surt

答えて

-1

ベクトル間の服従が標準テンプレートでいるもの、

ですライブラリ(STL)。動的なサイズのコンテナのような配列です。配列のようなサイズを宣言する必要はありません。複雑さは配列と同じです。

+1

これは彼の質問のいずれかに答えて表示されません。 –

+0

STLは数十年前に標準ライブラリに吸収されました。死ぬようにしなさい。 – user4581301

+0

彼はまた、 "ベクトルの平均は何ですか?" –

0

これらは配列を表すシーケンスコンテナです。彼らはサイズを変更することができます。あなたがfooを使うとき。 fooは、識別子が必要な例で使用する名前です。しかし、識別子に意味のある名前を付けるコンテキストはありません。

+1

あなたはもっと説明してくれますか? –

4

ここでどのようなタイプが装飾されているのか混乱しているようです。私は "装飾タイプは何ですか?"

答えはこれです: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++ブックにしてください。書籍やオンラインの資料では、これらのすべてを見つけることができます。あなたは、私のような誰かを見つけて、それを説明する良い本を見つけるよりも、あなたを助けるために自分の時間を費やしている可能性は低いです。

+0

お手伝いいただきありがとうございますが、「ベクトル」と「ベクトル&」とfoo関数を使用することについてのいくつかの例を教えていただけますか? もう1つのıはわかりませんが、アドレス演算子と参照者の違いは何ですか? –

+2

@FurkanYıldızテキストブックの章を書くのに手間がかかりませんが、彼がどれだけあなたを助けることができないのか分かりません。あなたは言語の基礎についてのあなたの理解を磨く必要があります。以下のリンクが役立ちます:https://isocpp.org/images/uploads/2-Tour-Basics.pdf – user4581301

+0

@FurkanYıldız私は説明を追加しました。慎重に、特に良いC++の本を得ることについて話している部分を注意深く読んでください。 –

関連する問題