C++相談室 part133
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part132
http://mevius.5ch.net/test/read.cgi/tech/1507561894/
このスレもよろしくね。
【初心者歓迎】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
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured これまでinlineを関数に適用するとインライン展開されるんじゃなかったでしたっけ?
c++17の説明を読むと翻訳単位で共通のアドレスになるって書いてあるのだけど仕様が変わった? 何を言っているんだお前は
ISO/IEC 14882:1998 7.1.2/p4
An inline function with external linkage shall have the same address in all translation units 以前void f(A &a, int num)をa.f(num)みたいに呼べる機能が追加されるとかされないとかを見た気がするんだけど知ってる人いたらURLか機能名を教えてほしい ウニファイドコールシンタックスは死んだのだ。
よみがえれ! accelerated c++ をやっている人いませんか?
今やりなおしているけれども、5年ほど前の自分の回答をなくしてしまった…
4章章末練習問題4-6の回答を、よろしければお見せいただけませんか?
この章、EOLine と EOFile を std::cin の eof フラグ 1 個でなんとかしようとしているのが非常にまずいと分かりましたが
逆に教科書掲載のプログラムでうまくいっているのが不思議です…取り組まれた方のコメントをお待ちしています…
普通 getline() をつかうんだろうけれども、なんでこんなに変てこな実装になっているのだろう?
教科書の内容 https://ideone.com/rdtZWG
>>44-45 悪書を薦めてしまいました、ごめんなさい >>289
メソッドチェインしたいだけなら拡張メソッドの方が筋がいいだろ。そっち応援してやれよ 拡張メソッドってデコレータパターンで充分なのに、なんで最近の言語には結構ついてんだろ。 >>292
>>44-45
結局のところ、std::stringstream を使うべきだという結論になりました。(std::stringstream は今回初めて知った)
教科書本文(64ページ、項4.2.3、70ページ、項4.5)
https://ideone.com/F761bo
73ページの練習問題4-5の方は
https://ideone.com/H9iE4j
このように >>42 は多大な努力を強いられる教科書ですので、お勧めです、強くなりたい人はどうぞ
私はもう強くなくてもいいから、この本はもういいです…
教科書をお持ちでない人には関係ない話ですみません >>285
別に驚くほどのことじゃないし…
関数のインライン展開と、同じ機能の非インライン関数の存在は両立する
>>284の規定は関数のアドレスをとられたときのため用 >>151
template の話もお願いしていいですか?
型安全を優先するあまりに instantiate(これいい訳がないね) してまで、という思考と void * を許してしまう思考の両方について、比較していただくとうれしいんですけれども >>168
std::make_shared はあっても unique 版はない、とかなんとか、そこらへんが徹底されていない、とか、確かあったような気が >>150-152
ファイルのopen/close とか、RAII /デストラクタが Java にもあればなあ、と思っています。
あと、Java の syncronized って、結局、テキトーなダミー変数を mutex 代わりにしちゃう、とかありません? >>115
古来ゆかしき Boehm GC を思い出しました。これ、C++11 later とかの対応はどうなんだろう?
http://www.hboehm.info/gc/ よくわからん… >>101
>K&Rも「関数ポインタも使えるよ」としか書いて無い。あれはもっと力説されて然るべきだった。
これが本題かな?
いや、関数ポインタってそんなに特筆すべきものだったかな…むしろ setjmp()/longjmp() の方がインパクトが、ってこれはexception として広く採用されていましたっけね
いや、関数ポインタってコールバック(とvtable)は別として、何か使えるネタが他にあるかなって考えてました、今のところ思いつかないな… >>99
>(instance.method()とstaticMethod(instance)の実行時の違いがほぼ無い、
うーん、Java で、これでもか、これでもか、と this が null でないことをチェックするのを読んだことがあります。
C++ だと(virtual でなければ)普通に this = 0 にして this->method() できちゃうんですが、この this の null チェックって、広く行われているのでしょうか?http://codepad.org/gtEBWFKR これでおしまい
try〜catch はいいとして、finally って使いにくい、というか使い方がわからないんですが、finally って意味あるんでしょうか? > RAII /デストラクタが Java にもあればなあ、と思っています
RAIIは7年前にジャバに入った筈だが
何を言っているのだろうか >>305
C++ 的にはなるべくデストラクタで後始末がつくようにやれというスタンスっぽい >>304
C++ ではヌルポインタからメンバ関数を呼び出すのは未定義だよ。
メンバ関数内でデータメンバにアクセスする要素がなかったとしても未定義。 this->method()は(*this).method()と等価で、ぬるぽに*適用したらその時点で未定義だからアウト 未定義だけどvirtualじゃなきゃ大抵動く
だからNULLチェックも意味がある thisをNULLチェックするようになったらそれはもう終わってるコード >>305
catchの中で再スローしてもとにかくリソースを解放したいとか普通にあるでしょ >>315
RAIIを徹底すればそんな危なっかしいことは不要 >>309
自分にレスすんなよ
見てて恥ずかしいだろ >>300
std::make_uniqueがあるだろうが(C++14) 返答を期待しないでただ聞いて文句言ってもらいたんですけど
03以来久し振りにc++いじってます
17だか20の最新仕様も未だにclassでgetter/setter定義しなきゃいけない仕様なんですかね?
C#のpropertyがあれば便利と思うんですけど。今あるか知りませんが
どうなんでしょ?今後の仕様も導入予定なし?
おやすみなさい >>311
いや、俺は意図通りに動かない場合にガチで遭遇したことあるからこれはホントにお勧めしない。 >>320
そもそも、せったげったってそんなに重要か? 一応 >>324 を解説しておくと、 this が真のときはもちろん真だし、
this が偽 (ヌル) のときは未定義なのでどういう挙動をしてもかまわないので真と解釈してもええやろという超推論で常に真として扱われる。 できないよ
thisは常にconst修飾されている
禿本1stではthisへの代入があったんだけどね >thisは常にconst修飾されている
それは規格のどこに書いてあるのですか >>329
ご指摘どうも
struct X
{
void f()
{
decltype(auto) that(this);
that = nullptr; //ok
}
void g()
{
X* const it(nullptr);
decltype(auto) that(it);
that = nullptr; //error
}
};
確かにそのようで void f() constのことを言っているなら見当違いだが *thisじゃなくてthisのことだよね?
何かで「const pointerである」って読んだことあるような気もするけど、
そもそもprvalueにしか思えない。 this = だの &this なんてことは考えもしないので気がつかなかった =0とかじゃなくてpureとかそのまま書ければいいのに
そもそもなんで0入れるんだ vtblの関数ポインタをNULLにセットするっていうK&R時代の発想で決まった文法 独自拡張で0の代わりに関数ポインタ代入できるようにした糞コンパイラと
それ使ってイベントハンドラかなんかの設定するようになってる糞システムが
なんかあったような気がするけど誰か覚えてない? >>340
実際には存在し得ない抽象クラス単体オブジェクトが指すためのvtableな
bcc32のバグで存在し得たことはあるが =0、漏れはしゅき!!!!1!!!!!11!
キーワードを増やさなくて済む
切り札は最後までとっておくべきものじゃ つかpureみたいな柔弱で恥ずかしい感じのキーワードを追加してくれなくて本当に良かった C++98だかでポインタ値にNULLじゃなくて0を使うのが推奨されていた頃の名残じゃないかな
の割にはnullptrを指定するとエラーになるけど 文脈依存キーワードを導入しちゃったからな。
pure も有りといえば有りな気はしないでもない。 pure関数って状態を持たない関数であって純粋仮想関数とは別物だぞ >>347
標準委員の人がそういう意味じゃないよ。適当に決められたんだよ。って言ってた。 >>349
この話の流れで virtual pure function でないと思ってるお前が不憫だよ... =0は最初ボーランドが勝手に実装した、とどこかで読んだが
じゃあ=0より前のC++には純粋仮想関数は無かったのやろうか… ていうか
class Foo {
public:
void someMethod() { }
};
と書くしかなかったものが
class Foo {
public:
void someMethod() = 0;
};
になったのだとしたら
文字数的にもバランスがとれた良い追加構文 >>353
そこは俺もそう思う
しかし=0;なのにvirtualが必須なのはイヤ
基底指定子にpublicがいちいち必要なのと同じくらいに >>351
pure virtualだろ?virtual pureってなんだよ >>357
すまん、そんなアホなところにまで突っ込まないとダメなほど必死だとは思わなかったよ w 必死なのはお前だろ
誰と同一人物だと思ったんだw
俺この話に参加したの初めてだぞ ていうか>>349は>>345宛てじゃねーの?
それを踏まえて文脈依存うんぬんだと思うが 質問があります。
コンパイラはMicrosoft(R) C/C++ Optimizing Compiler Version 19.12.25830.2 for x86
class A {
public:
explicit A( void ) {}
};
struct B {
A a;
};
int
main( int, char ** )
{
B b;
B b2( {} );
B b3 = {};
B b4{};
return 0;
}
上記のソースをオプション/std:c++latestを付けるとエラー、つけないとエラー無しになります。
対処だけだったらAのコンストラクタからexplicitを取れば良いのですが、
何故エラーになるのかがイマイチ理解できていません。
C++17の波括弧初期化の型推論の新規則あたりがそれっぽいですがその辺を読んでも理解できていません。
(そもそも引数無しのコンストラクタにexplicitを何故付けるのかって突っ込まれそう) 前にgetter/setterプロパティ書いた者だす
getter/setterは有効な回答得られず
03→17/20でも、例えば
int& Status() { return m_status; }
const int& Status() { return m_status; } const
の二重定義必要?
おやすみなさい そんな糞みたいなgetter書くくらいならpublic変数にしたほうがまし >>360
5chは初めてか?
ちょっと肩の力抜けよ hage.sizeof みたいな書き方があってもいいけど、別になくてもいいからな
話は上がっているんだろうけど、優先順位はかなり低いと思うね >>366
constバージョンだけでよくない?
何で内部状態を他人に書き換え許可するのさ。 >>367
>>366のgetter/setterの中身はあくまでサンプルなのでは…
>>373
いちいちメソッド呼び出しの度に状態を引数渡しするほうが内部状態の露出として醜悪かもしれん…
つかデータメンバの書き換えはデータメンバの書き換えだからNGというものではなくて、
内部状態の整合性が保たれれば何だって良いんじゃ…
データメンバ直書き換えでなくsetterなら整合性をチェックしたり与えたりするチャンスがある
(あるいは排他制御とかやることもある…まあ慎重に考えたらsetterでやるよりロック回数が少ない方法がたいてい見つかるが、 アンカーミスった、
誤: >>373
正: >>372 >>366 の実装はサンプルにしてもありえないだろう。
一度呼ばれて参照を保存されたら、変更を制御できなくなる。
int& status = a.Status();
status = 2; >>377
それな。
中身だけでなく外見(インターフェース)も糞。かつそのインターフェースなら例外なく中身も糞になる ここでgetter/setter言ってるのは例外なくどうしようもない低能だから無視してあげて下さい int mydata() const; // getter
void mydata(int data); // setter
こういう感じの下駄瀬田は道南? >>366のgetterの&を見落としていたorz
m_dataへのmutableなポインタを返すのではm_dataのgetterとは言えぬ メンバ変数hogeにgetHoge,setHogeなんて名前の下駄雪駄を
機械的に作ろうとしてる事自体が間違いの可能性を考えろ
class Window
{
int width, height;
...
//まちがい
int getWidth() const;
int getHeight() const;
void setWidth(int w);
void setHeight(int h);
//せいかい
Size getCurrentFrameSize() const;
void resize(int width, int height);
}; ■ このスレッドは過去ログ倉庫に格納されています