[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/24 03:29 / Filesize : 284 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part122



1 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 23:06:15.32 ID:HdItgJjm.net]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part121
peace.2ch.net/test/read.cgi/tech/1449240881/


このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.97【環境依存OK】
peace.2ch.net/test/read.cgi/tech/1439849418/

次期規格C++1zはこちら
C++14/C++1z 20
peace.2ch.net/test/read.cgi/tech/1410382924/

■長いソースを貼るときはここへ。■
 codepad.org/
 ideone.com/

280 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 03:58:43.22 ID:uTTEQY4N.net]
罵倒してるやつの態度は悪いけど
例だろうとポインタ間違えた上に
今時newしてvectorにpush_backしちゃうようなコード書いて
その上逆ギレしちゃう奴は正直ダメだと思う

281 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 06:45:21.02 ID:5quLb8ti.net]
質問です。
ideone.com/QRZXDk
上の21行目の再解釈キャストで型変換してるところってVCでは意図したとおりに動いたのですが、
これって他の環境でも大丈夫ですか?

282 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 07:52:12.29 ID:Vw/b/5l0.net]
配列a[10]で&a==&a[0]となる理由がわかりません。
おしえてください。
&a[0]はaの要素の1番目の番地で&aはaの1番目の要素を
指し示すアドレスのアドレスの気がするからです。

283 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 07:59:56.34 ID:N9T32bdW.net]
アドレスのアドレスなんてものは無いということに気がつけばまぁそんなもんかと理解できるかと
(ポインタ変数のアドレスならある)

284 名前:デフォルトの名無しさん [2016/02/02(火) 09:42:40.95 ID:LvBWX7cX.net]
例外機能をoffにした場合
std::vector<int> v(???);
でメモリの確保に失敗した場合の動作はどうなりますか

285 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:14:27.48 ID:NoB4axe7.net]
"自動車"クラスを"人間"クラスが操作するとします。

"自動車"クラスが提供する個々の機能(例えばアクセルやブレーキ)は、
サブクラスが提供(例えばアクセルはエンジンクラスに定義)して、
"自動車"クラスは特に関与しないものとします。

この前提において"自動車"クラスを定義する場合、"自動車"クラスは
サブクラスを継承するかたちで定義したほうが良いでしょうか?
それとも、自動車クラスが個々のサブクラスのインスタンスを保持して
メソッドをラップしたほうが良いでしょうか?

286 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:22:39.18 ID:ygGmQV70.net]
>>281
継承を確信できるところでのダウンキャストは static_cast の出番。 5.2.9 [expr.static.cast] p2
reinterpret_cast で作った結果に移植性があるのはごく一部だけ。 5.2.10 [expr.reinterpret.cast]

287 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:22:52.91 ID:MIlHcyxr.net]
人とエンジンは特性上車とは異質であるが為継承ではなくラップした方が融通性能高いことは明白である

288 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:23:10.07 ID:ygGmQV70.net]
>>282
いいかげんな教材には a が「配列先頭要素へのポインタである」などと
書いてあるかもしれないが、実際には「配列」であり一部の例外を除いて
「配列先頭要素へのポインタに暗黙変換される」ということになっている。
& 演算子は例外のひとつで、 &a で配列そのものへのポインタが得られる。
4 [conv] p8



289 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:23:22.64 ID:ygGmQV70.net]
>>284
非標準の動作なので、まずコンパイラのマニュアルを調べる。
書いてなければ、どうせ移植性は期待できないので実験でもいいかもしれない。

290 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:24:45.55 ID:ygGmQV70.net]
>>285
https://www.google.co.jp/search?q=is-a+has-a

291 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:30:10.28 ID:NTv/QStd.net]
>>285
当然後者。
現実の関係を模倣するのが普通。

一点、ラップってのをどういう意図で使っているのかが気になる。
個々の部品を組み合わせて、車としての機能を提供すると考えてね。
部品の機能をスルーするだけのラッパーはあまり出ないはず。

292 名前:285 mailto:sage [2016/02/02(火) 11:53:42.81 ID:NoB4axe7.net]
皆さん、回答ありがとうございました。

継承と包含の関係を理解してませんでした。
ちなみに”サブクラス”という言葉の使い方も誤解してたみたいです(^^;

>>291
>ラップってのをどういう意図で使っている

部品の機能をスルーするだけのラッパーという意味でした (^^;

その辺も含めてもう少し設計を見直したいと思います。

293 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 13:09:09.90 ID:ZM61xwKS.net]
未だbetter Cより進んだ使い方ができない

294 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 13:26:24.18 ID:7f7wf/mW.net]
>>284
俺の環境だと、色々省略すれば
std::vector : protected std::_Vector_base {
vector(size_type __n, const allocator_type& __a = allocator_type()) : _Vector_base(__n, __a) { _M_default_initialize(__n); }
};
std::_Vector_base {
_Vector_base(size_t __n, const allocator_type& __a) { _M_create_storage(__n); }
};
となって、最終的に__gnu_cxx::__alloc_traits<_Alloc>::rebind<_Tp>::other::allocate() defined at ext/new_allocator.hが呼び出されて
pointer allocate(size_type __n, const void* = 0) {
if (__n > this->max_size()) std::__throw_bad_alloc();
return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
}
が走る。つまり、俺の環境だと、std::vector<int> v(100);すると::operator new(std::size_t)が呼び出されて、例外機構を殺して確保も失敗するなら投げられたbad_alloc例外を処理できずにコケる。
これを書き換えてoperator new(__n * sizeof(_Tp), std::nothrow);とするならallocateはメモリを確保できない時にnullptrを返す。すると次に_M_default_initializeが走って、
最終的にplacement newが走って、thisをデレファレンスした瞬間にセグメンテーションフォールトでコケる。

要するに、例外が発生して安全に停止する前提でライブラリが組まれてるから、例外機能をオフにしたら不安定な動作になる。
例外機能をオフにしようが何しようがthrow自体は出来るので、きちんとcatchしましょうって話に落ち着くかと。

295 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 14:09:39.60 ID:oBfAWjKR.net]
>>288
知らなかった・・・

296 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 15:14:11.42 ID:Ycdr5jOx.net]
まあせいぜい「配列への参照」くらいまでだな。

297 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 15:35:32.57 ID:TPiwOAfk.net]
aが配列だったらint*の引数部分に&aの形でもいいのか
なんか気持ち悪いな

298 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 15:59:38.85 ID:5quLb8ti.net]
>>286
回答ありがとうございます。
protectedで継承しているのでstatic_castは無効なのです。
これは移植性ないとみるべきなんでしょうか。
強引にCスタイルキャストでごまかすべきか・・・。Orz



299 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:00:35.47 ID:ucpE/ELv.net]
>>282
細かいことを言うようだけど &a == &a[0] ではないよ。
下の例で、3つのprintf()は同じ値(アドレス)を表示する。
けれども if の部分で有効なのは最初の行だけ。
下の2つのif行の注釈を外すとコンパイルエラーになるはず。
a と &a[0] は等しい。
&a と &a[0] は(値は同じだが)型が違う。型が違うので比較はできない。


#include <cstdio>

int main() {
 int a[] = {1, 2, 3, 4};

 printf("a == %p\n", a);
 printf("&a[0] == %p\n", &a[0]);
 printf("&a == %p\n", &a);

 if (a == &a[0]) printf("Equal\n");
 // if (&a == &a[0]) printf("Equal\n");
 // if (a == &a) printf("Equal\n");

 return 0;
}


>>282 の本題、&a と &a[0] の値が同じになる理由は、
配列の中身がメモリにどう格納されるか、を図で表すと分かりやすいんだが
俺の表現力では無理なんでどなたか頼む。

300 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:01:52.82 ID:7f7wf/mW.net]
>>298
castして欲しくないからprotectedにしてるんじゃないの?

301 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:23:10.99 ID:5quLb8ti.net]
>>300
いやー、ハンドルみたいな使い方を規定していて、
自分は外部関数で値を変更したいんですけど、ユーザーには触ってほしくない。
という、わがままな欲求です。
そのうちUnified Call Syntaxが入ったら、いろいろやろうと思ってるところです。

302 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:25:43.26 ID:MIlHcyxr.net]
>>299
コレ昔VC6でやったら結果が違った
BCC5だとすべて同じ値なのに

303 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:29:56.27 ID:MIlHcyxr.net]
vc6だと&aが結局何処差し示しているかわからんかった

304 名前:299 mailto:sage [2016/02/02(火) 17:53:41.97 ID:ucpE/ELv.net]
>>302
a[] において &a が配列全体のアドレスを表すってのは
ANSI C で統一された挙動だったね。調べ直しちゃったよ。

C++ でも成立するよな。自信が揺らいできた。

305 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:55:25.15 ID:C4M/U0aw.net]
VCは規格準拠してないらしいからね
しかたないね

306 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 18:30:04.71 ID:1NZHqYvt.net]
>>282
たまたまお前の処理系がバイト単位でリニアアドレッシングしてるから。
int a[3]; について
 &a[0] は先頭要素のアドレス
 &a は「a[0] a[1] a[2]」という配列全体のアドレス
だから一致する

307 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 18:31:29.65 ID:QW7JMPO0.net]
>>282
https://ideone.com/woT6Lc
&a[0]は要素へのポインタ(一個目の要素へのポインタ)
&aは配列へのポインタ(一個目の配列へのポインタ)だよ

>>231
     :(~):
   :(i:i:i:i:i):
   :(i:i:i:i:i:i:i:):
  :( ゙´ω`゙):   …
  :(:::::::::ソ:::っ:
   :し─J ┃:

308 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 18:35:17.86 ID:KYl+p0oO.net]
一個目の配列って、日本語変



309 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 19:17:24.83 ID:WSo7+ODL.net]
&&&&****aとか&&&&aとかにしても通ってしまう気がした

310 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 20:12:44.79 ID:po3vtalA.net]
arrayと&array[0]が同じなら
なんでsizeof(array)で正しくサイズが出てくるのか分からん

311 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 20:35:13.03 ID:WkrnCzmR.net]
>>310
> arrayと&array[0]が同じなら
ポインタに変換したら一緒になると言うだけ

> なんでsizeof(array)で正しくサイズが出てくるのか分からん
array 自体のサイズをコンパイラは知ってるから

312 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 20:54:40.03 ID:MIlHcyxr.net]
>>309
&と&&は別物だよ
ちなみに&&は定数も代入できる

313 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 20:56:18.82 ID:RveVHAYz.net]
>>312
馬鹿は去れ

314 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:28:49.56 ID:5quLb8ti.net]
array[] -> 配列の型
array[0] ->配列の要素の型

sizeof(array)はdecltype(array)の暗黙に持ってる長さ情報にアクセスしている?
array == &array[0] はアドレス値は同じだが、型自体は違うので持ってる情報は違うもの。前者はT[]。後者は(&T)
暗黙の型変換でぐちゃぐちゃになってるのはお前の頭だ!
であってる?

315 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:29:30.66 ID:5quLb8ti.net]
T&か。

316 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:30:29.16 ID:MIlHcyxr.net]
int &&a = 5 ;

317 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:33:13.54 ID:5quLb8ti.net]
>>316
int&& a=int(5);と等価だっけ?

318 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:34:17.88 ID:MIlHcyxr.net]
T&&a=5 ; が a自体の参照で、
T&&a=n ; でnの参照になったりする。自動で。



319 名前:デフォルトの名無しさん [2016/02/02(火) 21:34:40.95 ID:06fZR6NS.net]
const hoge h;
h.~hoge();
デストラクタはconstついてないのに呼べるのは何故ですか

320 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:53:06.16 ID:RveVHAYz.net]
>>302
今確認したが同じアドレスになった
どうしてそう息を吸って吐くように嘘をつくのか

ちなみに&aがどこを指しているかわからないのは
Visual C++ 6.0じゃなくてお前のオツムが原因

321 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 22:09:17.83 ID:MIlHcyxr.net]
>>320
Hotfixいれまくったりすると環境変わるからね
昔のことだからよく覚えてないけど

322 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 22:20:22.89 ID:RveVHAYz.net]
まあこのメッセージを読んでもどこ指してるかわからないようでは致し方ない

int *p = &a;
error C2440: 'initializing' : 'int (*)[4]' から 'int *' に変換することはできません。(新しい動作 ; ヘルプを参照)

323 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 22:51:04.27 ID:MIlHcyxr.net]
>>322
バカでもわかる型の違いですけど
なんでキャストしないのですか?

324 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:11:50.94 ID:x5amnXbs.net]
キャストで逃げようとするほうがバカ
なんで&a[0]にしないのですか?

325 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:20:08.01 ID:RveVHAYz.net]
知っててキャストするなら問題ないだろう
だが>>323の様にどこを指しているかわからないと言ってるのにキャストするのはヤバい
>>318とかはよ病院に行くレベル

326 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:20:42.79 ID:x5amnXbs.net]
(int*)a:7文字 static_castだと当然もっと長くなる
&a[0]:5文字

327 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:27:30.24 ID:MIlHcyxr.net]
何処もヤバくないと思うんだがね
病院逝くのは貴様の方だろ

328 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:31:01.70 ID:7f7wf/mW.net]
&*a:3文字



329 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:40:56.45 ID:x5amnXbs.net]
&a[0]ならaがstd::vector<int>になっても通用するからそう書けよこのスットコドッコイども

330 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 00:24:20.72 ID:5VKefHqD.net]
c++スレ名物の殴り合いが始まりました!

331 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 07:32:59.13 ID:Gb259GwX.net]
>>329
(int*)aって書ける時点でaは配列かポインタだろ
なんでvectorクラスを仮定してんだよ

332 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 12:46:03.59 ID:6CbCMv4Y.net]
https://ideone.com/wCpVQ1

Javaとは違いC++は基底クラスのインスタンスを派生クラスにダウンキャスト出来てしまうのですが、
これは正しい挙動なのでしょうか。

またオーバーライドした関数が呼べるのは理解できるのですが、
派生クラス独自の関数も呼べてしまうのは腑に落ちません。

333 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 12:54:30.47 ID:AVVts3m8.net]
C++としては正しいが、当然危険なコードなので
もしそうせざるを得ない場合は、設計が間違ってると思うべき

334 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 12:59:18.19 ID:AVVts3m8.net]
正しい挙動の意味にもよるが
どうしても使わざるを得ない場合はdynamic_castを使うべき

335 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 13:02:03.09 ID:EbXG9hpy.net]
>>332
実行時のチェックなしでできてしまうって意味だよね?
プログラマが手動でメモリを割り付けてたりする場合もあるから、下手にチェックされても困るケースがある。
チェックしてほしければvirtual関数持たせた上でdynamic_castしろ。
あと、gが呼べるのは暗黙の引数であるthisに触ってないから、thisがなんであっても問題が表出しないだけ。

336 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 13:59:40.04 ID:XI3wSbIf.net]
>>332
C++言語の仕様上behavior is undefinedなので
どのような結果になっても正しいからな
コンパイラーの出力するコードの都合でたまたまエラー無くspecialが呼び出せてもおかしくはない

337 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 19:09:23.55 ID:V5mcV8ll.net]
私はこの分野にあまり詳しくはないのですが、そうなんですか?

338 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 19:56:03.11 ID:5VKefHqD.net]
>>331
えっ?!



339 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 23:17:57.39 ID:XI3wSbIf.net]
>>337
そうなんです
プログラマーは全知全能でミスをしたら自己責任という思想の言語なので
都合の悪いことはundefined behaviorの扱いにするのがC/C++のお家芸

340 名前:デフォルトの名無しさん mailto:sage [2016/02/04(木) 22:34:42.23 ID:vx+zStXc.net]
質問ですが、
xがbool型変数だとして、下記は常に成立する?
((x && (int)x == 1) || (!x && (int)x == 0)

341 名前:340 mailto:sage [2016/02/04(木) 22:39:53.98 ID:vx+zStXc.net]
補足。
>>340の質問意図は、(int)xでtrue/falseを1/0に変換することが規格で正当化されるか否か確認したいということです。
実はxに格納されたtrue/falseを1/0に変換するには、!!xとでもすべき?

342 名前:デフォルトの名無しさん [2016/02/04(木) 22:49:25.93 ID:+7Di5n3C.net]
bool型変数のtrueとfalseを反転するコードを教えてください

343 名前:デフォルトの名無しさん mailto:sage [2016/02/04(木) 22:52:25.87 ID:DD/iUN5m.net]
>>342
!

344 名前:デフォルトの名無しさん mailto:sage [2016/02/04(木) 23:50:20.63 ID:cr9CcGXP.net]
>>341
今からwww.open-std.orgでN4567をダウンロードして4.7節の第四段落を読むんだ!

345 名前:デフォルトの名無しさん mailto:sage [2016/02/05(金) 14:01:35.52 ID:HgDpm1WA.net]
このスレはGCCとClangどっち派が多いですか?

346 名前:デフォルトの名無しさん mailto:sage [2016/02/05(金) 15:27:33.07 ID:BBqIJr5G.net]
g++とclang++な

347 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2016/02/05(金) 16:01:17.74 ID:+wdY+cb5.net]
Win版のClangはバグがあるからまだ普及してないあるよ。

348 名前:デフォルトの名無しさん mailto:sage [2016/02/05(金) 16:07:19.66 ID:JYiBRtGE.net]
__try __finally が使えるやつじゃないと使う気になれない



349 名前:デフォルトの名無しさん mailto:sage [2016/02/05(金) 18:54:43.78 ID:HgDpm1WA.net]
clangはまだっすか
GCCオワコンとか豪語してたのはなんだったんだ

350 名前:デフォルトの名無しさん [2016/02/05(金) 19:30:15.73 ID:VxMqMA9Y.net]
iccでしょ

351 名前:デフォルトの名無しさん mailto:sage [2016/02/05(金) 20:08:04.06 ID:JYiBRtGE.net]
いい加減、finally 標準化してほしい

352 名前:デフォルトの名無しさん mailto:sage [2016/02/05(金) 20:16:50.99 ID:HgDpm1WA.net]
そういやboost使ってるとGCCは警告出すのにclangは出さなかったりするなぁ 

>>350
昔はアカデミック目的ならタダだったらしいね

353 名前:デフォルトの名無しさん [2016/02/05(金) 20:39:31.37 ID:j4SE5TPh.net]
STLで、 array と vector とで、より基本的なのはどっち?

354 名前:デフォルトの名無しさん [2016/02/05(金) 20:42:32.39 ID:x6bpCF93.net]
vectorパイセン

355 名前:デフォルトの名無しさん mailto:sage [2016/02/05(金) 20:47:18.11 ID:8VG1Xbz/.net]
今は学振の研究費で買う時代

356 名前:デフォルトの名無しさん mailto:sage [2016/02/05(金) 20:54:16.61 ID:0mavO284.net]
>>353
STLにはarrayなんてありません

357 名前:デフォルトの名無しさん mailto:sage [2016/02/05(金) 20:55:35.17 ID:Da4oU4sD.net]
arrayはconstexpr対応になるんだっけ?

358 名前:デフォルトの名無しさん [2016/02/05(金) 23:59:20.96 ID:h93Uutag.net]
uBlasってどんな人が使うの?



359 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 00:13:51.81 ID:UqtC6Emj.net]
行列とかだっけ?解析関係?

360 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 00:15:16.29 ID:cWTD7JVS.net]
早くはないんでしょ
あくまで実装例って位置付けで

361 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 00:23:29.24 ID:EywJMRGG.net]
じゃあblasに興味ある奴が使うんだろ

362 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 11:43:48.82 ID:M1Vkc4iO.net]
>>357
お前まだconstexpr対応してないの?
はよ専用ブラウザ入れろ

363 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 17:55:48.52 ID:DtUiRvEm.net]
C++は見限ったな。 おれはCに移住したが楽園だわ。 

364 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 18:07:24.47 ID:gyUZgEHU.net]
>>363
さようなら、楽園の住人

365 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 18:31:40.60 ID:OQzrG2km.net]
Cにメンバ関数や簡易的なオブジェクト指向が取り入れられるようになったら
C++の存在意義ってなくなるよな。

ここ数年のCはC++の成果を貪欲に取り入れる傾向もあるし、
そのうちC++からCへの回帰が始まるんじゃないかって気がしてる。

366 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 18:36:09.47 ID:DtUiRvEm.net]
いや、もうなってる。 構造体に関数のポインターを持たせてマクロ作ればメンバー関数だし。 構造体の中に構造体を持たせてユニオンすれば継承だしな。 パブリックとかはパイソンみたいにすればいいし。

367 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 18:47:01.63 ID:s3egBiWX.net]
そしてまたc++が生まれ…

368 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 18:52:28.27 ID:ewLa/pEP.net]
C++ が理解できなかったんだな
爺にはよくあることだから悲観しなくていい
楽園で楽しんでくれ



369 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 19:01:46.31 ID:0Vjd8v8v.net]
>>366
> 構造体に関数のポインターを持たせてマクロ作ればメンバー関数だし。
それ継承の仕組みだし
> 構造体の中に構造体を持たせてユニオンすれば継承だしな。
意味不明だし
まあCの楽園で成仏しとけ

370 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 19:06:52.10 ID:1ZsFckKc.net]
わざわざここに書き込みに来た理由を考えるに、たぶん触れないでおいたほうがいいと思う。

371 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 19:09:17.71 ID:/1/YZwYl.net]
>>354
ありがとう
vector先輩についていくわ

372 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 19:23:16.72 ID:lxi6Zpfn.net]
簡単なドライバの本でも読めばいいのに

373 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 20:05:33.75 ID:ijtrMwoE.net]
>>369
>> 構造体に関数のポインターを持たせてマクロ作ればメンバー関数だし。
>それ継承の仕組みだし
仮想関数の素朴な実装だろ;
(正しくはvtblを作るべきだが、

>> 構造体の中に構造体を持たせてユニオンすれば継承だしな。
>意味不明だし
「ユニオン」の誤用があるようだが
入れ子の構造体は継承の素朴な実装に他ならないだろ;

374 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 20:10:44.00 ID:ijtrMwoE.net]
つまり、
struct Foo {
 int m_a, m_b;
};
struct Bar {
 struct Foo m_base;
 int m_x, m_y;
};
としとけば、
 void print_foo(struct Foo* p) { printf("a=%d, b=%d\n", p->m_a, p->m_b); }
に対して、
 struct Bar b;
 print_foo((struct Foo*)&b);
とできる、
これが(virtualでない)継承の真実の姿、

375 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 20:12:28.12 ID:bscwrwNU.net]
C至高信者はどっかほかのところで好きなだけC++をディスってろ
まずはスレ違いだってことを認識できるまでには成長することだな

376 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 20:16:37.46 ID:zK6xYjd8.net]
Cの思想に反する「デストラクター」が使えない以上
あまり意味があるとは思えない

377 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 20:22:56.44 ID:kD783RuO.net]
>>365
XVIewのAPIって知っている?

378 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 20:32:27.60 ID:K1T12T5X.net]
C至高信者は一生構造体をmemsetし続けるに100ペソ



379 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 20:36:18.00 ID:DtUiRvEm.net]
>>374
structをm$独自の拡張を使っていることはいいとして基底クラスの中身をユニオンしておくんだよ。そうすると.で中身をとりだせるようになる。

{}で0になることもしらないのか?

380 名前:デフォルトの名無しさん mailto:sage [2016/02/06(土) 20:49:45.09 ID:ijtrMwoE.net]
>>379
>>374のstructのどこにMS拡張が…?

>>379
>>{}で0になることもしらないのか?
C言語でおk






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<284KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef