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


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

【初心者歓迎】C/C++室 Ver.102【環境依存OK】



1 名前:デフォルトの名無しさん [2017/11/04(土) 16:33:35.07 ID:NYxCuvMY.net]
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/

596 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 11:52:13.52 ID:igXjAIRS.net]
bの型がBaseだからだろ?

597 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 12:16:46.54 ID:VXOW+WoG.net]
まずこの本で、オブジェクト指向を学ぶ。
スッキリわかる Java入門 第2版、2014

最難関のC++ で、オブジェクト指向を学ぶなんて、夢のまた夢w
軽く、数年を無駄にするだけ

C++ なんて、偏差値70以上しか無理やのに

598 名前:デフォルトの名無しさん [2018/04/15(日) 12:34:26.84 .net]
>>577
> b = d;
> b.A() ⇒ 「Base」が表示される。

Base bp;
bp = &d;
b->A();

こうやね

599 名前:デフォルトの名無しさん [2018/04/15(日) 12:35:11.72 .net]
>>582
間違えた

Base *bp;
bp = &d;
b->A();

600 名前:デフォルトの名無しさん [2018/04/15(日) 12:36:47.16 ID:c4dXLki+.net]
>>583-585

ありがとうございました。


C++が難しいというのは、設計が悪いからですか?
C++と同等の機能を持った言語で、C++よりも分かりやすい言語を新たに
設計することは無理ですか?

601 名前:デフォルトの名無しさん [2018/04/15(日) 12:37:23.54 ID:c4dXLki+.net]
>>587-588

ありがとうございました。
試してみようと思います。

602 名前:デフォルトの名無しさん [2018/04/15(日) 12:43:40.81 ID:c4dXLki+.net]
理由があってC++を習得するのが難しいのならOKですが、設計が悪いから
難しいということになると、利用者にとっては迷惑な話ですね。

603 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 13:30:31.42 ID:VXOW+WoG.net]
C++ は、何でも出来るようにしているから、ルール数が100以上ある

さらに、ルールAでは、B, C は除くとか、
1つのルールが、他のルールとからむから、
非常に難しいし、組み合わせ爆発が起こる

膨大な時間を無駄にしても、さほど理解できず、身につかない。
組み込み機器も想定しているから、
どうしてこういうルールが必要なのか、初心者には理解できない。
Rust ですら、初心者には無理だろ

だから、ドワンゴ江添の本を持って、数年山ごもりしろって言われる。
ルールの多さで、廃人になってしまう

初心者には、絶対に無理。
最初から、エベレストを登るようなもの。
まず「スッキリわかる Java入門」とかの、低い山で修行を積むべし

このレベルでは言語どうこうじゃない。
小中高大学まで行くような、研修制度・道筋が大事。
徐々に基礎体力を付けていかないと、何もできない

604 名前:592 mailto:sage [2018/04/15(日) 13:45:38.29 ID:VXOW+WoG.net]
ロベールでC++ を勉強するのも良いけど、
あくまで、C++ の初心者というだけで、
C++ をやるには、最低でも数言語は知っている必要がある

特に、Java, C, Rust は、絶対に知っていないといけない。
組み込みの知識も必要

C++ の初心者だけど、他の言語はプロ級で、
PC・組み込み・Linux コマンドも知っていて、C++ を始められる

それでも、ほとんどのC プログラマーは、C++ へ進めない



605 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 13:49:36.88 ID:ldkcKhuZ.net]
スッキリ厨はちゃんとコテ付けてくれ

606 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 15:24:18.71 ID:qZPDSYA2.net]
某洋氏翻訳の第4版がロベール本より先に出てくる理由について3行で述べよ。

第3版が難読版というのは判る

607 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 15:55:19.09 ID:/OvgYAab.net]
= が代入じゃなく単に Base クラスのオブジェクトのoperator = を呼んでるだけ、
という理解が必要なんだろうけれどこれ難しいだろうか?

cから来た人なら
struct base b;
b = ...;
で b の型が変わるなんて考えもしないだろうけど
最近の人は c やらないのかな

608 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 16:39:48.86 ID:VXOW+WoG.net]
ロベールの方が、独習・柴田望洋・林 晴比古などよりも、簡単

609 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 17:20:50.44 ID:s7NpyR5v.net]
原典も読まずに能書き垂れる奴っているんだなぁ

610 名前:デフォルトの名無しさん [2018/04/15(日) 18:07:17.49 ID:c4dXLki+.net]
>>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

611 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 18:44:29.81 ID:ZEcSoj1Y.net]
参照は書き換えられないからな。

>br = d;

参照先のbに代入してるのと同じこと。

612 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 18:50:44.48 ID:CIuag2/D.net]
>>599
当たり前
br は b の別名なだけだから
b = d;
ってやってるのと同じ
b は Base の領域しかないんだから b.A() で Delived::A() を呼び出した時に Delived にしかないメンバ変数とか参照してたら困るし

613 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 00:20:31.20 ID:TXxoP4/a.net]
参照のポインタっぽい振る舞いを確認したいならこう

Derived d;
Base & b1(d);
b1.A();

614 名前:デフォルトの名無しさん [2018/04/16(月) 07:57:32.89 ID:PsSdBUuj.net]
>>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();
}



615 名前:デフォルトの名無しさん [2018/04/16(月) 08:01:12.80 ID:PsSdBUuj.net]
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();

616 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 08:14:10.02 ID:TXxoP4/a.net]
>>604
参照は初期化時に参照先が設定され、以降の操作は参照先に対してなされる。
初期化と代入を区別すること。

Base& br1 = b; // 初期化 br1 は b の参照
br1 = d; // 代入 b = d と同じ動作

Base& br2 = d; // 初期化 br2 は d の参照

617 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 08:32:20.53 ID:PsSdBUuj.net]
>>605

ありがとうございました。

>Base& br1 = b; // 初期化 br1 は b の参照
>br1 = d; // 代入 b = d と同じ動作

br1 = d としても参照先は変わらないんですね。

ありがとうございました。

618 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 12:10:28.34 ID:rDfY3L1y.net]
Java,C#などのプログラマです。
C++にC#などのインターフェースはない代わりに多重継承?できるのでそれを使うとのことで、
https://ideone.com/k7g2nn
ITestAとITestBはインターフェース的なものです。
で、ITestAを実装したCBaseAを作り、CBaseAを継承しITestBを実装したCTestBを
作ったのですが、
CBaseBをnewなど実体化するとITestA::methodAがオーバーライドされておらずCBaseBは
抽象クラスになってて実体化できません。
ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
というかこういう場合C++ではどうすればいいのでしょうか?

619 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 12:43:19.10 ID:qlfABgAK.net]
Base Pointer : 100〜119
Derived Pointer : 120〜139

こういう状況で、Base クラスを指す際、クラスポインターは100 を指している。
100〜119 内で、Base クラスの変数・メソッドのアドレスを探す

Derived クラスを指す際、クラスポインターは自動的に、120 に変わる。
120〜139 内で、Derived クラスの変数・メソッドのアドレスを探す

620 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 13:08:20.92 ID:5MYyAHFg.net]
>>607
単なる文法エラーだからエラーメッセージみてコードを直してください

621 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:01:04.61 ID:rDfY3L1y.net]
>>609
文法エラー??
https://ideone.com/k7g2nnの今回の部分と関係ないエラーは無視してください。
あくまでイメージ目的でそこらへん適当にやりました。
すみません。

https://ideone.com/QxErKY
こっちですね。

622 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:08:31.72 ID:rDfY3L1y.net]
ちなみに、C#だとこんな感じです。
https://ideone.com/8SZhJ7

623 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:29:48.23 ID:7XdbFr6Z.net]
CBaseAのmethodAをCBaseBを実体化して呼びたいんだよな?
ならCBaseAとITestBどっちのmethodA呼ぶのかあいまいって怒られる

これならok
https://ideone.com/FGHyda

624 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:32:34.81 ID:rDfY3L1y.net]
もちろん、エラーなくしてコンパイルを通す方法は
>>607
>ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
で書いた



625 名前:ようにすればとりあえず、コンパイルは通ります。
聞きたいのは、
C#の場合はBaseAの方で一度MethodAを宣言・定義すればいいのですが、
C++の場合は毎回CBaseAの派生クラスでmethodAを宣言して定義しなおさなければいけないのでしょうか??
それともC++では他の方法があるのでしょうか?
[]
[ここ壊れてます]

626 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:34:54.92 ID:rDfY3L1y.net]
>>612
あ、すみません。ちょっと被ってしましましたね。>>613は忘れて下さい。
>>612のコードを見てみます。

627 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 15:08:36.13 ID:rDfY3L1y.net]
>>612
そっか。純粋仮想関数じゃなくて仮想関数にするって手もありましたか。
まぁ、インターフェース的なクラスの方をいじくるのが気になりますが。
ありがとうございます。

628 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 15:30:44.68 ID:7XdbFr6Z.net]
>>615
インターフェース側をいじるのは仕方ない
どっちかになる

https://ideone.com/qrd4fN
https://ideone.com/kVZzRi

629 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 16:21:16.33 ID:Gm7LZDiq.net]
実装とインタフェースの両方を継承するならこういう書き方もある
ATL なんかがこれ式かな

https://ideone.com/B7JWER

630 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 17:30:50.30 ID:rDfY3L1y.net]
>>616
>>617
色々ありがとうございます。>>617がよさそうなのでこれで行こうかなと思います。

631 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:08:59.76 ID:SGgdop5e.net]
巨大なファァイルの読み込みに関してです。
たとえば1000行のテキストからなるファイルの1000行目だけを読み込んで、配列に
代入したいのですが、ファイルをopenしていきなり1000行目にアクセスする方法はありますでしょうか?
現在、forループで1000回廻して1行ずつ増やしてアクセスし1000回目にfgetsで読み込んで配列に入れているのですが、999回のループが無駄なので高速化したいのですが、どなたかご教授いただけないでしょうか?

632 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:20:32.18 ID:/qMRupTB.net]
行という概念が
先頭から読んでいって逐次確認しないと行の区切りが確定しないのでどうしようもないんじゃない?

ファイルサイズ分一気にオンメモリで読んで後から行の切り出しするとかの工夫はあるだろうけど

633 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:29:32.71 ID:KTfx2aCu.net]
>>619
テキストのフォーマットによっては高速化は可能
例えば1行が固定サイズとか行番号が書いてあるとか

全く自由なフォーマットだと頭から解析するしかない

読み込みスレッドと解析スレッドを分けると速くなることもあるかも

同じファイルが複数回指定されることが多ければ
ファイル名と更新日時と1000行目の位置
のデータベースを持つとか

634 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:30:11.39 ID:cVYjBdTw.net]
>>619
「1000行目」の定義が先頭から数えて999番目の改行の次、である以上ありません。
1行のバイト数を全て同一にすることができれば(この場合しばしば行ではなくレコードと呼ばれる)
1000番目のバイト位置を計算してそこから読むことができます。

FILE * を用いてシーケンシャルにたくさん読む場合は
setvbuf でバッファサイズを拡大しておくと高速になることも多いので試す価値はあるでしょう

いろんな行に何度もアクセスするなら、
全てメモリに読み込んだ上で各行の先頭位置を配列に記録しておくと良いでしょう。



635 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:36:06.95 ID:p5xwhAV/.net]
末尾にseekして、適当に戻って読んでみて、
改行がなければまた戻って、を繰り返すのが現実的。

636 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:40:13.25 ID:/qMRupTB.net]
巨大なファイルの中途の行じゃなく、ファイルの最終行だけを抜き出したい のか?

637 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:50:32.61 ID:yyY2OAEq.net]
対象のテキストファイルとは独立に、
「そのテキストファイルの各行がファイルの何バイト目から始まるか」
という情報を覚えておく手はあると思うけど、整合を保つのが面倒よね。

>>622 の後半部分だな。

638 名前:619 mailto:sage [2018/04/17(火) 18:03:45.64 ID:SGgdop5e.net]
皆様いろいろご指導ありがとうございました。
私の能力では難しそうですが、いろいろ高速化を試してみます。

639 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 18:46:11.69 ID:NCQX7EWc.net]
末尾にseek して1文字抜出し(末尾が\n の場合はそれを無視して)
\n が現れるまで1文字ずつ戻りながらキューに積んで
最後にキューの中身を逆順にする

640 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 18:55:56.84 ID:gaNnpc4H.net]
配列の要素数が分からないときscanfで読み込んだ値を要素数にするにはどのようにしたらよいですか?

641 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 19:35:04.61 ID:wvS91pUR.net]
>>628
scanf("%d",&n);
int array[n]; //読み込んだ値を要素数にするってこういう事?

642 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:21:29.36 ID:AHw7lgSX.net]
基本的な事なんだろうけど、vectorを範囲ベースのforループしたいのですができません。
auto v = vector<int>()だとfor (auto &i : v)でいけるのですが、
newした場合はどうすればいいのでしょうか?
autov = new vector<int>(); for (auto &i : v)だと
begin関数が見つかりませんといってコンパイルできません。
どうすればいいでしょうか?

643 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:24:11.47 ID:AHw7lgSX.net]
すみませんでした。普通に逆参照すればいいのか。
auto v = new vector<int>(); for (auto &i : *v)

644 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:46:42.62 ID:hZ2W0cz8.net]
>>629
ありがとうございました



645 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 11:35:26.22 ID:uQo81sbZ.net]
MFCのアプリで排他制御のルーチンを作っていて疑問に思ったことなのですが、
CやC++の仕組みのことなので、こちらで質問させていただきます。

複数のスレッドから呼ばれる関数の内部は、
CCriticalSectionを使って排他制御しています。

void Test()
{
  static CCriticalSection cs;
  cs.Lock();
  :
  cs.Unlock();
}

関数内のstatic変数は、その関数が初めて呼ばれたときに
実体が作成されると理解しているのですが、
1回目のTest()でCCriticalSectionのコンストラクタを実行している最中に
他のスレッドがTest()を呼んだ場合、このコンストラクタ自体は、
正しく排他制御されるのでしょうか?
コンストラクタが終わるまで、他のスレッドは待ってくれるのでしょうか?

それとも、CCriticalSectionの変数は、
関数の外に置かなくてはいけないものでしょうか?

MFCの内部でも、AFXPlaySystemSound()などで
同じようなことをやっているようなのですが。

646 名前:片山博文MZ mailto:sage [2018/04/18(水) 11:57:34.76 ID:iSn0xXbj.net]
https://cpprefjp.github.io/lang/cpp11/static_initialization_thread_safely.html
d.hatena.ne.jp/yohhoy/touch/20120309/p1

647 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:00:55.78 ID:EfAk4eu6.net]
>>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 オプション

648 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:06:23.94 ID:H8UzlwrM.net]
他の言語ではコンパイルエラーで悩むことはないのですが、コンパイルが通らなくてかれこれ2日。
エラーの行番号見ても、あってるよーな?よくわからない。
どうすりゃいいの。

649 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:26:53.25 ID:MXcoXWvI.net]
独り言ならチラシの裏にかけ

650 名前:片山博文MZ mailto:sage [2018/04/18(水) 12:28:10.26 ID:iSn0xXbj.net]
>>636
ソースとエラー貼って

651 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:39:00.98 ID:8LhMtFC1.net]
>>638
NDAを結ばないと出せません

652 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:48:05.38 ID:Odk+F4n0.net]
>>636
コードすら貼らないオツムの足りなさじゃ諦めろ

653 名前:633 mailto:sage [2018/04/18(水) 12:59:22.55 ID:uQo81sbZ.net]
>>634-635
ありがとうございます。
VSは2015よりも前なので、このやり方はダメってことですね。
関数の外に置くようにします。

MFCの内部ではやっちゃってますが。

654 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:03:03.18 ID:H8UzlwrM.net]
なんだよ。このクソ言語。やっとわかったわ。

ちょっとずつコンパイルしていかねぇとダメじゃん。このクソ言語。
エラーの内容はhファイルの方に"{"が期待されるところに"}"がありますなエラー。
ヘッダファイルと睨めっこしても、{}の数あってるし仕方なくcppファイルの方の実装の中身を全部コメントアウトしたら
コンパイル通った。で、cppファイルの方を数行ずつコメントアウト解除したらエラーわかったわ。
hファイルにエラーがあるとかミスリードしてんじゃねぇよ。



655 名前:片山博文MZ mailto:sage [2018/04/18(水) 13:07:10.12 ID:iSn0xXbj.net]
エラーも貼れないなら、助けるのはムリ。

テレパシーは秘密保持違反になるから、このスレッドでは君を助けられないね。

つーか、仕事中にパソコンで5チャンネル閲覧記録は、大きな企業なら会社にチェックされているだろうね。

656 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:12:55.50 ID:H8UzlwrM.net]
そりゃ、ソースコード全部張れば分かるとは思うけど、
エラーの内容は
「hファイルの方に"{"が期待されるところに"}"がありますなエラー。」
みたいなエラーでて、この意味ぐらい自分で分かるし。

だから、このエラーの内容だけ張っても君たちが分かるとは思えなかったら張りませんでした。
お手数かけました片山さん。

657 名前:片山博文MZ mailto:sage [2018/04/18(水) 13:22:59.72 ID:iSn0xXbj.net]
May the source be with you.

658 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:25:36.89 ID:whM0Cl8U.net]
プリプロセッサの結果を見れば判るだろうに

659 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:37:08.45 ID:H8UzlwrM.net]
そうでしたか。まだ、C++やりだして1週間未満なものでして、そういうノウハウというか関連知識が
ありませんでした。

まだ、Visual Studioの「エラー一覧」ウィンドウしかまだ見てないもので。とりあえず、初心者の自分は
頻繁に数行書いたらコンパイルすることにします。

660 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:45:55.17 ID:MXcoXWvI.net]
C++の文法のクソさには誰も異論はない。

661 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:59:47.30 ID:+aOsPa5t.net]
プリプロセッサによる不便さだから c++ の文法とは全く関係ないけどな

662 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 14:01:11.21 ID:v7hqXOET.net]
クソどころじゃない

663 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 15:30:25.37 ID:EU/tZBmZ.net]
>>642
今後のためにそのエラーになる最少構成でやってみ

664 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 20:25:53.95 ID:hZhORVVR.net]
ヘッダファイルがこんなふうに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; }



665 名前:片山博文MZ mailto:sage [2018/04/18(水) 20:49:19.46 ID:cGcFIcRA.net]
型名が長すぎるときは、typedef。

666 名前:はちみつ餃子 mailto:sage [2018/04/18(水) 20:52:50.32 ID:5Rgz0HeV.net]
>>653
型の別名を定義することについての是非は置くとして、 typedef はオワコン。
using を使うのがモダンな C++ やで。

667 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 21:22:43.95 ID:hZhORVVR.net]
typedefやusingはなるべく使いたくないんですよね
やはりヘッダーの返り型くらいはちゃんと記述すべきですかね
イタレータとか長くなりがちだけど・・・

668 名前:片山博文MZ mailto:sage [2018/04/18(水) 21:26:54.29 ID:cGcFIcRA.net]
こうだな。動くかどうか知らんけど。
auto& get() { return b; }
const auto& get() const { return b; }

669 名前:はちみつ餃子 mailto:sage [2018/04/18(水) 21:27:07.88 ID:5Rgz0HeV.net]
decltype(b) でもええんやで。

670 名前:デフォルトの名無しさん mailto:sage [2018/04/19(木) 01:18:42.72 ID:AYGORpen.net]
悩んでる時間があったら素直に全て書け
と思う

671 名前:デフォルトの名無しさん [2018/04/24(火) 10:32:40.90 ID:Z9G2Fq/H.net]
柴田望洋訳のC++の本とロベールのC++の本以外にまともな日本語のC++の本ってありますか?

672 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 12:27:26.17 ID:1D4v+3Mx.net]
ロベール、独習(Herbert Schildt)、柴田望洋、林 晴比古

修験者になって、数年山籠もりしたいのなら(笑)、ドワンゴ江添の、
C++11/14 コア言語、江添 亮、2015

673 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 13:18:05.66 ID:+bGv0z3c.net]
「C++の設計と進化」は良いよ

674 名前:デフォルトの名無しさん [2018/04/24(火) 15:48:30.83 ID:Z9G2Fq/H.net]
>>660-661

ありがとうございます。

Herbert Schildtの本は、ロベールに比べると細かい話がないように思います。
柴田さんの中級という本も細かい話がないように思います。



675 名前:デフォルトの名無しさん [2018/04/24(火) 18:56:34.08 ID:Z9G2Fq/H.net]
vector について質問です。

コピーコンストラクタ、operator=
について一応勉強したのですが、 vector などのクラスでは、
コピーコンストラクタや operator= はどうなっているのでしょうか?

676 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 19:23:44.30 ID:4uyKjeBM.net]
実際にヘッダ読んで見るしかないと思うが
ディープコピーしてるよとしか

677 名前:片山博文MZ mailto:sage [2018/04/24(火) 19:27:47.73 ID:Eukzbh8y.net]
Visual Studioなどでデバッグするとヘッダーが見れるよ。vectorはテンプレートのクラスだから、
読み進めるにはテンプレートの知識が必要かもね。

678 名前:デフォルトの名無しさん [2018/04/24(火) 19:32:21.39 ID:Z9G2Fq/H.net]
>>664

ありがとうございました。

ディープコピーでしたら、使う上では、何も考えずに関数の引数として渡したり、
関数から返したりしてもかまわないですね。

>>665

ありがとうございました。

679 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 19:40:11.28 ID:4uyKjeBM.net]
>>666
それはディープコピーのコストがかさむのでおすすめしない

680 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 20:11:58.65 ID:Ukt80uX+.net]
>>666
>何も考えず引数で渡しても良いですね

何をもってして「良い」と評価するのかはわかりませんが、
そういうのは拙い知識で独断せずそこら中にある
経験豊富な先人の書いたコードを読んで真似するのがいいですよ
引数は大抵 const 参照で渡しているでしょう

681 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 01:34:48.58 ID:Z7x9U0tp.net]
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() で良い理由が良く分かりませんでした。

682 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 07:25:57.17 ID:E0/AuDcr.net]
>>669
どこのメモリにどう作られているのかという質問だと思うけど、
C や C++ では式の値として構造体やオブジェクトが認められていて、
コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。

式や式の一部の値としてだけ現れて変数に格納されないオブジェクトはテンポラリーオブジェクトとか言うので、
詳細はテンポラリーオブジェクトでぐぐって。

>>669
のmain はテンポラリーオブジェクトを使って b を用意せず TestB().getA(); ともかける


ところで今回の質問の、関数の戻り値に関するコンパイラの動作は
「戻り値最適化」なる最適化によって色々複雑なことになっているので
これは自分で戻り値最適化でググって調べて欲しい。

683 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 07:37:06.21 ID:E0/AuDcr.net]
>>669
質問が文法的なことについてだとすると、式中の項ととして
TestA()
std::string("foo")
などのように型名にコンストラタの引数を加えて関数呼び出しのように書くと
テンポラリーオブジェクトを生成してそれを値とする頃ということになる。


size_t l = std::string("abc").length();

std::string 型のテンポラリーオブジェクト(中身は"abc") が作られ、
それのメンバ関数 length が呼ばれ、l はその値(3)で初期化される。

684 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 11:26:25.34 ID:Z7x9U0tp.net]
>>670-671
詳細をありがとうございました。
大変良く解りました。より深くは自分でググってみます。



685 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 14:19:03.06 ID:LZqqVlEY.net]
共同ツール 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/

686 名前:デフォルトの名無しさん [2018/04/27(金) 13:24:43.31 ID:wnXDwKhi.net]
for (int i = 0; i < n + 1; ++i) {;}

とやると、 i が n + 1 未満かどうかの判定をする際、毎度
n + 1 を計算してそれを i と比較するということになるので
しょうか?

もし、そうなら、

m = n + 1
for (int i = 0; i < m; ++i) {;}

としたほうがよいのでしょうか?

687 名前:はちみつ餃子 mailto:sage [2018/04/27(金) 13:35:12.84 ID:GhhThAV7.net]
>>674
ただの整数の足し算程度なら最適化されることが期待できるのであまり気にしなくていい。

688 名前:デフォルトの名無しさん [2018/04/27(金) 14:09:53.91 ID:ouRrzssA.net]
【マイトLーヤとPS4】 FFとDQの最新作、VR開発は危険、プレーヤーの日常感覚を損なうおそれ
rosie.5ch.net/test/read.cgi/liveplus/1524621704/l50

689 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 18:21:42.79 ID:qED012zx.net]
https://ideone.com/TVzVzF

上記のコードで、read関数を持ったIReadableクラス(基底クラス)があって、そのクラスから派生したCFileReaderクラス、
直接は派生していないけどread関数を持ったCMemoryReaderクラスがあって、その両方を受け取れるvector<IReadable*>を作りたいのですがコンパイルが通りません。
どうしたらいいでしょうか? どなたか教えてください。。。

690 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 18:38:42.04 ID:yKF4ET93.net]
>>674
いまだに最適化されないコンパイラもあることはある
8bitマイコンとかの話

あと、nがvolatileだと当然毎回計算する
nがSFRだったり複数スレッド共有変数だったりするなら気を付けよう

普通は気にしなくて大丈夫
コンパイラの最適化の基本の基本なので

このループの比較がパフォーマンスに大きく影響するなら
高速化テクニックは色々とある

691 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:03:28.59 ID:uctWpHV6.net]
>>677
なんとなく互換性のある read を持つものをエンベロープして IReadable になるエンベロープクラスを用いるのはどう?

ifstream も IReadable じゃないからエンベロープする。

https://ideone.com/27yhhu

692 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:06:52.81 ID:O6TOHWbP.net]
>>674
> for (int i = 0; i <= n; ++i) {;}

693 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:18:38.40 ID:uctWpHV6.net]
for ループといえばつい手癖で
for (int i =0; i < count-1; ++i ) {...}
と書いてて、
後日に count を int から size_t にしたとき
countが0のケースではまったことがあるなあ

for (int i =0; i + 1 < count; ++i ) {...}
と書けば良いだけなんだけど

694 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:27:34.55 ID:mctUhDKo.net]
n+1未満とn以下は違うと思うの



695 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:33:05.63 ID:AimUsleE.net]
>>681
それcountが1でも全くループしないというヘンテコ仕様だけど
そんなもの手癖で書くの?

696 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:37:07.17 ID:uctWpHV6.net]
>>683
隣り合った2項、例えばv[i] と v[i+1] を用いた処理をするとか
後続のものがある項だけ処理するとか良くある






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

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

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