エスケープシーケンスや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:NYxCuvMY580デフォルトの名無しさん
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()などで
同じようなことをやっているようなのですが。
634片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 11:57:34.76ID:iSn0xXbj635デフォルトの名無しさん
2018/04/18(水) 12:00:55.78ID:EfAk4eu6 >>633
C++11 でローカルなスタティック変数の初期化はスレッドセーフであると定められた。
(C++03 にはこの規定はなく、実際その頃はmsvcもgccもスレッドセーフではなかった)
msvc では 2015 から。
c言語バージョンの指定のほか、専用のオプションによっても有効化、無効化できる
以下を参照
https://docs.microsoft.com/ja-jp/cpp/build/reference/zc-threadsafeinit-thread-safe-local-static-initialization
gcc / clang では -fno-threadsafe-statics オプション
C++11 でローカルなスタティック変数の初期化はスレッドセーフであると定められた。
(C++03 にはこの規定はなく、実際その頃はmsvcもgccもスレッドセーフではなかった)
msvc では 2015 から。
c言語バージョンの指定のほか、専用のオプションによっても有効化、無効化できる
以下を参照
https://docs.microsoft.com/ja-jp/cpp/build/reference/zc-threadsafeinit-thread-safe-local-static-initialization
gcc / clang では -fno-threadsafe-statics オプション
636デフォルトの名無しさん
2018/04/18(水) 12:06:23.94ID:H8UzlwrM 他の言語ではコンパイルエラーで悩むことはないのですが、コンパイルが通らなくてかれこれ2日。
エラーの行番号見ても、あってるよーな?よくわからない。
どうすりゃいいの。
エラーの行番号見ても、あってるよーな?よくわからない。
どうすりゃいいの。
637デフォルトの名無しさん
2018/04/18(水) 12:26:53.25ID:MXcoXWvI 独り言ならチラシの裏にかけ
639デフォルトの名無しさん
2018/04/18(水) 12:39:00.98ID:8LhMtFC1 >>638
NDAを結ばないと出せません
NDAを結ばないと出せません
640デフォルトの名無しさん
2018/04/18(水) 12:48:05.38ID:Odk+F4n0 >>636
コードすら貼らないオツムの足りなさじゃ諦めろ
コードすら貼らないオツムの足りなさじゃ諦めろ
641633
2018/04/18(水) 12:59:22.55ID:uQo81sbZ642デフォルトの名無しさん
2018/04/18(水) 13:03:03.18ID:H8UzlwrM なんだよ。このクソ言語。やっとわかったわ。
ちょっとずつコンパイルしていかねぇとダメじゃん。このクソ言語。
エラーの内容はhファイルの方に"{"が期待されるところに"}"がありますなエラー。
ヘッダファイルと睨めっこしても、{}の数あってるし仕方なくcppファイルの方の実装の中身を全部コメントアウトしたら
コンパイル通った。で、cppファイルの方を数行ずつコメントアウト解除したらエラーわかったわ。
hファイルにエラーがあるとかミスリードしてんじゃねぇよ。
ちょっとずつコンパイルしていかねぇとダメじゃん。このクソ言語。
エラーの内容はhファイルの方に"{"が期待されるところに"}"がありますなエラー。
ヘッダファイルと睨めっこしても、{}の数あってるし仕方なくcppファイルの方の実装の中身を全部コメントアウトしたら
コンパイル通った。で、cppファイルの方を数行ずつコメントアウト解除したらエラーわかったわ。
hファイルにエラーがあるとかミスリードしてんじゃねぇよ。
643片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 13:07:10.12ID:iSn0xXbj エラーも貼れないなら、助けるのはムリ。
テレパシーは秘密保持違反になるから、このスレッドでは君を助けられないね。
つーか、仕事中にパソコンで5チャンネル閲覧記録は、大きな企業なら会社にチェックされているだろうね。
テレパシーは秘密保持違反になるから、このスレッドでは君を助けられないね。
つーか、仕事中にパソコンで5チャンネル閲覧記録は、大きな企業なら会社にチェックされているだろうね。
644デフォルトの名無しさん
2018/04/18(水) 13:12:55.50ID:H8UzlwrM そりゃ、ソースコード全部張れば分かるとは思うけど、
エラーの内容は
「hファイルの方に"{"が期待されるところに"}"がありますなエラー。」
みたいなエラーでて、この意味ぐらい自分で分かるし。
だから、このエラーの内容だけ張っても君たちが分かるとは思えなかったら張りませんでした。
お手数かけました片山さん。
エラーの内容は
「hファイルの方に"{"が期待されるところに"}"がありますなエラー。」
みたいなエラーでて、この意味ぐらい自分で分かるし。
だから、このエラーの内容だけ張っても君たちが分かるとは思えなかったら張りませんでした。
お手数かけました片山さん。
645片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 13:22:59.72ID:iSn0xXbj May the source be with you.
646デフォルトの名無しさん
2018/04/18(水) 13:25:36.89ID:whM0Cl8U プリプロセッサの結果を見れば判るだろうに
647デフォルトの名無しさん
2018/04/18(水) 13:37:08.45ID:H8UzlwrM そうでしたか。まだ、C++やりだして1週間未満なものでして、そういうノウハウというか関連知識が
ありませんでした。
まだ、Visual Studioの「エラー一覧」ウィンドウしかまだ見てないもので。とりあえず、初心者の自分は
頻繁に数行書いたらコンパイルすることにします。
ありませんでした。
まだ、Visual Studioの「エラー一覧」ウィンドウしかまだ見てないもので。とりあえず、初心者の自分は
頻繁に数行書いたらコンパイルすることにします。
648デフォルトの名無しさん
2018/04/18(水) 13:45:55.17ID:MXcoXWvI C++の文法のクソさには誰も異論はない。
649デフォルトの名無しさん
2018/04/18(水) 13:59:47.30ID:+aOsPa5t プリプロセッサによる不便さだから c++ の文法とは全く関係ないけどな
650デフォルトの名無しさん
2018/04/18(水) 14:01:11.21ID:v7hqXOET クソどころじゃない
651デフォルトの名無しさん
2018/04/18(水) 15:30:25.37ID:EU/tZBmZ >>642
今後のためにそのエラーになる最少構成でやってみ
今後のためにそのエラーになる最少構成でやってみ
652デフォルトの名無しさん
2018/04/18(水) 20:25:53.95ID:hZhORVVR ヘッダファイルがこんなふうにconst用と非const用の関数があるとして
class A {
B b;
B& get() { return b; }
const B& get() const { return b; }
}
このBがくっそ長くて書くのが面倒な場合、autoで代用するのはまずい習慣ですか?
auto& get() { return b; }
auto& get() const { return b; }
class A {
B b;
B& get() { return b; }
const B& get() const { return b; }
}
このBがくっそ長くて書くのが面倒な場合、autoで代用するのはまずい習慣ですか?
auto& get() { return b; }
auto& get() const { return b; }
653片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 20:49:19.46ID:cGcFIcRA 型名が長すぎるときは、typedef。
654はちみつ餃子 ◆8X2XSCHEME
2018/04/18(水) 20:52:50.32ID:5Rgz0HeV655デフォルトの名無しさん
2018/04/18(水) 21:22:43.95ID:hZhORVVR typedefやusingはなるべく使いたくないんですよね
やはりヘッダーの返り型くらいはちゃんと記述すべきですかね
イタレータとか長くなりがちだけど・・・
やはりヘッダーの返り型くらいはちゃんと記述すべきですかね
イタレータとか長くなりがちだけど・・・
656片山博文MZ ◆T6xkBnTXz7B0
2018/04/18(水) 21:26:54.29ID:cGcFIcRA こうだな。動くかどうか知らんけど。
auto& get() { return b; }
const auto& get() const { return b; }
auto& get() { return b; }
const auto& get() const { return b; }
657はちみつ餃子 ◆8X2XSCHEME
2018/04/18(水) 21:27:07.88ID:5Rgz0HeV decltype(b) でもええんやで。
658デフォルトの名無しさん
2018/04/19(木) 01:18:42.72ID:AYGORpen 悩んでる時間があったら素直に全て書け
と思う
と思う
659デフォルトの名無しさん
2018/04/24(火) 10:32:40.90ID:Z9G2Fq/H 柴田望洋訳のC++の本とロベールのC++の本以外にまともな日本語のC++の本ってありますか?
660デフォルトの名無しさん
2018/04/24(火) 12:27:26.17ID:1D4v+3Mx ロベール、独習(Herbert Schildt)、柴田望洋、林 晴比古
修験者になって、数年山籠もりしたいのなら(笑)、ドワンゴ江添の、
C++11/14 コア言語、江添 亮、2015
修験者になって、数年山籠もりしたいのなら(笑)、ドワンゴ江添の、
C++11/14 コア言語、江添 亮、2015
661デフォルトの名無しさん
2018/04/24(火) 13:18:05.66ID:+bGv0z3c 「C++の設計と進化」は良いよ
662デフォルトの名無しさん
2018/04/24(火) 15:48:30.83ID:Z9G2Fq/H663デフォルトの名無しさん
2018/04/24(火) 18:56:34.08ID:Z9G2Fq/H vector について質問です。
コピーコンストラクタ、operator=
について一応勉強したのですが、 vector などのクラスでは、
コピーコンストラクタや operator= はどうなっているのでしょうか?
コピーコンストラクタ、operator=
について一応勉強したのですが、 vector などのクラスでは、
コピーコンストラクタや operator= はどうなっているのでしょうか?
664デフォルトの名無しさん
2018/04/24(火) 19:23:44.30ID:4uyKjeBM 実際にヘッダ読んで見るしかないと思うが
ディープコピーしてるよとしか
ディープコピーしてるよとしか
665片山博文MZ ◆T6xkBnTXz7B0
2018/04/24(火) 19:27:47.73ID:Eukzbh8y Visual Studioなどでデバッグするとヘッダーが見れるよ。vectorはテンプレートのクラスだから、
読み進めるにはテンプレートの知識が必要かもね。
読み進めるにはテンプレートの知識が必要かもね。
666デフォルトの名無しさん
2018/04/24(火) 19:32:21.39ID:Z9G2Fq/H667デフォルトの名無しさん
2018/04/24(火) 19:40:11.28ID:4uyKjeBM >>666
それはディープコピーのコストがかさむのでおすすめしない
それはディープコピーのコストがかさむのでおすすめしない
668デフォルトの名無しさん
2018/04/24(火) 20:11:58.65ID:Ukt80uX+ >>666
>何も考えず引数で渡しても良いですね
何をもってして「良い」と評価するのかはわかりませんが、
そういうのは拙い知識で独断せずそこら中にある
経験豊富な先人の書いたコードを読んで真似するのがいいですよ
引数は大抵 const 参照で渡しているでしょう
>何も考えず引数で渡しても良いですね
何をもってして「良い」と評価するのかはわかりませんが、
そういうのは拙い知識で独断せずそこら中にある
経験豊富な先人の書いたコードを読んで真似するのがいいですよ
引数は大抵 const 参照で渡しているでしょう
669デフォルトの名無しさん
2018/04/26(木) 01:34:48.58ID:Z7x9U0tp class TestA
{
TestA() {}
~TestA() {}
};
class TestB
{
TestB() {}
~TestB() {}
TestA getA() { return TestA(); }
};
int main() { TestB b; TestA a = b.getA(); }
TestBクラスの getA() メソッドがこのテストコードで正しく動作しているのですが、TestAの
インスタンスは一体どこで作られてるんでしょうか?
TestA getA() { TestA a; return a; }
としないでいきなり reurn TestA() で良い理由が良く分かりませんでした。
{
TestA() {}
~TestA() {}
};
class TestB
{
TestB() {}
~TestB() {}
TestA getA() { return TestA(); }
};
int main() { TestB b; TestA a = b.getA(); }
TestBクラスの getA() メソッドがこのテストコードで正しく動作しているのですが、TestAの
インスタンスは一体どこで作られてるんでしょうか?
TestA getA() { TestA a; return a; }
としないでいきなり reurn TestA() で良い理由が良く分かりませんでした。
670デフォルトの名無しさん
2018/04/26(木) 07:25:57.17ID:E0/AuDcr >>669
どこのメモリにどう作られているのかという質問だと思うけど、
C や C++ では式の値として構造体やオブジェクトが認められていて、
コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。
式や式の一部の値としてだけ現れて変数に格納されないオブジェクトはテンポラリーオブジェクトとか言うので、
詳細はテンポラリーオブジェクトでぐぐって。
>>669
のmain はテンポラリーオブジェクトを使って b を用意せず TestB().getA(); ともかける
ところで今回の質問の、関数の戻り値に関するコンパイラの動作は
「戻り値最適化」なる最適化によって色々複雑なことになっているので
これは自分で戻り値最適化でググって調べて欲しい。
どこのメモリにどう作られているのかという質問だと思うけど、
C や C++ では式の値として構造体やオブジェクトが認められていて、
コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。
式や式の一部の値としてだけ現れて変数に格納されないオブジェクトはテンポラリーオブジェクトとか言うので、
詳細はテンポラリーオブジェクトでぐぐって。
>>669
のmain はテンポラリーオブジェクトを使って b を用意せず TestB().getA(); ともかける
ところで今回の質問の、関数の戻り値に関するコンパイラの動作は
「戻り値最適化」なる最適化によって色々複雑なことになっているので
これは自分で戻り値最適化でググって調べて欲しい。
671デフォルトの名無しさん
2018/04/26(木) 07:37:06.21ID:E0/AuDcr >>669
質問が文法的なことについてだとすると、式中の項ととして
TestA()
std::string("foo")
などのように型名にコンストラタの引数を加えて関数呼び出しのように書くと
テンポラリーオブジェクトを生成してそれを値とする頃ということになる。
例
size_t l = std::string("abc").length();
std::string 型のテンポラリーオブジェクト(中身は"abc") が作られ、
それのメンバ関数 length が呼ばれ、l はその値(3)で初期化される。
質問が文法的なことについてだとすると、式中の項ととして
TestA()
std::string("foo")
などのように型名にコンストラタの引数を加えて関数呼び出しのように書くと
テンポラリーオブジェクトを生成してそれを値とする頃ということになる。
例
size_t l = std::string("abc").length();
std::string 型のテンポラリーオブジェクト(中身は"abc") が作られ、
それのメンバ関数 length が呼ばれ、l はその値(3)で初期化される。
672デフォルトの名無しさん
2018/04/26(木) 11:26:25.34ID:Z7x9U0tp673デフォルトの名無しさん
2018/04/26(木) 14:19:03.06ID:LZqqVlEY 共同ツール 1
https://seleck.cc/685
https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://www.kikakulabo.com/service-eft/
trelloのオープンソースあり
共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/
共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://sketchapp.com/extensions/plugins/
ttp://photoshopvip.net/103903
ttps://goodpatch.com/blog/sketch-plugins/
https://seleck.cc/685
https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://www.kikakulabo.com/service-eft/
trelloのオープンソースあり
共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/
共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://sketchapp.com/extensions/plugins/
ttp://photoshopvip.net/103903
ttps://goodpatch.com/blog/sketch-plugins/
674デフォルトの名無しさん
2018/04/27(金) 13:24:43.31ID:wnXDwKhi for (int i = 0; i < n + 1; ++i) {;}
とやると、 i が n + 1 未満かどうかの判定をする際、毎度
n + 1 を計算してそれを i と比較するということになるので
しょうか?
もし、そうなら、
m = n + 1
for (int i = 0; i < m; ++i) {;}
としたほうがよいのでしょうか?
とやると、 i が n + 1 未満かどうかの判定をする際、毎度
n + 1 を計算してそれを i と比較するということになるので
しょうか?
もし、そうなら、
m = n + 1
for (int i = 0; i < m; ++i) {;}
としたほうがよいのでしょうか?
675はちみつ餃子 ◆8X2XSCHEME
2018/04/27(金) 13:35:12.84ID:GhhThAV7 >>674
ただの整数の足し算程度なら最適化されることが期待できるのであまり気にしなくていい。
ただの整数の足し算程度なら最適化されることが期待できるのであまり気にしなくていい。
676デフォルトの名無しさん
2018/04/27(金) 14:09:53.91ID:ouRrzssA 【マイトLーヤとPS4】 FFとDQの最新作、VR開発は危険、プレーヤーの日常感覚を損なうおそれ
http://rosie.5ch.net/test/read.cgi/liveplus/1524621704/l50
http://rosie.5ch.net/test/read.cgi/liveplus/1524621704/l50
677デフォルトの名無しさん
2018/04/27(金) 18:21:42.79ID:qED012zx https://ideone.com/TVzVzF
上記のコードで、read関数を持ったIReadableクラス(基底クラス)があって、そのクラスから派生したCFileReaderクラス、
直接は派生していないけどread関数を持ったCMemoryReaderクラスがあって、その両方を受け取れるvector<IReadable*>を作りたいのですがコンパイルが通りません。
どうしたらいいでしょうか? どなたか教えてください。。。
上記のコードで、read関数を持ったIReadableクラス(基底クラス)があって、そのクラスから派生したCFileReaderクラス、
直接は派生していないけどread関数を持ったCMemoryReaderクラスがあって、その両方を受け取れるvector<IReadable*>を作りたいのですがコンパイルが通りません。
どうしたらいいでしょうか? どなたか教えてください。。。
678デフォルトの名無しさん
2018/04/27(金) 18:38:42.04ID:yKF4ET93 >>674
いまだに最適化されないコンパイラもあることはある
8bitマイコンとかの話
あと、nがvolatileだと当然毎回計算する
nがSFRだったり複数スレッド共有変数だったりするなら気を付けよう
普通は気にしなくて大丈夫
コンパイラの最適化の基本の基本なので
このループの比較がパフォーマンスに大きく影響するなら
高速化テクニックは色々とある
いまだに最適化されないコンパイラもあることはある
8bitマイコンとかの話
あと、nがvolatileだと当然毎回計算する
nがSFRだったり複数スレッド共有変数だったりするなら気を付けよう
普通は気にしなくて大丈夫
コンパイラの最適化の基本の基本なので
このループの比較がパフォーマンスに大きく影響するなら
高速化テクニックは色々とある
679デフォルトの名無しさん
2018/04/27(金) 19:03:28.59ID:uctWpHV6 >>677
なんとなく互換性のある read を持つものをエンベロープして IReadable になるエンベロープクラスを用いるのはどう?
ifstream も IReadable じゃないからエンベロープする。
https://ideone.com/27yhhu
なんとなく互換性のある read を持つものをエンベロープして IReadable になるエンベロープクラスを用いるのはどう?
ifstream も IReadable じゃないからエンベロープする。
https://ideone.com/27yhhu
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- テレビ朝日本社から20~30代の関連会社社員とみられる男性が転落し死亡 六本木けやき坂通りの通行人にはけが人なし [少考さん★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 【サッカー】日本代表、FIFAランキング“4位”の強豪イングランドとの対戦が正式決定! 来年3月に聖地ウェンブリーで激突へ [久太郎★]
- タイがカンボジアを空爆、トランプ氏仲介の和平合意は“事実上崩壊”軍事衝突へ タイ首相「もはや対話の余地ない」 [お断り★]
- VIPにも一人くらいは人肉食べたいやつとかいるのかな?
- すまん、飲食チェーン店での一幕なんだがオマエラはこれを見て何を思うかおしえてくれ。
- 粗品「南原が3億も貰えんの?」 [279254606]
- 朝雑談
- 毎日菊花茶飲んでたら美肌になったよ
- 【朗報】VTuber、とうとうスパロボに参戦する
