C++
1コード 2 3//基底クラス 4class Bottom 5{ 6 public: 7 char esc; 8 char kind; 9 short x1; 10 short y1; 11 short x2; 12 short y2; 13 long foreColor; 14 long backColor; 15}; 16 17//派生クラス 18class StraightLine : public Bottom 19{ 20 public: 21 22 char lineKind; 23 char NOT_USE; 24 short startX; 25 short startY; 26 short endX; 27 short endY; 28 29 //コンストラクタ 30 StraightLine(); 31 32 //デストラクタ 33 ~StraightLine(); 34 35}; 36 37 38int main() 39{ 40 StraightLine *straightine = new StraightLine[2]; 41 std::vector<Bottom> bases;//全部入れるテーブル 42 43 //ここらへんでpush_backでvectorにデータを入れています。 44 45//イテレータで回しています 46for (vector<Bottom>::iterator it = begin(bases); it != end(bases); ++it) 47 { 48 49 50 //聞きたいところはここです 51 if (straightine = dynamic_cast<StraightLine*>(it)) { 52 53 //ここで派生クラスの関数で出力している 54 55 } 56 57 } 58} 59 60 61 62```現在、会社の研修であるプログラムを作っていますが、レビューで仕組みを説明できなくて困っています。 63それが、基底クラスのvectorに派生クラスのデータを入れ、後でiteratorのfor文で回しながらvectorの中に入ってるデータを出力するところなのですが、iteratorからvectorの中の派生クラスのデータを出力しようとしたら、iteratorから派生クラスの中のデータにアクセス出来ないのです。 64 65そのため、if文で条件式の中で新たに作った派生クラスのインスタンスの中にvectorのデータを代入して代入できたら出力するといった処理を書きました。 66 67ですが、説明しても違うと言われ、資料を探しても関連したものが見つからなくて困っています。 68 69うまい説明ができる方は教えてくださいますようお願いします。
そのコードを提示しましょう
この説明はうまくできているんでしょうか?
「違う」と言っている人に詳細を尋ねない理由は何か? 何故他所で訊くのか?
(質問文面だけ見るとスライシングしてそうだが)
それはそれとして,
ifによって代入の可否を判断するという話がどのような実装となるのかがピンと来ないので
後学のためにコード提示いただきたいところ.
詳細を訪ねようとしても課題にならないからと言って教えてくれませんでした。
ここで尋ねても課題にならないのでは?
どこを調べても答えにたどり着けないので、もう他の人に聞きたくてここに書きました。
そういう時は指導者に「わかりませんでした」と正直に言うのが成功の一番の近道です。できたふりをすると取りこぼされます。
解らないといっても最後まで頑張れと言われたので困っています。
このコードでまともな(所望の,あるべき)表示が成されるのか否かを動作確認されたのでしょうか?
した場合→その結果はどうでした?
ちゃんと動作しています。
ただ、条件式で代入できているかできてないかで判断しているとしか理解できていないため、説明ができないのです。
仮にそのdynamic_castがコンパイル通るのだとしても,所望の結果を返すようには思えないです.
逆に言えば,「これでまともに動くのであって,その仕組みを説明するのだ」という話であるならば,
個々の要素に関して具体的な説明をしていけば良いのではないでしょうか.
・「基底クラスのvectorに派生クラスのデータを入れ」たらどうなるのか
・「iteratorから派生クラスの中のデータにアクセス出来ない」のは何故か
・その対処として記述したifの箇所の処理に関して
・std::vector<Bottom>::iterator を dynamic_cast<StraightLine*> するとどうなるのか
・そのdynamic_cast結果を代入する式の評価結果で分岐するifの具体的意味は何か
・その他,StraightLine *straightine = new StraightLine[2]; ← これの[2]の理由とか
…
といった具合に.一つ一つ.
そうじゃなく、if文の仕様を説明しろみたいなことを言われました。
であれば,説明すればよいのでは……
例えば,ifに関してちょっとふわっとしている場合でも,
if( a == 1 ) //aが1だったら
みたいなコードを書くことはできると思うのですが,
if( a = func() ) //()内が比較じゃないぞ?
といったコードを書くには相応の理解があるであろうと見えるので,訊かれているのだと思います.
代入できるかできないかで判断して真理値を返しているみたいな説明しても違うといわれて困っているのです。
もう、どう説明した良いのか解らないのです。
何だろう,もっと根本的に
if( X ){ 処理A; }
とか書いた時,「XがどうだったらAが実施されるのか」というのを"ifの仕様"と呼ぶのではないでしょうか.
まずはそこのところからの説明が要求されているのでは?
そうじゃないらしいですね。
まず、「if文の条件文は比較演算子を書くのに、何で代入演算子で動作返しているかを答えなさい」みたいなことを言われました。
なのでどう説明したらいいのか解らないのです。
そこがわからないと書けないコードですが、あなたはこれを自分で書いたと言って提出したんですか?
代入出来たら結果を返すという漠然とした仕組みは知っていたので書けました。
ただ、レビューでどうやって説明したらいいか解らないんです。
いや,だから,
(1) 代入文というのは,これこれこういう形に評価されるのであって,
(2) 他方,ifの仕様というのは「Xの部分がこうだったらこうなる」というものであるからして,
(3) よって,(1)と(2)より,代入文をif( X ) のXの部分に書いた場合には…
とか説明していけば良いのではないのか?
そこに代入文を書いたのは他ならぬあなたなのだから,当然 (1)~(3) は理解しているハズ(不足/不安ならCの基礎みたいなのをググるなりして2時間くらい復習でもすればいいし)で,あとはそれを順序立ててうまいこと「if文の条件文は比較演算子を書くのに」とかほざいている野郎を論破すれば良いのではないのか?
いいえ、それだけでは書けません。どう説明したらいいかわからないのではなく、あなた自身がこのコードの意味がわかっていません。
わからないまま人に聞いたりコピペしたりして泥沼にはまっているようにしか見えませんが、このままずぶずぶ行くつもりでしょうか?
説明の形の1つとして…
int Func1(){ return 1; }
int Func2(){ return 2; }
...
if( Func1() + Func2() ){ A; }
とかいうのがある時,これを要約(変形?)していけば
if( Func1() + Func2() ){ A; }
というのは
if( 1 + 2 ){ A; }
になって,それは最終的に
if( 3 ){ A; } //←ここまできたら「ifの仕様:処理Aを実施するかしないか」という話になる
になるよね,みたいな.
これと同じように,あなたが書いたifを要約していけばどうでしょう?
(dynamic_castがit次第で何返すか異なるけども,そのパターン分の要約を示せばいい)
コンパイルすらできないコードで質問しても意味がありません。
dyanmic_cast<型>(式) は、型も式も、ポインタか参照でないといけません。
if (straightine = dynamic_cast<StraightLine*>(it)) { の it はクラスのインスタンスであって、
ポインタではありません。
(とりあえずここまでの複数個のコメントによって,今からでも把握すればよさそうな事柄に関しては割と網羅できたのではないかと思うけど…どうかな?)
>>kazuma-sさん
すみません、会社で書いたコードを思い出しながら書いたので、少し間違っているかもしれません。
ですが、今回はif文の条件文で何故代入演算子で動くかについての説明ですので、その説明をおねがいしたいのです。
>>fanaさん
if文に代入演算子を使うと、代入され、普通なら条件は常に条件は常に真理値が真の状態になります。
ただ今回はベクタに入っているデータを派生クラスのインスタンスに代入する式になっているので、代入できるかどうかの判定の式になります。
だいたいこんな説明をしました。
> すみません、会社で書いたコードを思い出しながら書いたので、少し間違っているかもしれません。
https://wandbox.org/permlink/xMxhkn6xBGJo7QOF
今のコードはコンパイルエラーになるだけなので、説明する以前の状態です。せめてちゃんとコンパイルして動作するコードにしてからでないと、回答の前提となっている質問のコードが間違っている可能性が高く、回答が無駄になってしまいます。プログラムは一文字違っただけで全く違う動作や逆の動作をする時もあります。「少しの間違い」は「大きな間違い」です。
コードの説明を求めるなら、まともに動くプログラムで質問するようにお願いします。
回答3件
あなたの回答
tips
プレビュー