X



C++相談室 part136

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ bf81-LHz9)
垢版 |
2018/06/07(木) 23:40:12.36ID:GNQuDMaA0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part135
https://mevius.5ch.net/test/read.cgi/tech/1522495206/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0497 ◆QZaw55cn4c (ワッチョイ 7f60-DJU/)
垢版 |
2018/06/24(日) 10:27:01.80ID:rYGVoBbS0
>>496
基底クラスのポインタで複数の派生クラスのポインタとして振舞えるの?
template を使ってポリモーフィズムを実装できるとでもいうの?
0498デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)
垢版 |
2018/06/24(日) 10:27:08.87ID:6XPmSU1L0
>>496
FILE*を使う関数にbasic_stringをc_str()で渡すのではなく、
setvbuf() のようにFILE*の内部で使うバッファを basic_string に置き換える意味で言いました。
fprintf() でbasic_stringに書き込むことが可能になるイメージ。
C++にはpopen()で開いたパイプFILE*に相当するiostreamがないのでこれで代用可能。
0503デフォルトの名無しさん (ワッチョイ 7f7e-09r9)
垢版 |
2018/06/24(日) 12:56:28.50ID:l/Tfpprp0
>>497
ポリモーフィズム=継承ではない
継承もポリモーフィズムを実現するための手法の一つにすぎない
ざっくり言えば同じ名前で異なった振る舞いをするもののことを言う
関数オーバーロードもポリモーフィズム
0507 ◆QZaw55cn4c (ワッチョイ 7f60-DJU/)
垢版 |
2018/06/24(日) 16:48:47.47ID:rYGVoBbS0
>>503
>関数オーバーロードもポリモーフィズム
関数オーバーロードはコンパイル時には(どこからどこへコールしているかが)確定しているものですね
そういうものに「ポリモーフィズム」を当てるのは抵抗があります

もっとも wikipedia をみると、私の考えているポリモーフィズムは「部分型付け」(subtyping/inclusion polymorphism) としてサブクラス化されています
これは私の認識を修正しないといけない…
0511デフォルトの名無しさん (ワッチョイ ff0d-GwbS)
垢版 |
2018/06/24(日) 20:51:47.44ID:NxOKC53L0
拡大解釈すればできちまうものだからな
いくらでも俺様解釈し放題
それを聞かされている衆目がついていけないと言ったとき
強弁するやつと謙虚なやつでリトマス試験紙みたいになる
0512デフォルトの名無しさん (ワッチョイ 7f7e-09r9)
垢版 |
2018/06/24(日) 21:00:48.39ID:l/Tfpprp0
もともとプログラミング言語の理論の方から出てきた言葉なので拡大解釈ではないでしょ
オブジェクト指向言語がそれらの理論から引用してオブジェクト指向におけるポリモーフィズムとは継承とオーバーライドによるサブクラス化のことだと言っているだけ
0514デフォルトの名無しさん (ワッチョイ 9fc3-loLi)
垢版 |
2018/06/25(月) 19:33:27.29ID:INT0btTo0
個人的にはどっちかというと「動物ってのはワンワン鳴く奴のことだろ?猫や馬まで動物と呼ぶのは俺様解釈の拡大解釈」
って言ってるような滑稽さを感じる
0524デフォルトの名無しさん (ワッチョイ 1f04-WDJb)
垢版 |
2018/06/26(火) 20:14:32.50ID:WXAcQZJd0
アクセス権つき構造体とユニファイドコールシンタックスで疎結合オブジェクト指向だ。
と考えたのだが、ユニファイドコールシンタックスが死んでしまった。
0525デフォルトの名無しさん (ワッチョイ 1f80-2Io7)
垢版 |
2018/06/26(火) 22:13:37.78ID:9TMgx4Gk0
ifdefできるだけなしで
どんなコンパイラでも通って同じ動作するコードを書けよ
コレは命令だ
0527デフォルトの名無しさん (ワッチョイ 1f80-2Io7)
垢版 |
2018/06/26(火) 23:37:30.28ID:9TMgx4Gk0
最低限、実機で間違いなく動いて
シミュレーターで間違いなく動くようにコード書きなさい

コードはいろんな実機をサポートしないといけない
実機ごとにOSも違う
0530デフォルトの名無しさん (ワッチョイ 7f12-2Io7)
垢版 |
2018/06/27(水) 08:36:26.41ID:2Ak+f5Tw0
スレが伸びないのは難し過ぎるからじゃないのか

オブジェクト指向なんかはニワカが口を挟みやすい
あれやこれやと語ることがあると自転車置き場のごとくスレが伸びるんだよ
0535デフォルトの名無しさん (ワッチョイ 42b3-1uqC)
垢版 |
2018/06/28(木) 22:38:07.65ID:Uq302Ahl0
クラス/構造体の非静的メンバ変数/関数へのポインタ宣言 ってのを初めて知ったんですが、
これはどういう活用方法があるんでしょうか?

struct S { int data; };
int S::*d = &S::data;

S s1 = {999};
s1.*d; // → 999
s1.*d = 123;
(参考: 改訂第3版 C++ポケットリファレンス p.39)

上の例だと、 s1.data の別名以外の使い道がないように見えます。
長い長い真名の時は局所的に略記できて便利とか?、まさかそれだけですか?
0540はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 466f-yQv9)
垢版 |
2018/06/28(木) 23:15:19.82ID:wg8xow/s0
>>535
そのとき S が int 型のメンバを持たなくても int S::*d という変数宣言が許される。
(無理矢理な型キャストをしない限りヌルしか入れられないけど。)
つまり、 S がプリミティブな型でなくクラスであるならば、メンバにかかわらず int S::*d は許容されて、
プリミティブな型だったらエラーになる。

この性質を利用して SFINAE で切り替えれば、与えられた型がクラスであるかどうか判定するものを作れる。
それが >>538 の言う is_class の実装に使えるって話ね。
まあ今なら is_class を使えよって話だから普通のプログラマ的にはどうでもいいけど。

回りくどい利用法なんだけど、まあ実際のところ実務の中で必要とする場面はそんなにないから、
この利用法が代表的なものとして紹介するしかない。
0541535 (ワッチョイ 42b3-1uqC)
垢版 |
2018/06/29(金) 00:23:10.79ID:1qhfpQ0p0
初心者の質問に答えていただき有難うございます。
動的にメソッド切り替えは実際に動かして理解できました。
SFNAEで切り替えの方ははコンパイル通る形にはできてませんが概要は理解できました。
0544デフォルトの名無しさん (ワッチョイ 217f-yQv9)
垢版 |
2018/06/29(金) 10:08:42.72ID:+bZtBt0B0
メンバ関数の参照はないんですか
0552デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/29(金) 20:59:13.00ID:WoPz4eP90
template<class ... Args>
void func1(Args ... args) {
outputs(buf, args...);
}
こういう可変長引数のテンプレートの場合に別のファイルで利用する場合には
どう宣言したらいいの?

void func1(???);
0554デフォルトの名無しさん (ドコグロ MMc1-9w61)
垢版 |
2018/06/29(金) 21:28:52.21ID:/ZgRdmO0M
>>546
> バインダ使うときどうすんだよ
だからバインダ使いまくるとか覚えたての初心者か
って話な

> そりゃあエンドユーザーは滅多にというか一生使わんが
誰もしてない話を勝手に始めて
> そんな話してねえぞ
とか、ギャグかよ w

>>548
>>545の日本語も理解できないのか?
0557デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/30(土) 04:02:37.35ID:p5lz5e260
関数型テンプレートってのは、型でもなしに、実態でもない。不思議な存在だ。
型だとすれば、関数プロトタイプのように繰り返して宣言しても問題ないはずだ
が、そうするとエラーになる。実態かというと、これ自体では何のコードも生成しない。
利用するときに始めてコードが生成される。
0558デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/30(土) 08:17:40.24ID:p5lz5e260
unsigned long address;
int dt;
*(char *)&address = dt;
コンパイラエラーにはならないが動作しない。ところが
uint8_t *address ;
*address = dt;
これだと動作する。なぜなんだ? 
0560デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/30(土) 08:47:45.01ID:p5lz5e260
=0x20000;を書き忘れていた。あとは上に同じ。
0563デフォルトの名無しさん (ワッチョイ adbd-7ca/)
垢版 |
2018/06/30(土) 08:53:37.93ID:yaCLVjK30
前者はaddressの最初(または最後)の1byteだけを書き換えようとしているけど、それは意図通りなの?
後者は0x20000番地の値を書き換えようとしてるけど、そこは書き換えてもよい領域なの?
0564562 (ワッチョイ 2193-OY1D)
垢版 |
2018/06/30(土) 08:54:40.20ID:+ldexLXj0
おっと、未定義動作がらみで「何が起きても不思議じゃない」かも知れん。
リトルエンディアンの機械での素朴な予想レベルでの「期待通り」ね。
0567デフォルトの名無しさん (ワッチョイ 869f-Rle/)
垢版 |
2018/06/30(土) 10:44:57.06ID:6fEIEQu00
>>546
c++で閉じてるなら関数ポインタ渡すインターフェイスより、
クラスを継承してメソッド実装させるインターフェイスのが普通だろ。
まあcからの関数ならよくあるが。

>>557
単なる型付マクロだっつーの。
0571デフォルトの名無しさん (ワッチョイ 217f-yQv9)
垢版 |
2018/06/30(土) 12:27:29.89ID:YQWqrdY/0
今どきマクロなんて使うアホがいるのか
0572デフォルトの名無しさん (ワッチョイ 79b3-HrKv)
垢版 |
2018/06/30(土) 12:30:54.83ID:gIC/SSHD0
スフィ姉を使った技についてスレッドがあってもいいかもしれない。
0574デフォルトの名無しさん (ワッチョイ 79b3-HrKv)
垢版 |
2018/06/30(土) 12:55:30.82ID:gIC/SSHD0
スフィ姉がいるならスフィ妹もいるかもしれない。
0576デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/30(土) 16:15:54.20ID:p5lz5e260
>>563
damecaseの理由がわからない。
void Test::clear(unsigned long baseadd, unsigned int dt, int leng)
{
#if(okcase)
uint8_t * addp = (uint8_t *)baseadd;
for(int i=0; i<leng; ++i){
*addp++ = dt;
}
#endif
#if(damecase)
unsigned long addp = baseadd;
for(int i=0; i<leng; ++i){
*(char *)&addp++ = dt;
}
#endif
}
0577デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/30(土) 16:20:31.87ID:p5lz5e260
baseadd=0x20000でダンプすると初期値は全部ffが入っている。
leng=100としてdt=0を書き込むとokcaseはOK100バイト0クリアされる。
damecaseは全く反応しない。
0578デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/30(土) 16:25:07.29ID:p5lz5e260
>>566
とおるよ。頭の中でCastしてくれたら
0579デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/30(土) 16:32:50.93ID:p5lz5e260
>おっと、未定義動作がらみで「何が起きても不思議じゃない」かも知れん。
>リトルエンディアンの機械での素朴な予想レベルでの「期待通り」ね。

どうして?
何処が、どういう理由で未定義なの?
リトルエンディアンが問題というのはバイトオーダーが関係するということ?
1バイトのエリアに代入するのにバイトオーダーが関係するはずはないでしょ。どいういうこと?
char*pのpは1バイトデータのポインタ(アドレス)だよ。代入先が1バイトなのでエンディアンは関係ないと思うが、、、
0584564 (ワッチョイ 2193-OY1D)
垢版 |
2018/06/30(土) 20:23:16.90ID:+ldexLXj0
>>579
「ある型へのポインタの値をキャストで別の型へのポインタとして扱い、
その(キャストで得られた)ポインタに対して * 演算子で格納する」行為自体が
規格で未定義になってるかも知れんてこと。確実じゃないんだけど。

キャストの時点でか、*でアクセスしたときか、格納の時か、
どことは言えないけど何となく未定義クサい感じがする。
0585デフォルトの名無しさん (ワッチョイ 2980-iScA)
垢版 |
2018/06/30(土) 21:00:17.02ID:ozTCpxdq0
↓addpをインクリメントとか頭悪いの?
*(char *)&addp++ = dt;
unsigned longのaddpをインクリメントしてる
addpはポインタじゃないぞ。。。

きっとバカが動作しないといってるのは
落ちるということではない

動作はするが期待どおりの結果にならないということで間違いない
バカはなにがやりたいのか意味不明
0586デフォルトの名無しさん (ワッチョイ 2980-iScA)
垢版 |
2018/06/30(土) 21:07:38.23ID:ozTCpxdq0
unsigned long addr = 12345678;
char* pByte = &addr;
ならいけるハズ

*pByte++ = dt
で leng が sizeof(unsigned long)/sizeof(char) 回までの繰り返しなら
普通に落ちずに動作するハズ

ばああああああああああああああか
しかいないわこのスレ
0587デフォルトの名無しさん (ワッチョイ 79b3-HrKv)
垢版 |
2018/06/30(土) 21:10:52.08ID:gIC/SSHD0
std::addressof()。
0588デフォルトの名無しさん (ワッチョイ 2980-iScA)
垢版 |
2018/06/30(土) 21:17:55.34ID:ozTCpxdq0
いやねcすら理解できてないヤツラが
c++とか一億年早い

こんなヤツラがc++でコード組んでるかと思うと
ぞっとするわ。。。

シロウトはおとなしくjavaにしときなさい
0589デフォルトの名無しさん (ワッチョイ 2980-iScA)
垢版 |
2018/06/30(土) 21:39:50.97ID:ozTCpxdq0
for(int i=0; i<leng; ++i){
((char *)&addp)[i] = dt;
}

バカ向けのコードを書いてやったぞ
コレでバカにとってはすべて解決

コレがなんのことか分からないなら
もう二度とプログラムなんかやらないほうがいい

センスない、むいてない
0591デフォルトの名無しさん (ワッチョイ 2980-iScA)
垢版 |
2018/06/30(土) 21:58:37.22ID:ozTCpxdq0
ぐぐったぞ

http://d.hatena.ne.jp/yohhoy/20120220/p1

> 文字型。規格ではchar*, signed char*, unsigned char*が別の何かを指すことが特別に許されています。
> これは文字型がメモリ上の任意のaliasになり得ることを意味します。

どうかしたのか
もうねバカばっかりで困るわマジで

池沼しかいないの? このスレ?
0592デフォルトの名無しさん (ワッチョイ 2980-iScA)
垢版 |
2018/06/30(土) 22:05:16.74ID:ozTCpxdq0
ちなみになchar以外で変なメモリアドレス(メモリ上有効なアドレスあっても)の位置からcharより大きいサイズの数値を参照すると
memory wrapの切れ目の問題(つまりwrap over)で
bus errorを普通に起こす計算機がある

このスレにいるようなマヌケたち以外にとっては常識だからな
0594デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/30(土) 22:22:23.05ID:p5lz5e260
>&いらん

コンパイルエラーにはならない。ワーニングにもならん。という事実を書いている。
些末なことで糞ほどワーニングやエラー出すC++だ。ワーニングにならんということは正しい
ということか、コンパイラがアフォかさもなくば、何か別の意味があるということになる。
わかるか? お前にも質問の意味が分かるように、そしてちゃんと回答ができるようにもう一度簡単に書いてやろう。
1.正しい
2.コンパイラがアフォ
3.意図とは別の意味になっている。
さあどれが正解だ。答え見ろ。
0595デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/30(土) 22:29:49.98ID:p5lz5e260
>584
はあー、未定義かもしれんて? 未定義ならエラーになるだろ。
0596デフォルトの名無しさん (ワッチョイ 469d-mzC7)
垢版 |
2018/06/30(土) 22:32:41.52ID:p5lz5e260
>>589
理由を書いてごらん。理由がないと回答にならんよ。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況