エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/
探検
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2017/11/04(土) 16:33:35.07ID:NYxCuvMY533デフォルトの名無しさん
2018/04/12(木) 12:23:14.02ID:aCAyQDuf534デフォルトの名無しさん
2018/04/12(木) 12:25:36.92ID:KhnSMF/h535デフォルトの名無しさん
2018/04/12(木) 14:29:59.20ID:ZdndFYj4 あいうえお
536デフォルトの名無しさん
2018/04/12(木) 14:43:04.91ID:Htzfym0f おこそとの
538デフォルトの名無しさん
2018/04/12(木) 21:59:02.17ID:nMaemNOx const double const a[];
は
const double a[];
と同じ意味
const const double const const a[];
なんて書いてもいいし
double const a[];
と書いてもいい
const typename と typename const と同じ
しかもconstはいくつ書いてもいい
は
const double a[];
と同じ意味
const const double const const a[];
なんて書いてもいいし
double const a[];
と書いてもいい
const typename と typename const と同じ
しかもconstはいくつ書いてもいい
539デフォルトの名無しさん
2018/04/13(金) 10:38:13.53ID:roGFrSR8 Win32のBOOL型を返す関数を複数回呼んで、
すべて成功したときのみTRUEを返したいのですが
(途中で失敗しても関数自体はすべて呼んでおく)、
BOOL Test()
{
BOOL bResult = TRUE;
bResult &= Api(...);
bResult &= Api(...);
bResult &= Api(...);
return bResult;
}
と書いてとりあえず動くのですが、よく考えたら&=はビット演算だし、
Win32のBOOL関数は成功時にTRUEを返すとは書いていないので、
例えば関数が成功時に2を返すパターンがあったら、
すべて成功しても戻り値はFALSEになるのではと思っています。
この場合、
bResult = Api(...) && bResult;
bResult = Api(...) && bResult;
bResult = Api(...) && bResult;
みたいな書き方をするしかないのでしょうか。
すべて成功したときのみTRUEを返したいのですが
(途中で失敗しても関数自体はすべて呼んでおく)、
BOOL Test()
{
BOOL bResult = TRUE;
bResult &= Api(...);
bResult &= Api(...);
bResult &= Api(...);
return bResult;
}
と書いてとりあえず動くのですが、よく考えたら&=はビット演算だし、
Win32のBOOL関数は成功時にTRUEを返すとは書いていないので、
例えば関数が成功時に2を返すパターンがあったら、
すべて成功しても戻り値はFALSEになるのではと思っています。
この場合、
bResult = Api(...) && bResult;
bResult = Api(...) && bResult;
bResult = Api(...) && bResult;
みたいな書き方をするしかないのでしょうか。
540デフォルトの名無しさん
2018/04/13(金) 10:57:04.94ID:UdLtdLwz result &= !!api(...);
という風に!!を使うのも zero, non zero を false/true に正規化するイディオムだけど、
何にしても見た目は汚いと思う
文字数は増えるがif文を使って
if (!api()) result=false;
の方が可読性高いかもしれない
という風に!!を使うのも zero, non zero を false/true に正規化するイディオムだけど、
何にしても見た目は汚いと思う
文字数は増えるがif文を使って
if (!api()) result=false;
の方が可読性高いかもしれない
541デフォルトの名無しさん
2018/04/13(金) 11:38:56.36ID:OgXHMhZG >>539
成功した回数をカウントして呼び出す関数が3つなら3でTRUEにするかな
BOOL Test()
{
int count = 0;
if(Api() != FALSE) count++;
if(Api() != FALSE) count++;
if(Api() != FALSE) count++;
if(count == 3) return TRUE;
}
成功した回数をカウントして呼び出す関数が3つなら3でTRUEにするかな
BOOL Test()
{
int count = 0;
if(Api() != FALSE) count++;
if(Api() != FALSE) count++;
if(Api() != FALSE) count++;
if(count == 3) return TRUE;
}
542デフォルトの名無しさん
2018/04/13(金) 12:44:10.91ID:mVcRE5FO 結果を std::vector にでもまとめておいて、 std::all_of で全てがFALSEでないことを確認するとか。
543デフォルトの名無しさん
2018/04/13(金) 12:50:27.67ID:UkpF6ptq544デフォルトの名無しさん
2018/04/13(金) 14:35:54.06ID:OgXHMhZG >>543
1年後の自分がやらかしそうだわw
1年後の自分がやらかしそうだわw
545デフォルトの名無しさん
2018/04/13(金) 14:37:30.50ID:eQfDSJES 普通に&で繋げてしまえば。
return Api()&Api()&Api()...;
return Api()&Api()&Api()...;
546デフォルトの名無しさん
2018/04/13(金) 14:44:49.05ID:lxf6ix6+ >>545
そもそもの質問のキモがわかってないよ
そもそもの質問のキモがわかってないよ
547539
2018/04/13(金) 15:24:49.14ID:roGFrSR8 みなさんご意見ありがとうございます。
例を簡略化しすぎてしまいましたが、処理は状況によって分かれるため、
常に同じ関数が3回というわけではありませんでした。
失礼しました。
bResult = Api(...) && bResult;
の書き方自体は、そこまで汚いわけではないのですね。
同じような書き方をしているソースも、検索してみたら出てきました。
個人的には、
bResult &&= Api(...);
のような記述ができるとありがたかったです。
例を簡略化しすぎてしまいましたが、処理は状況によって分かれるため、
常に同じ関数が3回というわけではありませんでした。
失礼しました。
bResult = Api(...) && bResult;
の書き方自体は、そこまで汚いわけではないのですね。
同じような書き方をしているソースも、検索してみたら出てきました。
個人的には、
bResult &&= Api(...);
のような記述ができるとありがたかったです。
548はちみつ餃子 ◆8X2XSCHEME
2018/04/13(金) 16:20:54.65ID:RMqAMM1S549デフォルトの名無しさん
2018/04/13(金) 16:33:04.14ID:cn4ajNkQ &&= と書けないことをこの質問で知ったわ。
>>548
「返り値が0でなければ成功」の関数で変テコな返り値が来ると
組み合わせでダメになるかも。
256 * 256 == 65536 で オーヴァーフローして0、みたいな感じ。
>>548
「返り値が0でなければ成功」の関数で変テコな返り値が来ると
組み合わせでダメになるかも。
256 * 256 == 65536 で オーヴァーフローして0、みたいな感じ。
550デフォルトの名無しさん
2018/04/13(金) 16:33:39.54ID:aZorcSvM 明確なメリットが無いのに、
無駄にトリッキーなコードを書くのはおすすめしない
無駄にトリッキーなコードを書くのはおすすめしない
551デフォルトの名無しさん
2018/04/13(金) 16:39:34.39ID:aZorcSvM 数が少なく重要な箇所であれば、
デバッグ用コードを追加しやすい以下で良い
if (!Api(...)){
bResult = FALSE;
}
...
数が少なく重要じゃなければ >>547 で良い
数が多ければ色々と工夫しようか
デバッグ用コードを追加しやすい以下で良い
if (!Api(...)){
bResult = FALSE;
}
...
数が少なく重要じゃなければ >>547 で良い
数が多ければ色々と工夫しようか
553デフォルトの名無しさん
2018/04/13(金) 17:53:26.34ID:ledbPVdv 基底クラスのメンバ関数に virtual をつけないことってあるんですか?
つけてもつけなくてもどちらでもいいという場合はあると思いますが、
つけちゃいけないという場合が考えにくいのですが、そういう場合は
あるのでしょうか?
つけてもつけなくてもどちらでもいいという場合はあると思いますが、
つけちゃいけないという場合が考えにくいのですが、そういう場合は
あるのでしょうか?
554デフォルトの名無しさん
2018/04/13(金) 17:55:06.07ID:ledbPVdv 逆に言うと、今のC++でvirtualをつけた場合の機能をvirtualをつけなかった場合の
デフォルトの機能にすればいいのにと思います。
どうでしょうか?
デフォルトの機能にすればいいのにと思います。
どうでしょうか?
555片山博文MZ ◆T6xkBnTXz7B0
2018/04/13(金) 17:56:07.81ID:meZ//aXI >>553
仮想メソッドは、最適化がなければ関数ポインタのように確保されるので、不必要なものはメモリーの無駄になる。
仮想メソッドは、最適化がなければ関数ポインタのように確保されるので、不必要なものはメモリーの無駄になる。
556デフォルトの名無しさん
2018/04/13(金) 17:58:31.25ID:ledbPVdv557デフォルトの名無しさん
2018/04/13(金) 19:32:26.21ID:UkpF6ptq >>552
オーバーフローで0とか
オーバーフローで0とか
558はちみつ餃子 ◆8X2XSCHEME
2018/04/13(金) 21:02:41.55ID:RMqAMM1S559デフォルトの名無しさん
2018/04/13(金) 21:13:39.42ID:ko86uHhA 浮動小数点ならダーティー0とかあるけど
普通は意識しないでしょうねぇ
普通は意識しないでしょうねぇ
560デフォルトの名無しさん
2018/04/14(土) 00:48:59.29ID:qJeIaUAA 今回は「非ゼロ」が様々な数値である場合について考えているわけだから
0x80000 等掛けたらゼロになるケースを意識しないのはむしろ不自然
0x80000 等掛けたらゼロになるケースを意識しないのはむしろ不自然
561デフォルトの名無しさん
2018/04/14(土) 01:08:45.20 int64_t 使えばいいだろwww
ケチケチすんなってwwwww
ケチケチすんなってwwwww
562デフォルトの名無しさん
2018/04/14(土) 03:21:52.45ID:yJ5VtHzf 4つ掛けたらアウトじゃん
ほんとうにバカだなあ
ほんとうにバカだなあ
563デフォルトの名無しさん
2018/04/14(土) 05:40:34.13ID:DUdlBUp3 >>547
汚い書き方とまでは言わないけど、個人的にはあまりいいやり方だとも思わないかな。
俺もC, C++を覚えた当初はなるべく冗長な記述を省くことが正義であると考えていたけど、
そのうち高々数文字削ることなんかより、素直に可読性や保守性が高い記述をする方が美しいと感じるようになったよ。
汚い書き方とまでは言わないけど、個人的にはあまりいいやり方だとも思わないかな。
俺もC, C++を覚えた当初はなるべく冗長な記述を省くことが正義であると考えていたけど、
そのうち高々数文字削ることなんかより、素直に可読性や保守性が高い記述をする方が美しいと感じるようになったよ。
564デフォルトの名無しさん
2018/04/14(土) 07:52:50.53ID:Fxbc5uis !か!!使えば1か0にしかならんからそれかけるとか
565デフォルトの名無しさん
2018/04/14(土) 08:44:41.44ID:whWbsAFN それをシフトと組み合わせると、エラー箇所までわかって便利だね
566デフォルトの名無しさん
2018/04/14(土) 10:42:40.78ID:pziCCgl7 >>556
補足すると、仮想関数は呼び出しのコストも同じ理由で非仮想のメンバ関数より高い(わずかだけど
あと、仮想関数が一つでもあるクラスは、そのクラスのオブジェクトの先頭に仮想関数テーブルへのポインタが入る
つまり純粋にメンバ変数のデータ通りのメモリイメージになるクラスが作れなくなる
virtualかどうかを選ぶ余地があるってことは選ぶ必要があるということだよ
補足すると、仮想関数は呼び出しのコストも同じ理由で非仮想のメンバ関数より高い(わずかだけど
あと、仮想関数が一つでもあるクラスは、そのクラスのオブジェクトの先頭に仮想関数テーブルへのポインタが入る
つまり純粋にメンバ変数のデータ通りのメモリイメージになるクラスが作れなくなる
virtualかどうかを選ぶ余地があるってことは選ぶ必要があるということだよ
567デフォルトの名無しさん
2018/04/14(土) 11:38:28.43ID:aYmqXLA5568デフォルトの名無しさん
2018/04/14(土) 11:59:10.38ID:gkV4B+Je メモリをけちるとかそんなけちな理由じゃない
569デフォルトの名無しさん
2018/04/14(土) 12:05:20.64ID:whWbsAFN selectって知っている?
570デフォルトの名無しさん
2018/04/14(土) 12:31:15.66ID:aYmqXLA5 select?
その時代の知識で止まってるの?
その時代の知識で止まってるの?
571デフォルトの名無しさん
2018/04/14(土) 17:00:09.46ID:6q9VmxFv a=1に対して、
cout << a << a++なら21
cout << a++ << aなら12
cout << a++ << a++なら21
と表示されました。
coutはどんな順番で評価されているのでしょうか?
cout << a << a++なら21
cout << a++ << aなら12
cout << a++ << a++なら21
と表示されました。
coutはどんな順番で評価されているのでしょうか?
572デフォルトの名無しさん
2018/04/14(土) 18:21:04.74 >>571
確かに以下は
https://ideone.com/sBACG3
21
12
21
と表示される
でも、手元のVC 2017 / Windows 10 では
11
12
11
と表示された
g++ x86_64-posix-seh 7.1.0 / Ubuntu 16.04.3 LTS on Windows 10 では
11
12
12
と表示された
確かに以下は
https://ideone.com/sBACG3
21
12
21
と表示される
でも、手元のVC 2017 / Windows 10 では
11
12
11
と表示された
g++ x86_64-posix-seh 7.1.0 / Ubuntu 16.04.3 LTS on Windows 10 では
11
12
12
と表示された
573デフォルトの名無しさん
2018/04/14(土) 18:31:12.32 >>572
http://codepad.org/KVv4KD8O
ではコンパイルエラーになった。
cc1plus: warnings being treated as errors
In function 'void test1()':
Line 6: warning: operation on 'a' may be undefined
In function 'void test2()':
Line 12: warning: operation on 'a' may be undefined
In function 'void test3()':
Line 18: warning: operation on 'a' may be undefined
http://techtipshoge.blogspot.jp/2012/01/c.html
http://www.kouno.jp/home/c_faq/c3.html
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
こんな書き方をするなってことだね
http://codepad.org/KVv4KD8O
ではコンパイルエラーになった。
cc1plus: warnings being treated as errors
In function 'void test1()':
Line 6: warning: operation on 'a' may be undefined
In function 'void test2()':
Line 12: warning: operation on 'a' may be undefined
In function 'void test3()':
Line 18: warning: operation on 'a' may be undefined
http://techtipshoge.blogspot.jp/2012/01/c.html
http://www.kouno.jp/home/c_faq/c3.html
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
こんな書き方をするなってことだね
574デフォルトの名無しさん
2018/04/15(日) 00:38:00.30ID:/OvgYAab575デフォルトの名無しさん
2018/04/15(日) 08:36:03.86ID:IUBKEb9a 未定義動作になるから、今回のコンパイル時と次回のコンパイル時とで
同じ順序で評価されない可能性もある、じゃないかな。
実際のところ、コンパイルごとに評価順が変化するとも思えないけど。
いずれにせよ「未定義動作は避けろ」が間違いない方針だわね。
同じ順序で評価されない可能性もある、じゃないかな。
実際のところ、コンパイルごとに評価順が変化するとも思えないけど。
いずれにせよ「未定義動作は避けろ」が間違いない方針だわね。
576デフォルトの名無しさん
2018/04/15(日) 09:17:15.75ID:CIuag2/D >>573
おお、「未定義動作となること」を検出してコンパイルエラーにする環境もあるんだな
おお、「未定義動作となること」を検出してコンパイルエラーにする環境もあるんだな
577デフォルトの名無しさん
2018/04/15(日) 10:08:58.88ID:c4dXLki+ class Base {
public:
void A();
protected
virtual void B();
}
void Base::A() {
B();
}
void Base::B() {
cout << "Base" << endl;
}
class Derived : public Base {
protected
virtual void B();
}
void Derived::B() {
cout << "Derived" << endl;
}
Base b;
b.A(); ⇒ 「Base」が表示される。
Derived d;
d.A(); ⇒ 「Derived」が表示される。
b = d;
b.A() ⇒ 「Base」が表示される。
public:
void A();
protected
virtual void B();
}
void Base::A() {
B();
}
void Base::B() {
cout << "Base" << endl;
}
class Derived : public Base {
protected
virtual void B();
}
void Derived::B() {
cout << "Derived" << endl;
}
Base b;
b.A(); ⇒ 「Base」が表示される。
Derived d;
d.A(); ⇒ 「Derived」が表示される。
b = d;
b.A() ⇒ 「Base」が表示される。
578デフォルトの名無しさん
2018/04/15(日) 10:11:08.98ID:c4dXLki+ b = d;
b.A() ⇒ 「Base」が表示される。
↑で、なぜ、「Derived」が表示されないのでしょうか?
ロベールの本に、
「仮想関数はどんな状況でもそのオブジェクトの本来の型のものが呼ばれる」
と書いてあります。
b.A() ⇒ 「Base」が表示される。
↑で、なぜ、「Derived」が表示されないのでしょうか?
ロベールの本に、
「仮想関数はどんな状況でもそのオブジェクトの本来の型のものが呼ばれる」
と書いてあります。
579デフォルトの名無しさん
2018/04/15(日) 10:29:12.58ID:VXOW+WoG void Base::A() {
B();
}
void Base::B() {
cout << "Base" << endl;
}
A() の中で、B() を呼んでいるから
A(), B() は異なる関数なのに、呼ぶなんてあり得ないだろ。
こんなコーディングはしない
B();
}
void Base::B() {
cout << "Base" << endl;
}
A() の中で、B() を呼んでいるから
A(), B() は異なる関数なのに、呼ぶなんてあり得ないだろ。
こんなコーディングはしない
580デフォルトの名無しさん
2018/04/15(日) 10:37:36.78ID:sXJBpbWg バカを装った荒らしか本当のバカか
581デフォルトの名無しさん
2018/04/15(日) 10:41:29.91ID:c4dXLki+582デフォルトの名無しさん
2018/04/15(日) 10:59:34.87ID:c4dXLki+ Base::B() の virtual を削除する:
class Base {
public:
void A();
protected
void B();
};
すると、
Base b;
b.A(); ⇒ 「Base」が表示される。
Derived d;
d.A(); ⇒ 「Base」が表示される。
class Base {
public:
void A();
protected
void B();
};
すると、
Base b;
b.A(); ⇒ 「Base」が表示される。
Derived d;
d.A(); ⇒ 「Base」が表示される。
583デフォルトの名無しさん
2018/04/15(日) 11:27:00.75ID:ZEcSoj1Y ポインタじゃなくて実体をBase bに代入(コピー)したらDerivedじゃなくなるのは当然。「スライシング」でググれ。
584デフォルトの名無しさん
2018/04/15(日) 11:33:52.43ID:q/GS/gh9 スライシングとも別の問題のような
585デフォルトの名無しさん
2018/04/15(日) 11:52:13.52ID:igXjAIRS bの型がBaseだからだろ?
586デフォルトの名無しさん
2018/04/15(日) 12:16:46.54ID:VXOW+WoG まずこの本で、オブジェクト指向を学ぶ。
スッキリわかる Java入門 第2版、2014
最難関のC++ で、オブジェクト指向を学ぶなんて、夢のまた夢w
軽く、数年を無駄にするだけ
C++ なんて、偏差値70以上しか無理やのに
スッキリわかる Java入門 第2版、2014
最難関のC++ で、オブジェクト指向を学ぶなんて、夢のまた夢w
軽く、数年を無駄にするだけ
C++ なんて、偏差値70以上しか無理やのに
587デフォルトの名無しさん
2018/04/15(日) 12:34:26.84588デフォルトの名無しさん
2018/04/15(日) 12:35:11.72589デフォルトの名無しさん
2018/04/15(日) 12:36:47.16ID:c4dXLki+590デフォルトの名無しさん
2018/04/15(日) 12:37:23.54ID:c4dXLki+591デフォルトの名無しさん
2018/04/15(日) 12:43:40.81ID:c4dXLki+ 理由があってC++を習得するのが難しいのならOKですが、設計が悪いから
難しいということになると、利用者にとっては迷惑な話ですね。
難しいということになると、利用者にとっては迷惑な話ですね。
592デフォルトの名無しさん
2018/04/15(日) 13:30:31.42ID:VXOW+WoG C++ は、何でも出来るようにしているから、ルール数が100以上ある
さらに、ルールAでは、B, C は除くとか、
1つのルールが、他のルールとからむから、
非常に難しいし、組み合わせ爆発が起こる
膨大な時間を無駄にしても、さほど理解できず、身につかない。
組み込み機器も想定しているから、
どうしてこういうルールが必要なのか、初心者には理解できない。
Rust ですら、初心者には無理だろ
だから、ドワンゴ江添の本を持って、数年山ごもりしろって言われる。
ルールの多さで、廃人になってしまう
初心者には、絶対に無理。
最初から、エベレストを登るようなもの。
まず「スッキリわかる Java入門」とかの、低い山で修行を積むべし
このレベルでは言語どうこうじゃない。
小中高大学まで行くような、研修制度・道筋が大事。
徐々に基礎体力を付けていかないと、何もできない
さらに、ルールAでは、B, C は除くとか、
1つのルールが、他のルールとからむから、
非常に難しいし、組み合わせ爆発が起こる
膨大な時間を無駄にしても、さほど理解できず、身につかない。
組み込み機器も想定しているから、
どうしてこういうルールが必要なのか、初心者には理解できない。
Rust ですら、初心者には無理だろ
だから、ドワンゴ江添の本を持って、数年山ごもりしろって言われる。
ルールの多さで、廃人になってしまう
初心者には、絶対に無理。
最初から、エベレストを登るようなもの。
まず「スッキリわかる Java入門」とかの、低い山で修行を積むべし
このレベルでは言語どうこうじゃない。
小中高大学まで行くような、研修制度・道筋が大事。
徐々に基礎体力を付けていかないと、何もできない
593592
2018/04/15(日) 13:45:38.29ID:VXOW+WoG ロベールでC++ を勉強するのも良いけど、
あくまで、C++ の初心者というだけで、
C++ をやるには、最低でも数言語は知っている必要がある
特に、Java, C, Rust は、絶対に知っていないといけない。
組み込みの知識も必要
C++ の初心者だけど、他の言語はプロ級で、
PC・組み込み・Linux コマンドも知っていて、C++ を始められる
それでも、ほとんどのC プログラマーは、C++ へ進めない
あくまで、C++ の初心者というだけで、
C++ をやるには、最低でも数言語は知っている必要がある
特に、Java, C, Rust は、絶対に知っていないといけない。
組み込みの知識も必要
C++ の初心者だけど、他の言語はプロ級で、
PC・組み込み・Linux コマンドも知っていて、C++ を始められる
それでも、ほとんどのC プログラマーは、C++ へ進めない
594デフォルトの名無しさん
2018/04/15(日) 13:49:36.88ID:ldkcKhuZ スッキリ厨はちゃんとコテ付けてくれ
595デフォルトの名無しさん
2018/04/15(日) 15:24:18.71ID:qZPDSYA2 某洋氏翻訳の第4版がロベール本より先に出てくる理由について3行で述べよ。
第3版が難読版というのは判る
第3版が難読版というのは判る
596デフォルトの名無しさん
2018/04/15(日) 15:55:19.09ID:/OvgYAab = が代入じゃなく単に Base クラスのオブジェクトのoperator = を呼んでるだけ、
という理解が必要なんだろうけれどこれ難しいだろうか?
cから来た人なら
struct base b;
b = ...;
で b の型が変わるなんて考えもしないだろうけど
最近の人は c やらないのかな
という理解が必要なんだろうけれどこれ難しいだろうか?
cから来た人なら
struct base b;
b = ...;
で b の型が変わるなんて考えもしないだろうけど
最近の人は c やらないのかな
597デフォルトの名無しさん
2018/04/15(日) 16:39:48.86ID:VXOW+WoG ロベールの方が、独習・柴田望洋・林 晴比古などよりも、簡単
598デフォルトの名無しさん
2018/04/15(日) 17:20:50.44ID:s7NpyR5v 原典も読まずに能書き垂れる奴っているんだなぁ
599デフォルトの名無しさん
2018/04/15(日) 18:07:17.49ID:c4dXLki+ >>588
試してみました。
確かにポインタを使うと期待通りの結果でしたが、参照を使うと期待通りにはいきませんでした。
これはなぜでしょうか?
#include "Derived.h"
int main() {
Base b;
Base& br = b;
br.A();
Derived d;
br = d;
br.A();
Base *bp;
bp = &b;
bp->A();
bp = &d;
bp->A();
}
実行結果は以下です。
Base
Base
Base
Derived
試してみました。
確かにポインタを使うと期待通りの結果でしたが、参照を使うと期待通りにはいきませんでした。
これはなぜでしょうか?
#include "Derived.h"
int main() {
Base b;
Base& br = b;
br.A();
Derived d;
br = d;
br.A();
Base *bp;
bp = &b;
bp->A();
bp = &d;
bp->A();
}
実行結果は以下です。
Base
Base
Base
Derived
600デフォルトの名無しさん
2018/04/15(日) 18:44:29.81ID:ZEcSoj1Y 参照は書き換えられないからな。
>br = d;
参照先のbに代入してるのと同じこと。
>br = d;
参照先のbに代入してるのと同じこと。
601デフォルトの名無しさん
2018/04/15(日) 18:50:44.48ID:CIuag2/D >>599
当たり前
br は b の別名なだけだから
b = d;
ってやってるのと同じ
b は Base の領域しかないんだから b.A() で Delived::A() を呼び出した時に Delived にしかないメンバ変数とか参照してたら困るし
当たり前
br は b の別名なだけだから
b = d;
ってやってるのと同じ
b は Base の領域しかないんだから b.A() で Delived::A() を呼び出した時に Delived にしかないメンバ変数とか参照してたら困るし
602デフォルトの名無しさん
2018/04/16(月) 00:20:31.20ID:TXxoP4/a 参照のポインタっぽい振る舞いを確認したいならこう
Derived d;
Base & b1(d);
b1.A();
Derived d;
Base & b1(d);
b1.A();
603デフォルトの名無しさん
2018/04/16(月) 07:57:32.89ID:PsSdBUuj >>602
ありがとうございました。
下の結果は、
Base
Derived
Derived
になりました。1番目と2番目の違いがよく分かりません。この違いが分かれば、疑問が
解消することになると思うので、理解したいです。
#include "Derived.h"
int main() {
Derived d;
Base b;
Base& br1 = b;
br1 = d;
br1.A();
Base& br2(d);
br2.A();
Base *bp;
bp = &d;
bp->A();
}
ありがとうございました。
下の結果は、
Base
Derived
Derived
になりました。1番目と2番目の違いがよく分かりません。この違いが分かれば、疑問が
解消することになると思うので、理解したいです。
#include "Derived.h"
int main() {
Derived d;
Base b;
Base& br1 = b;
br1 = d;
br1.A();
Base& br2(d);
br2.A();
Base *bp;
bp = &d;
bp->A();
}
604デフォルトの名無しさん
2018/04/16(月) 08:01:12.80ID:PsSdBUuj Base
Derived
Derived
となりました。
2番目と3番目は同じことの別表現のようですね。
見た感じ、1番目と2番目に違いがあるようには思えません。
Derived d;
Base b;
Base& br1 = b;
br1 = d;
br1.A();
Base& br2 = d;
br2.A();
Base& br3(d);
br3.A();
Derived
Derived
となりました。
2番目と3番目は同じことの別表現のようですね。
見た感じ、1番目と2番目に違いがあるようには思えません。
Derived d;
Base b;
Base& br1 = b;
br1 = d;
br1.A();
Base& br2 = d;
br2.A();
Base& br3(d);
br3.A();
605デフォルトの名無しさん
2018/04/16(月) 08:14:10.02ID:TXxoP4/a >>604
参照は初期化時に参照先が設定され、以降の操作は参照先に対してなされる。
初期化と代入を区別すること。
Base& br1 = b; // 初期化 br1 は b の参照
br1 = d; // 代入 b = d と同じ動作
Base& br2 = d; // 初期化 br2 は d の参照
参照は初期化時に参照先が設定され、以降の操作は参照先に対してなされる。
初期化と代入を区別すること。
Base& br1 = b; // 初期化 br1 は b の参照
br1 = d; // 代入 b = d と同じ動作
Base& br2 = d; // 初期化 br2 は d の参照
606デフォルトの名無しさん
2018/04/16(月) 08:32:20.53ID:PsSdBUuj >>605
ありがとうございました。
>Base& br1 = b; // 初期化 br1 は b の参照
>br1 = d; // 代入 b = d と同じ動作
br1 = d としても参照先は変わらないんですね。
ありがとうございました。
ありがとうございました。
>Base& br1 = b; // 初期化 br1 は b の参照
>br1 = d; // 代入 b = d と同じ動作
br1 = d としても参照先は変わらないんですね。
ありがとうございました。
607デフォルトの名無しさん
2018/04/16(月) 12:10:28.34ID:rDfY3L1y Java,C#などのプログラマです。
C++にC#などのインターフェースはない代わりに多重継承?できるのでそれを使うとのことで、
https://ideone.com/k7g2nn
ITestAとITestBはインターフェース的なものです。
で、ITestAを実装したCBaseAを作り、CBaseAを継承しITestBを実装したCTestBを
作ったのですが、
CBaseBをnewなど実体化するとITestA::methodAがオーバーライドされておらずCBaseBは
抽象クラスになってて実体化できません。
ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
というかこういう場合C++ではどうすればいいのでしょうか?
C++にC#などのインターフェースはない代わりに多重継承?できるのでそれを使うとのことで、
https://ideone.com/k7g2nn
ITestAとITestBはインターフェース的なものです。
で、ITestAを実装したCBaseAを作り、CBaseAを継承しITestBを実装したCTestBを
作ったのですが、
CBaseBをnewなど実体化するとITestA::methodAがオーバーライドされておらずCBaseBは
抽象クラスになってて実体化できません。
ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
というかこういう場合C++ではどうすればいいのでしょうか?
608デフォルトの名無しさん
2018/04/16(月) 12:43:19.10ID:qlfABgAK Base Pointer : 100〜119
Derived Pointer : 120〜139
こういう状況で、Base クラスを指す際、クラスポインターは100 を指している。
100〜119 内で、Base クラスの変数・メソッドのアドレスを探す
Derived クラスを指す際、クラスポインターは自動的に、120 に変わる。
120〜139 内で、Derived クラスの変数・メソッドのアドレスを探す
Derived Pointer : 120〜139
こういう状況で、Base クラスを指す際、クラスポインターは100 を指している。
100〜119 内で、Base クラスの変数・メソッドのアドレスを探す
Derived クラスを指す際、クラスポインターは自動的に、120 に変わる。
120〜139 内で、Derived クラスの変数・メソッドのアドレスを探す
609デフォルトの名無しさん
2018/04/16(月) 13:08:20.92ID:5MYyAHFg >>607
単なる文法エラーだからエラーメッセージみてコードを直してください
単なる文法エラーだからエラーメッセージみてコードを直してください
610デフォルトの名無しさん
2018/04/16(月) 14:01:04.61ID:rDfY3L1y >>609
文法エラー??
https://ideone.com/k7g2nnの今回の部分と関係ないエラーは無視してください。
あくまでイメージ目的でそこらへん適当にやりました。
すみません。
https://ideone.com/QxErKY
こっちですね。
文法エラー??
https://ideone.com/k7g2nnの今回の部分と関係ないエラーは無視してください。
あくまでイメージ目的でそこらへん適当にやりました。
すみません。
https://ideone.com/QxErKY
こっちですね。
611デフォルトの名無しさん
2018/04/16(月) 14:08:31.72ID:rDfY3L1y ちなみに、C#だとこんな感じです。
https://ideone.com/8SZhJ7
https://ideone.com/8SZhJ7
612デフォルトの名無しさん
2018/04/16(月) 14:29:48.23ID:7XdbFr6Z CBaseAのmethodAをCBaseBを実体化して呼びたいんだよな?
ならCBaseAとITestBどっちのmethodA呼ぶのかあいまいって怒られる
これならok
https://ideone.com/FGHyda
ならCBaseAとITestBどっちのmethodA呼ぶのかあいまいって怒られる
これならok
https://ideone.com/FGHyda
613デフォルトの名無しさん
2018/04/16(月) 14:32:34.81ID:rDfY3L1y もちろん、エラーなくしてコンパイルを通す方法は
>>607の
>ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
で書いたようにすればとりあえず、コンパイルは通ります。
聞きたいのは、
C#の場合はBaseAの方で一度MethodAを宣言・定義すればいいのですが、
C++の場合は毎回CBaseAの派生クラスでmethodAを宣言して定義しなおさなければいけないのでしょうか??
それともC++では他の方法があるのでしょうか?
>>607の
>ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
で書いたようにすればとりあえず、コンパイルは通ります。
聞きたいのは、
C#の場合はBaseAの方で一度MethodAを宣言・定義すればいいのですが、
C++の場合は毎回CBaseAの派生クラスでmethodAを宣言して定義しなおさなければいけないのでしょうか??
それともC++では他の方法があるのでしょうか?
614デフォルトの名無しさん
2018/04/16(月) 14:34:54.92ID:rDfY3L1y615デフォルトの名無しさん
2018/04/16(月) 15:08:36.13ID:rDfY3L1y616デフォルトの名無しさん
2018/04/16(月) 15:30:44.68ID:7XdbFr6Z617デフォルトの名無しさん
2018/04/16(月) 16:21:16.33ID:Gm7LZDiq618デフォルトの名無しさん
2018/04/16(月) 17:30:50.30ID:rDfY3L1y619デフォルトの名無しさん
2018/04/17(火) 17:08:59.76ID:SGgdop5e 巨大なファァイルの読み込みに関してです。
たとえば1000行のテキストからなるファイルの1000行目だけを読み込んで、配列に
代入したいのですが、ファイルをopenしていきなり1000行目にアクセスする方法はありますでしょうか?
現在、forループで1000回廻して1行ずつ増やしてアクセスし1000回目にfgetsで読み込んで配列に入れているのですが、999回のループが無駄なので高速化したいのですが、どなたかご教授いただけないでしょうか?
たとえば1000行のテキストからなるファイルの1000行目だけを読み込んで、配列に
代入したいのですが、ファイルをopenしていきなり1000行目にアクセスする方法はありますでしょうか?
現在、forループで1000回廻して1行ずつ増やしてアクセスし1000回目にfgetsで読み込んで配列に入れているのですが、999回のループが無駄なので高速化したいのですが、どなたかご教授いただけないでしょうか?
620デフォルトの名無しさん
2018/04/17(火) 17:20:32.18ID:/qMRupTB 行という概念が
先頭から読んでいって逐次確認しないと行の区切りが確定しないのでどうしようもないんじゃない?
ファイルサイズ分一気にオンメモリで読んで後から行の切り出しするとかの工夫はあるだろうけど
先頭から読んでいって逐次確認しないと行の区切りが確定しないのでどうしようもないんじゃない?
ファイルサイズ分一気にオンメモリで読んで後から行の切り出しするとかの工夫はあるだろうけど
621デフォルトの名無しさん
2018/04/17(火) 17:29:32.71ID:KTfx2aCu >>619
テキストのフォーマットによっては高速化は可能
例えば1行が固定サイズとか行番号が書いてあるとか
全く自由なフォーマットだと頭から解析するしかない
読み込みスレッドと解析スレッドを分けると速くなることもあるかも
同じファイルが複数回指定されることが多ければ
ファイル名と更新日時と1000行目の位置
のデータベースを持つとか
テキストのフォーマットによっては高速化は可能
例えば1行が固定サイズとか行番号が書いてあるとか
全く自由なフォーマットだと頭から解析するしかない
読み込みスレッドと解析スレッドを分けると速くなることもあるかも
同じファイルが複数回指定されることが多ければ
ファイル名と更新日時と1000行目の位置
のデータベースを持つとか
622デフォルトの名無しさん
2018/04/17(火) 17:30:11.39ID:cVYjBdTw >>619
「1000行目」の定義が先頭から数えて999番目の改行の次、である以上ありません。
1行のバイト数を全て同一にすることができれば(この場合しばしば行ではなくレコードと呼ばれる)
1000番目のバイト位置を計算してそこから読むことができます。
FILE * を用いてシーケンシャルにたくさん読む場合は
setvbuf でバッファサイズを拡大しておくと高速になることも多いので試す価値はあるでしょう
いろんな行に何度もアクセスするなら、
全てメモリに読み込んだ上で各行の先頭位置を配列に記録しておくと良いでしょう。
「1000行目」の定義が先頭から数えて999番目の改行の次、である以上ありません。
1行のバイト数を全て同一にすることができれば(この場合しばしば行ではなくレコードと呼ばれる)
1000番目のバイト位置を計算してそこから読むことができます。
FILE * を用いてシーケンシャルにたくさん読む場合は
setvbuf でバッファサイズを拡大しておくと高速になることも多いので試す価値はあるでしょう
いろんな行に何度もアクセスするなら、
全てメモリに読み込んだ上で各行の先頭位置を配列に記録しておくと良いでしょう。
623デフォルトの名無しさん
2018/04/17(火) 17:36:06.95ID:p5xwhAV/ 末尾にseekして、適当に戻って読んでみて、
改行がなければまた戻って、を繰り返すのが現実的。
改行がなければまた戻って、を繰り返すのが現実的。
624デフォルトの名無しさん
2018/04/17(火) 17:40:13.25ID:/qMRupTB 巨大なファイルの中途の行じゃなく、ファイルの最終行だけを抜き出したい のか?
625デフォルトの名無しさん
2018/04/17(火) 17:50:32.61ID:yyY2OAEq626619
2018/04/17(火) 18:03:45.64ID:SGgdop5e 皆様いろいろご指導ありがとうございました。
私の能力では難しそうですが、いろいろ高速化を試してみます。
私の能力では難しそうですが、いろいろ高速化を試してみます。
627デフォルトの名無しさん
2018/04/17(火) 18:46:11.69ID:NCQX7EWc 末尾にseek して1文字抜出し(末尾が\n の場合はそれを無視して)
\n が現れるまで1文字ずつ戻りながらキューに積んで
最後にキューの中身を逆順にする
\n が現れるまで1文字ずつ戻りながらキューに積んで
最後にキューの中身を逆順にする
628デフォルトの名無しさん
2018/04/17(火) 18:55:56.84ID:gaNnpc4H 配列の要素数が分からないときscanfで読み込んだ値を要素数にするにはどのようにしたらよいですか?
629デフォルトの名無しさん
2018/04/17(火) 19:35:04.61ID:wvS91pUR630デフォルトの名無しさん
2018/04/17(火) 20:21:29.36ID:AHw7lgSX 基本的な事なんだろうけど、vectorを範囲ベースのforループしたいのですができません。
auto v = vector<int>()だとfor (auto &i : v)でいけるのですが、
newした場合はどうすればいいのでしょうか?
autov = new vector<int>(); for (auto &i : v)だと
begin関数が見つかりませんといってコンパイルできません。
どうすればいいでしょうか?
auto v = vector<int>()だとfor (auto &i : v)でいけるのですが、
newした場合はどうすればいいのでしょうか?
autov = new vector<int>(); for (auto &i : v)だと
begin関数が見つかりませんといってコンパイルできません。
どうすればいいでしょうか?
631デフォルトの名無しさん
2018/04/17(火) 20:24:11.47ID:AHw7lgSX すみませんでした。普通に逆参照すればいいのか。
auto v = new vector<int>(); for (auto &i : *v)
auto v = new vector<int>(); for (auto &i : *v)
632デフォルトの名無しさん
2018/04/17(火) 20:46:42.62ID:hZ2W0cz8 >>629
ありがとうございました
ありがとうございました
633デフォルトの名無しさん
2018/04/18(水) 11:35:26.22ID:uQo81sbZ MFCのアプリで排他制御のルーチンを作っていて疑問に思ったことなのですが、
CやC++の仕組みのことなので、こちらで質問させていただきます。
複数のスレッドから呼ばれる関数の内部は、
CCriticalSectionを使って排他制御しています。
void Test()
{
static CCriticalSection cs;
cs.Lock();
:
cs.Unlock();
}
関数内のstatic変数は、その関数が初めて呼ばれたときに
実体が作成されると理解しているのですが、
1回目のTest()でCCriticalSectionのコンストラクタを実行している最中に
他のスレッドがTest()を呼んだ場合、このコンストラクタ自体は、
正しく排他制御されるのでしょうか?
コンストラクタが終わるまで、他のスレッドは待ってくれるのでしょうか?
それとも、CCriticalSectionの変数は、
関数の外に置かなくてはいけないものでしょうか?
MFCの内部でも、AFXPlaySystemSound()などで
同じようなことをやっているようなのですが。
CやC++の仕組みのことなので、こちらで質問させていただきます。
複数のスレッドから呼ばれる関数の内部は、
CCriticalSectionを使って排他制御しています。
void Test()
{
static CCriticalSection cs;
cs.Lock();
:
cs.Unlock();
}
関数内のstatic変数は、その関数が初めて呼ばれたときに
実体が作成されると理解しているのですが、
1回目のTest()でCCriticalSectionのコンストラクタを実行している最中に
他のスレッドがTest()を呼んだ場合、このコンストラクタ自体は、
正しく排他制御されるのでしょうか?
コンストラクタが終わるまで、他のスレッドは待ってくれるのでしょうか?
それとも、CCriticalSectionの変数は、
関数の外に置かなくてはいけないものでしょうか?
MFCの内部でも、AFXPlaySystemSound()などで
同じようなことをやっているようなのですが。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- アメリカ、入国時に「日本人を含む外国人観光客の最大5年分のSNS履歴の提出」義務化 過去10年間に使用のメールアドレスや電話番号等も [Hitzeschleier★]
- 【おこめ】「有能だったんじゃ」おこめ券で批判殺到の鈴木農水大臣…ネットでは前任の“進次郎再評価” [ぐれ★]
- 【中国外務省】日本への渡航自粛を再度呼びかけ 今度は「地震発生」を理由に [ぐれ★]
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★3 [Hitzeschleier★]
- 【芸能】デパートで見つけたランドセルが衝撃価格! つまみ枝豆「どこかで規制しないと」に共感の声殺到 「全て同感」「高すぎます」★2 [冬月記者★]
- 【速報】年収の壁の自民案判明、26年は168万円 [蚤の市★]
- 日本人、タイとカンボジアの戦争に興味がなさすぎる。高市もなんか言えよ [811796219]
- 日本人、世界で最もブランドに興味なし🇯🇵 [462275543]
- 【悲報】たぬかなが渡邊渚を壮絶バッシング 「グラビア出したあたりから臭いな~と思ってたが激臭になってたわ。中居は悪くない」 [455031798]
- 【悲報】鈴木農水大臣、国民から「こいつひょっとしてアホなんじゃね?」と思われ始めてしまうwww [793117252]
- 日本に旅行来てる中国人減ったとか言ったの誰だよ
- 自閉症児の父親「中絶しておけば良かった。 家族が欲しかったのに、手に入れたのは人間たまごっち」 [777114754]
