C++相談室 part134
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part133
http://mevius.5ch.net/test/read.cgi/tech/1511509970/
このスレもよろしくね。
【初心者歓迎】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 >>783
じゃあお前が説明しろよ。
お前は馬鹿だから出来ないと思うがな。
そもそも>>763は誰向けのレスだよ? コーディング規約にchar aznable禁止っていうのを見たことあるから
C++にガンダム要素を入れるのはタブー >>780
> テンプレート引数に変数突っ込んでなんで動かないのぉぉとか初心者はよくあるよ
ねえよ
> 説明してる本がないって本当か?本当なら世の本がクソすぎる
世の本は概して糞だ。これは事実だ。
というかここら辺の認識がずれるのは世代ギャップだ。
現状の本を書いてきている世代は全員CをやってからC++をやっている。
だから「静的」「動的」の区別が付かない状態でテンプレートを触ることがなかった。
当然そこを解説した本もそんなにあるはずがない。
お前らの世代がCをやらずにいきなりC++を始め、それで色々苦労した経験があるのなら、
お前らの世代の連中が本を書かなければならない。ただそれ以前に、
俺はその必要(全くの初心者がCをやらずにC++を始める)があるとは思えないが。
入門書を書いている連中はプログラマでも宣教師でもなく、ただのテクニカルライタだ。
だから需要(売れる)があれば書くだけ。今無いのは需要がないと見られているから。
俺もこの見方については同意する。
最初のプログラミング言語がC++ってのは単純に選択を間違えてる。 C++とJavascript以外学ぶ必要があるとは思えない。 >>789
それはさすがに世間が狭すぎる
土方志望としてもJava程度は触っとけ Javaは当初の理念を失ってしまったように感じる。 JavaはJVM上で動く一言語に成り下がったからな みなさん、ありがとうございました。
カーニハン他の本をまず読んでみようと思います。
>>793
そうなんですか?
Robert SedgewickらのAlgorithmsという教科書がJavaで書かれているため、
Javaの本も買って読んでいます。
ところで、学術的?な本では、オブジェクト指向言語としてC++かJavaが
大抵使われていますが、C#は使われていません。これはマイクロソフト
という一企業が設計した言語だからでしょうか? たとえば、プログラミングコンテスト関係の本では大抵C++が使われています。 そういう理由から、本当はC++ではなくC# + Visual Studioを勉強したいのですが、
C++の本(ロベール)を買って読んでいます。 そのうち大抵の言語は経験なくてもリファレンス片手に使えるようになるから好きなもん使え >>796
なら素直にC#やっとけ。
その後に必要ならC++で何も問題ない。
C#は商業的につまずいたのでJavaほどの知名度はないが、
言語自体はJavaよりは断然いい。(後発だから当然だが) ねーねー。
STL作った人は、共産主義国で食中毒にあって、ベッドの上で朦朧とした頭で閃いたって話だった気がしたけど、どっかにその話のソースある?
ググっても見つからないよー >>801
見つけてきたぞ。何処かで発表か何かするの?
http://www.stlport.org/resources/StepanovUSA.html
ところでこのインタビューにあるtamagawa numberってなんだろう 皆様ありがとーございます。
論文の枕で書こうかと思いまして char* str = "abc";
とは書かずに、
const char* str = "abc";
と常に書くようにと本に書いてあります。
理由は文字列リテラルは直接書き換えてはいけないからであると書かれています。
●コンパイルは通っても、実行するとエラーになることもある。
●同じ内容の他の文字列リテラルまで書き換えられてしまうことがある。
とも書かれています。
禁止されているにもかかわらず、コンパイルが通る可能性があるというのはどういう
ことなのでしょうか?
(1)コンパイルエラーが発生
(2)コンパイルは通るが実行するとエラーが発生
(3)コンパイルは通り、実行してもエラーが発生しないが、同じ内容の他の文字列
リテラルまで書き換えられてしまうという不具合が起こることがある。
コンパイラーの設計者には、(1)、(2)、(3)の選択肢があるのはなぜでしょうか?
禁止されているのだから、一律にコンパイルエラーにするのが自然に思われます。 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) const char* str = "abc";
const char ca[] = {'a', 'b', 'c', '\0'};
の二つは同じことだと思っていましたが、これは違うということでしょうか?
const char* str = "abc";
では、"abc"をある場所に格納しておき、それを使いまわしたりすることがある
ということでしょうか?
例えば、
const char* str1 = "abc";
const char* str2 = "abc";
と書いたときに、 str1 == str2 になることがあるということでしょうか?
一方、
const char ca1[] = {'a', 'b', 'c', '\0'};
const char ca2[] = {'a', 'b', 'c', '\0'};
と書いた場合には、それぞれ、別に格納場所が確保されるということでしょうか? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) すみません。
カーニハンらの本の日本語版のp.127に書いてありました。
char amessage[] = "now is the time";
char *pmessage = "now is the time";
の違いについてです。
そして、文字列の内容を変えようとすると、その結果は不定となる
と書かれいます。なぜ不定としているのかについては理由は書いてありません。 >>809
ありがとうございました。
故意に違反状態にするということもあるんですね。
正直言って無駄に分かりにくいところがあるんですね。 うん過去のもうメンテナンス不能なコードは膨大なんでそうするしか仕方ないんだよ >>810
旧K&Rつまり第一版は書換可能だったの >>807
ISO/IEC14882:2017 C.1.1の段落3で
char* p = "abc"; // valid in C, invalid in C++
となっているので、C++ではコンパイルが通ってはいけない
なぜ通ることがあるのかというと、
JIS X3014:2003 D.4で
定値文字列からの暗黙変換 文字列リテラルに対し,定値から非定値へ暗黙変換することは,推奨しない(4.2参照)。
となっており、C++03に従う限りコンパイルは通ることになっていた名残だ するなと言われてもスーパーセットなんだからC言語の記法がどこまで通じるかは重大な問題だと思う >>820
スーパーセットにするというよりは、
つかず離れずというポジションかなぁ。
C++ が先にやったのを C で取り入れたことも有るし。 可変長配列とか名前付きの構造体初期化とかc++に取り込まれたんだっけ?
スーパーセットは20年前にとっくに終わったんじゃないかと。
すでに導入されてたらスマソ >>823
たぶん入ってないな。
可変長配列 (VLA) って確か C でもオプショナルに格下げされてただろ。 (C11 から)
C++ のイニシャライザはだいぶん複雑になっちゃったから辻褄の合うようにするの大変だろうし、
もうやらないんじゃないかな。 実用レベルではほぼスーパーセットといっても差し支えない 実用レベル:=C++にも存在する機能に制限されたC C11の_GenericとかそれCで敢えてやる必要あるの?って思う 微妙に使い辛い機能だし分からんでもないけど、本当の名前がちゃんと見えてるのはちょっと安心感 >>828
スイッチで選択するのをスマートにした感じやな。
イマイチ〜〜。
テンプレート一個書いて複数にジェネレートさせる方が好み。 あるクラスAのラッパークラスWで
A&を受け取る場合はWの全てのメソッドが使えて
const A&を受け取る場合はWのconstメソッドだけが使えるように制限する設計って
ありましたっけ? あとは operator -> でポインタ返すやり方とかだな >>831
制限っていうのは、コンパイルエラーにしたいの? A a0;
const A a1;
W w0(a0);//OK
W w1(a1);//NG
const W w2(a1);//OK
const W w3(a0);//OK
で、Wの非constメソッドには必ずconstメソッドが対応して存在している
みたいな >>835
NGっていうのは、コンパイルエラーにしたいの? >>836
明確な欠点を指摘出来ない時に使う言葉だな
「ダサい」 クラスを
W
MutableW (変更可能なW)
と分けるのがよく使われる現実的な解だと思う
MutableW は W の派生型として実装すると楽
>>835
>で、Wの非constメソッドには必ずconstメソッドが対応して存在している
この部分は意味不明なので聞かなかったことにしておく >>831
テンプレートにしておいて SFINAE で分岐するという方法はとれるが……。 C言語ってこんなので就職できるらしい…
【企業】「”C言語…?どこかで見た”程度でOK」 名古屋のアテック、求人広告が話題に エンジニアの人材不足、面白求人でカバーできる?
https://asahi.5ch.net/test/read.cgi/newsplus/1522229305/
本物のC++プログラマーを募集してる某社とはえらい違いだな >>843
言語ヲタなんてプロジェクトに一人いれば十分だし
兵隊は言語の知識よりコミュニケーション能力、報連相、Excel方眼紙スキルが大事よ 上司なんか関係ないやろ
お客さんを味方に付けることや 上司も客も関係無いよバカども
プログラミングの話だバカども visualstudio2017 Win32アプリケーションでSQLiteを使いたいのですが
Nugetにそれらしきものが合ったのでインストールしようとしたのですが以下のエラーでインストールできません。
https://www.nuget.org/packages/SQLite/
パッケージ 'SQLite 3.13.0' をインストールできませんでした。このパッケージを 'native,Version=v0.0' を対象とするプロジェクトにインストールしようとしていますが、
そのフレームワークと互換性があるアセンブリ参照またはコンテンツ ファイルがパッケージに含まれていません。
どうすればよいのでしょうか。 CoAppのタイムスタンプ調べてみて。
NuGetは捨てろ。 代わりに何を使うか。
VCPKG。
ただし、MSは三年後にVCPKGも捨てているだろう。
逆に我々がVSを捨てる時期に来ている。 MSの方針としてC++を捨ててC#に移行させるというのがあって、C++ユーザーはあの手この手で改宗を迫られる。
もはやVSでC++は苦行。
というか、WindowsでC++が苦行。 C++を捨ててC#に移行するか、Windowsを捨ててOSXかLinuxに移行するか。
二択。
WindowsではC#が正解。
なぜならMSがそれを望んでいるから。 C++のチームも頑張って更新してるけどな
IDEとコンパイラは十分なのに
・パッケージマネージャーがクソ
・再起動しないとPATHが更新されない
・VSのプロジェクトが用意されていないとビルドが面倒
と環境が整備されてなさすぎる C# + C++/CLI + C++
という選択肢 我々が間違っている公算も高い。
我々はC++を使いこなせる。
だから、C++なら簡単にできるのになぜそうしない?と思ってしまうが、これから学ぶならC#のほうが簡単だろう。
MSがC#を推すのは正しいのかもしれない。 C#はビジネス用だから
より早く大量にコードを生産することを目的としているからC++とは用途が違う Android でも iPhone でも Windows でも使える共通部分のコードは c++ で、
ってのを C# に変えたいのかもしれんが
別段 c++ で不自由ないしなあ…
てか c# って .Net のイメージ強すぎて単体で使える気がまるでしない 未だにproperty実装出来ていないC++標準仕様が異常なんだぜ
そりゃMSも堪忍の尾が切れるってもんだぜ ら、ライブラリで実装できるから・・・。
ちなみに、プロパティっぽい提案は過去出てるが、全くテーブルに乗らない。 C#はいい言語だよ
Linq便利だし
ただC++とは用途が違うってだけ 何度聞いてもプロパティが欲しいという思いが沸かないんだが ウィンドーズホンでネイティブC++とC++/CXの間を取り持つwrapperを書くのに使う
Wrapperを書くのに便利 プロパティが使えたらMFCのような糞環境でUpdateDataを使わなくてよくなる
プロパティに代入で表示が変わり
プロパティからそのまま値が取り出せる しかしVisual Studioは何だってUTF-8で保存されるのをそんなに嫌うんだろうか。
あの手この手でUTF-8で保存するのを妨害してくるけど。 VSで開発してLinuxに移植されるのを嫌がってるんだろうかね。
その割にはgdbと接続できるようにしてるし。 >>869
ナイナイ
今だって setFoo() だの getFoo() だの実装すりゃできるけど初学者以外はやらないだろ?
実装するにも使うにも効率が悪いからね。 >>869
それはsetter/getterではできないことなんだな? a.Hoge+=100;
みたいな事をできて便利だなと思うことはあるけど無けりゃないでいいわレベル プロパティはメソッドともフィールドとも区別できるメタデータとしての活用が唯一の動機なんだが
結局のところ実行時の型システムまで整備しないととただの構文糖だしなあ >>873
A.Width+=20;
と
A.setWidth(A.getWidth()+20);
どっちがいい?; a.value++とかif(a.Width==100)とか
普通に書けるものをわざわざgetter setter書きたいんだな
変ってる UI とのバインディングを失笑されたら
シンタックスシュガーでこんなに楽にかける!と主張し始めたよw
そりゃ楽にかけて便利だよな。
そのためのものだもの。そこは同意する GUIだけじゃなくて他にも使えるというか
他がメイン >>878
そういう風にお手軽にメンバを書き換えるのは事故のもとなのでやめましょうってことでめんどくさくしたのに
戦争を知らない世代みたいな
現状でもa.value()++とかif(a.Width()==100)でできるしな
これまでのコードとの一貫性を破壊してなおかつ年代物のコンパイラに更に複雑なパースをさせて得られるものがちょっと括弧を省略するだけとは プロパティのメリットは最初publicで適当に実装しといても後からgetter/setter付きのprivateに変えれる所じゃない? 変数がない状態でもテストに通るように作るべきだからpublicで変数を持たせる機会が一瞬もない ■ このスレッドは過去ログ倉庫に格納されています