, '´ _. -‐'''"二ニニ=-`ヽ、 / /:::::; -‐''" `ーノ / /:::::/ \ / /::::::/ | | | | | |:::::/ / | | | | | | | |::/ / / | | || | | ,ハ .| ,ハ| | |/ / / /| ,ハノ| /|ノレ,ニ|ル' | | | / / レ',二、レ′ ,ィイ|゙/ 私は只の数ヲタなんかとは付き合わないわ。 . | \ ∠イ ,イイ| ,`-' | 頭が良くて数学が出来てかっこいい人。それが必要条件よ。 | l^,人| ` `-' ゝ | さらに Ann.of Math に論文書けば十分条件にもなるわよ。 | ` -'\ ー' 人 一番嫌いなのは論文数を増やすためにくだらない論文を書いて | /(l __/ ヽ、 良い論文の出版を遅らせるお馬鹿な人。 | (:::::`‐-、__ |::::`、 ヒニニヽ、 あなたの論文が Ann of Math に accept される確率は? | / `‐-、::::::::::`‐-、::::\ /,ニニ、\ それとも最近は Inv. Math. の方が上かしら? | |::::::::::::::::::|` -、:::::::,ヘ ̄|'、 ヒニ二、 \ . | /::::::::::::::::::|::::::::\/:::O`、::\ | '、 \ | /:::::::::::::::::::/:::::::::::::::::::::::::::::'、::::\ノ ヽ、 | | |:::::/:::::::::/:::::::::::::::::::::::::::::::::::'、',::::'、 /:\__/‐、 | |/:::::::::::/::::::::::::::::::::::::::::::::::O::| '、::| く::::::::::::: ̄| | /_..-'´ ̄`ー-、:::::::::::::::::::::::::::::::::::|/:/`‐'::\;;;;;;;_| | |/::::::::::::::::::::::\:::::::::::::::::::::::::::::|::/::::|::::/:::::::::::/ | /:::::::::::::::::::::::::::::::::|:::::::::::::::::::::O::|::|::::::|:::::::::::::::/
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
>#include <stdafx.h> 大丈夫か…
C++11とか覚えるのしんどいから3行にまとめてほしい(´・ω・`)
A a(1); a = A(2); としたとき、2行目で、1行目で生成されたインスタンスは消滅すると思いますが、 デストラクタは実行されないようです。 実行されるにはどうしたらいいでしょうか?
代入だからインスタンスaのデストラクタは実行されないよ。 二行目の「A(2)」は、ステートメントの最後でデストラクタが実行されるけど。
オペレーター=のオーバーロード
>>12 新しい文法とライブラリ。autoの変更がかなり面白い。
ラムダで広がる関数周り。関数ポインタにもできなく無いらしい。
コンパイラさんの対応にあと5年はかかるかも。
>>13 2行目で生成されたテンポラリオブジェクト A(2) は消滅するけど
1行目で生成されたインスタンス a はそのままだよ
>>16 関数ポインタにできるのは引数なしのやつだけかな
引数じゃなくて変数キャプチャの有無だろ
20 :
13 :2012/06/30(土) 20:25:10.61
a = A(2);によって、aの中身はA(2)になっているので、 aが消滅するときのデストラクタはA(2)のものです。 だから、Aの中で動的に領域をとっていると、 解放されないままになってしまいます。 newを使わないインスタンス作成をできなくしたり、 代入を禁止したりはできないでしょうか? Aにoperator=を作るのが正当な解決策でしょうか?
>a = A(2);によって、aの中身はA(2)になっているので、 間違い。aの中身はA(2)のコピー。 C#かJavaから来た人かな?
>>20 コピーと代入を禁止するにはprivateで宣言しておけばいい
何も宣言しないとデフォルトの定義が作られるから代入出来てしまう
private:
A(const A&);
A& operator=(const A&);
24 :
13 :2012/06/30(土) 20:33:52.52
Clang++です。
25 :
13 :2012/06/30(土) 20:41:30.84
24は偽物です。Javaから来ました。 C++は難しいですが、いろいろ試してみます。 ありがとうございました。
26 :
13 :2012/06/30(土) 20:55:32.15
>>22 さん、ありがとうございます。
~A1 が表示されてほしいんですが、
代入ではデストラクタが実行されないようなので、
無理ですね。
そもそもどうやってどちらのデストラクタが実行されたかを確認してるかからして怪しい
むしろ代入の取り扱いに関してはJavaやC#の方が難しいと思うんだけどね。 C++はCやBASIC、FORTRANなどと同じ、コピーが基本。 負荷は大きいけど、考えることは少ない。 一方、Javaは参照が基本。負荷は小さいけど、いつ複製が必要になるかについて注意が必要。 …みたいなことが、確かJ++セルフマスターブックとかいう本を読んだ時書いてあったなぁ。 J++って、いつの本だよ^q^
C++でもポインタ持ってる場合は微妙だが、 そういう時はコピーを禁止する事も可能ではあるね
>13 デストラクタは「中身」の値ではなく、「入れ物」である変数が破棄されるタイミングで呼ばれる。 a = A(2); は入れ物ではなく、中身が変わっているだけだからデストラクタは呼ばれない。 理解を深めてもらうために付け加えると、 new 、delete とも「入れ物」を作ったり消しているだけで 「中身」そのものは弄ってませんよね。(中身も一緒に消えますが) >20の問題を解決したいのであれば、「中身」が変わるタイミングで破棄する必要がある。 具体的に言うと>15で上がっている operator= と、コピーコンストラクタををオーバーロードするのが正解。
33 :
デフォルトの名無しさん :2012/07/01(日) 17:57:54.71
代入したときに自動的にコンストラクタが呼ばれるように するにはどうしたらいいでしょうか クラスHogeにはメンバ int kazu と string moji がいて Hoge a = 1; のときは new Hoge(1) が Hoge a = "unko"; のときは new Hoge("unko"); が呼ばれるような感じがいいんだけど
つ[変換コンストラクタ]
37 :
デフォルトの名無しさん :2012/07/01(日) 19:25:49.03
cout << a << endl; ってやるとき、 a は何にキャストされようとしているの?
>>37 cout自体がoperator <<(int Value)とかのオーバーロードを持ってるから、オーバーロード検索でマッチする型を使う。
STLにバリアント型ってあるってマジ?
>>39 まだないんじゃね?
BoostにあるAnyっていうライブラリがそれだと思う。
あるよ
ないあるよ
class A { public: template<int i> int get() const { return i; } template<> int get<0>() const { return 1; } }; みたいなことをやりたいのですが、メンバ関数テンプレートで定数による特殊化はできないのでしょうか?
Template ClassだったらDmyのTemplateパラ入れてむりやり突っ込めるけど C++11より前だと関数の部分特殊化は無理だからねぇ
アルファベット禁止な
下げれないじゃないか。
class A{ template<int I,int D=0>struct getobj{operator int()const{return I;}}; template<int D>struct getobj<0,D>{operator int()const{return 1;}}; template<int I>const getobj<I>get(){return getobj<I>();} }; だな。
>>50 変換関数を使う手もあるな
型が曖昧だと無視されたりするから素直じゃない所があるけど
54 :
デフォルトの名無しさん :2012/07/02(月) 12:53:50.79
typedefは別の名前を与えるそうです。 例) typedef void v; これでvと書けばvoidの意味になります。 それではこれはどうでしょう? typedef void (*SIG_TYPE) (int); 何に対してどういう名前を与えたのですか?
intを引き数に取る戻り値のない関数へのポインタであるSIG_TYPE型の宣言。
>>55 ありがごうございます。
じゃぁ voidに(*SIG_TYPE)(int)という名前を付ける事は出来ないんですね。
そもそも名前に()が入っちゃダメだからそういう心配は要らなさそうですね。
>>56 形としては、変数宣言と同じだと思っていいよ。
>>57 ですよね。ありがとうございます。
なんかトークンを置き換えるみたいなイメージがありました…。
それはマクロで。
60 :
デフォルトの名無しさん :2012/07/02(月) 22:35:54.13
インターフェースクラスって、コンストラクタどうすんの? 書かなくてもいいの? 書いてもすること無いけどさ
いらないだろ
書いたところで、どうせ他に純粋仮想関数があるだろうからインスタンスは作れない
HogeAやHogeBはクラスHogeのサブクラスです。 ストリームを読んで、Aって文字列が来たらクラスHogeAの Bって文字列が来たらクラスHogeBのオブジェクトをnewして 配列hogelistにどんどん追加していく処理をするとき、
(続き) 鼻から悪魔を出すにはどうしたら良いでしょうか
65 :
63 :2012/07/03(火) 01:05:46.85
(続き) 普通はファクトリークラスHogeFactoryとかを作ると思うんですが、 ユーザがHogeの派生がどんどん増やしたときにHogeFactoryを 直接いじらせず、継承させて生産ラインを追加させたいときは どうしたらかっこういいでしょうか
std::map<std::string, ExampleFactory*> factorys; factorys[ "A" ] = new Factory<ExampleA>(); factorys[ "B" ] = new Factory<ExampleB>(); if( factorys.end() != factorys.find( key ) ) { Example *examle = factorys[ key ]->New(); }
>>66 あー、なるほど
これいいかもですね
ありがとうございます
68 :
デフォルトの名無しさん :2012/07/03(火) 13:06:11.88
AndroidNDKでSJISの文書をUTF8に変換する処理を書いているのですが、 環境が違うせいでNDKで動く処理が作れません。 ICU、iconvはコンパイルがうまくいかない。 babelは変換処理が正しく動かない。 マルチバイト確認や変換する関数はNDKでは使えないという感じで、 文字コードをうまく変換するいい手段は無いでしょうか?
vector<Unko> unkolist; を削除するとき、全要素についてdeleteしたいとき どうしたらいいの?
unkolist.clear();
>>72 clear() を呼ぶと、ついでにUnkoのデストラクタも呼ばれるの?
当たり前だろ
下品なネーミングはやめてください。
そしてポインターを格納してメモリーリーク
unkolist.swap(vector<Unko>());
std::vector<manko> mankoList
Javaから来たものです。 将棋のAIを作っていたのですが、速度の壁に阻まれ、いろいろアルゴリズムを変えて3割ほど速度アップに成功しましたが、目標タイムには到達しえませんでした。 限界を感じてC++はどうかと考えたのですが、Java→C++で速度アップは図れるものでしょうか。 主な処理は配列の個々の値計算、オブジェクトの生成・消滅がわりと頻繁にでてくるプログラムです。
早くなるよー。配列の演算はあんまり大差ないだろうけど、消費メモリが劇的に減るからその点は有利か。 オブジェクトの生成・破棄は爆発的に早くなる。 …そのかわり、全部自分でコントロールしなくちゃいけないけどねー。
速度アップは図れるけど 一番クリティカルなのは言語よりアルゴリズム
>>83 そのアルゴリズム内でガーベージコレクタを動かす部分があって、
更にC++の素朴なスコープ或いは参照カウンタ方式でメモリ管理を置き換えできれば確かに速くなるから
半分正解で半分間違い。
まぁ具体的な実装を見てみないとなんとも言えませんな。
>>82-84 C++でチャレンジしようと思えるようになりました、ありがとうございます!
チャレンジする前に、具体的な実装を詳しい人に見せて本当にGCがネックになっているかどうかを教えてもらったほうが良い。 webだと気軽に匿名でソース公開する訳にもいかんだろうし。
full gc頻発でも無い限り今のgcがボトルネックにはならんだろ -serverオプション含めJIT周りの方が影響でかい
初心者ながらの質問ですいません ベクトルにnewしたインスタンスを入れたいんですが入れたものを削除するプログラムっていうのはvectorにインスタンス自体じゃなくてポインタを入れればいいんでしょうか
日本語かコードで書いてくれ
もしかして: std::shared_ptr
boost::ptr_vectorか VC++10でstd::vector<std::unique_ptr>を使うと幸せになれる
ありがとうございます 糸口をつかめました 感謝します
std::shared_ptr ってg++でも使えんの? 4.4系なんだけど
処理系依存の話は処理系依存スレへ。
あー・・・ ごめんなさい
規格の話が処理系依存になったでござるの巻
g++は規格だそうです
std::shared_ptrは規格で 規格準拠率の話をしてただけじゃん?
規格準拠率は処理系に依るじゃん?
101 :
デフォルトの名無しさん :2012/07/05(木) 10:48:47.52
コンパイラの名前が出ただけで処理系依存かよ わからんなら黙ってろ
お前が黙ってろ
はい!
>>100 処理系依存は言語仕様の話なので、その"処理系に依る"話とは関係無いと思う。
処理系に固有の話はその処理系のスレへ。 g++ 4.4でstd::shared_ptrが使えるかどうかの記述は、C++の規格にありません。 でも、これぐらいいいじゃない馬鹿!
コンパイラまではOKだろ。
107 :
デフォルトの名無しさん :2012/07/05(木) 15:52:03.75
そもそも処理系依存という言葉遣いからおかしい implementation-defined なら well-formed だろうが
ふひひ
Aを継承してB、Bを継承してC を作ったとき Aに virtual な関数を作って、Cでその関数を定義するとき Bにも空でもいいから関数を書かないとだめなの?
110 :
デフォルトの名無しさん :2012/07/05(木) 18:46:01.69
やってみりゃわかるだろ それとも規格票の箇条でそう読めてしまうところでもあったのか?
>>110 やってみたらなんか書かないとダメだったんだけど、
そんなわけないよなーと思って聞いてみた
やっぱ飛ばして継承出来るハズだよね
おれのバグとわかってスッキリしたわ直す
純粋仮想関数なら何か書かないとBのインスタンスは作れない また継承するのならいいが
継承したとき、自動的に規定クラスの同じメソッドも 呼ばれるようにしたいときは どうすればいいのかね 呼ばせるのを義務付ける方法とかでもいいや
基底側から継承側を呼べばいいのです。 class B{ private: virtual void foo_impl( ) = 0; public: void foo(){ /*code*/ foo_impl( ); /*code*/ } }; class D{ private: void foo_impl() /*override*/ { /* code_here */ } };
わかれ
わかめ
継承先ではfooの代わりにfoo_implをオーバーライドしろてこと? 呼ぶときはfoo()でいいの? どんどん継承したときはどうなるんだこれ
あいわなケイオス!
(」・ω・)」う〜!(/・ω・)/にゃー!
ある構造体のアライメントまで考慮したサイズの取得をするにはどうすればよいですか? 具体的にはwindowsのOPENFILENAME構造体のサイズを64bit環境下でも正しく取得したいです
>>123 アラインメントというのは、構造体の先頭の場所のことなのか、要素の整列のことなのか・・・。
addressOfっていうマクロが世の中にはあるんだけどそれを使えば、要素のアライン状況はわかるよ。
addressOf(LastElement)+sizeof(LastElement);
でわかるかも??
何かsizeofを使用しない宗教的理由があるのでしょうか?
>>125 sizeofですむんだったらソッチのほうがいいよな。
今の場合要素の整列です addressOf(LastElement) - addressOf(FirstElement) + sizeof(LastElement)ですかね?
>>125 sizeofだと各要素のサイズの単なる合計が返ってきているように思えますが
なにかアライメントまで考慮させる方法ってありますかね?
標準入力を全部string hoge に入れたいんだけど どうしたら簡単?
getlineでデリミタを指定しなければ改行無視できるのか やってみる
>>130 こんな方法があるんですね、そして大変なことがわかりました
構造体の要素は別にアライメントされていませんでした・・・orz
OPENFILENAMEには自身のサイズを格納させる場所があるんですが、
じゃあいったい何を格納すれば動いてくれるんですか・・・またお世話になるかもしれません
ありがとうございました
>>133 それ、多分sizeofでいいと思うよ。
OPENFILENAME ofn = { sizeof(OPENFILENAME) }; でなんの問題もないだろ
いえ、sizeofではダメなんです 状況は64bit win7で、vc2008のプロジェクト設定で構造体のアライメントを1,2,4,8,16と変えていくと 8,16のみ正常に動作し、ファイルを選択するダイアログが開くのですが 1,2,4の場合ファイルを選択するダイアログが開かず、キャンセルボタンが押されたような返り値が返ってきます サイズを調べてみたところ違っていたのでアライメントまで考慮しなければならないのかと思った次第でした
通常利用でそこまで考慮する必要ってあるかなー。
もしかして、commdlg.h(かwindows.h)取り込まずに自分でOPENFILENAME構造体定義してる?
いえ、windows.hをインクルードしています ググってみると似たような状況が出てきましてやはりアライメントの問題だの 言われていますがほとんどが英語で要領を得ず、です
>>137 そりゃそうだろGetOpenFileNameが期待してる構造体のサイズ以外のサイズを渡してるんだから
commdlg.hからOPENFILENAME構造体を適当にぱくってきて
#pragma packで一時的にアライメントを変更してやればいい
混ざった
The length, in bytes, of the structure. Use sizeof (OPENFILENAME) for this parameter. と書いてあるんだからsizeofでやれ アライメント変更によって型定義を壊してるのに見当違いのことを喚くな
1つの関数が肥大化するとバグの温床になる。 だから最小単位の関数に分割する。 それはいいんだが、今度は関数が増えすぎてその管理が煩雑になりそう。 その対策としてクラスを作り private 静的メンバ関数にするというのは妥当? 例えば、 namespace MyFunctions { template <class T> T func1(T x) { ちゅっちゅー } // 隠したい。 template <class T> T func2(T x) { ちゅっちゅー } // 隠したい。 template <class T> T func(T x) { func1(func2(x)) ちゅっちゅー } // 使ってほしい。 } というのを class MyFunctions { template <class T> static T func1(T x) { ちゅっちゅー } // 隠したい。 template <class T> static T func2(T x) { ちゅっちゅー } // 隠したい。 public: template <class T> static T func(T x) { func1(func2(x)) ちゅっちゅー } // 使ってほしい。 }; とするという対策しか思いつかなかったんだが。 みんなはどうしてる?
クラス作れよ
>>141 64ビット下では8ビット以上のアライメントが当然期待されているってことですかね・・・
とりあえずその案を試させて頂きます
>>143 >アライメント変更によって型定義を壊している
すいません、ここ詳しくお願いできますか?
ポインタなどのサイズがアライメントで変更されうるということでしょうか?
無名とかdetailとかdummyとかtsukaunaとかの名前空間をMyFunctionsの下に作って突っ込む
>146 windows.h とかで構造体が定義されている場合、普通 #pragma pack とかでアラインメントは強制されている。 つまり、「vc2008のプロジェクト設定で構造体のアライメントを1,2,4,8,16と変えて」 sizeof の結果が変わること自体がおかしい。
ヘッダ見るとわかるけどいままで1強制だったのがx64では強制されなくなってるんだよ だからアライメント変更でこういう問題が起きる
ソース内で使うだけならただ単にstaticにすれば隠れる。つまりソース単位の関数になる。
外部に公開するんだったら頑張って管理する。
>>144 そういうのモノステートパターンっていうんじゃないの?
>>149-150 あーものすごく納得しました
重ね重ねありがとうございました、勉強になりました
153 :
151 :2012/07/05(木) 23:36:02.71
154 :
144 :2012/07/05(木) 23:46:09.55
>>151 >>153 ありがとうございます。
とりあえず無名名前空間かモノステートパターンでいこうと思います。
>>149 そもそも処理系依存なpackなんて使うなっつう話だろ
入出力は面倒でもメンバー1個1個指定するか、
配列で一括読み込してキャストしながら読み書きする。
読み書きでメンバーを同じ数並べるのが面倒というなら、
テンプレート使って読み書きを一つにしてやればいい。
arc.Archiving( this->member1 );
arc.Archiving( this->member2, 100 );
// 読み込みの際はarcを読み込みオブジェクトに
// 書き込みの際はarcを書き込みオブジェクトにしてやる
お前は何をいっておるのだ
template <class Type> Type minof(const Type *x, int n){ Type min = x[0]; for(int i=1;i<n;i++) if(min > x[i]) min = x[i]; return min; } template <> const char* minof<const char*>(const char** x,int n){ const char* min = x[0]; for(int i=1;i<n;i++) if(strcmp(min,x[i])>0) min = x[i]; return min; } int main(int argc, char** argv){ char const *s[3]={"ABC","AAA","ADD"}; cout << "sで小さいのは" << minof<const char*>(s,3) << endl; } 配列の全要素の最小値を求める関数テンプレートの作成なのですが、もっとも小さい文字列を求めるための特殊化がうまくいきません エラー: template-id ‘minof<const char*>’ for ‘const char* minof(const char**, int)’ does not match any template declaration とエラーが出て、特殊化部分が標準テンプレートとマッチせずおそらくポインタへのポインタの扱いだと思うのですが どう直せばプログラムが動くでしょうか?
159 :
158 :2012/07/06(金) 08:32:09.81
すいません、自己解決の形になってしまいましたが const char* = int,etc とするために、 template <class Type> Type minof(type *x, int n) とするか、 配列の中身を書き換えたくないという意を保つなら template <> const char* minof<const char*>(const char* const (*x),int n) でやると通りました・・・ constの扱いで頭おかしくなりそうです、これで本当に合っているのか int x[]=const char (*x)[] int x[0]の書き込み禁止=const char (*x)[0]の書き込み禁止 ↓ const int *x = const char* const (*x)でしょうかね
>>159 3じゃなく、sizeof()を使った方が良くない?
>>160 関数呼び出し部は確かにそうしたほうが良いですね
忠告ありがとうございます
>>158 ,159
素直にmin_element使え
#include <cstring>
#include <algorithm>
#include <iostream>
bool less_str(char const * p1, char const * p2)
{
return std::strcmp(p1, p2) < 0;
}
int main(int argc, char** argv){
using namespace std;
char const *s[3]={"ABC","AAA","ADD"};
cout << "sで小さいのは" << *min_element(&s[0], &s[3], less_str) << endl;
}
こんばんは。 私は19歳の女子大生です。 クラスAと、それを継承したB があります。 A *a = new B; としたときに、 *aに格納されているのが AなのかBなのかを gdbで確認したいのですが、どうしたら型情報を見れるでしょうか。 ptype(*a) としても、出力されるのは A の構造になってしまいます。
女子高生なら手取り足取り教えるのに
女子高生ですが質問です。 class A{ private: B b; public: A(B b){ this->b = b;} } コンストラクタであるオブジェクトのコピーをフィールドに入れたいのですがこれであっていますか。 ちなみに参照ではなくコピーをいれたいのです。
あってます
すいませんフィールドじゃなくメンバ変数です。 Javaの癖でついフィールドと書いてしまいました
4年ほど前なら女子大生といえばVB6.0だったんだが、 実際のとこ今はどうなんかね。後輩がWeb系行ってStrutsなんて ダイッキライ!っていってたけど、相変わらずOOとは縁遠い言語ならっとんのかなぁ。
普通の女子大生がプログラムなんか勉強する訳がない! ラノベのタイトルみたいだな
女はウンコしない的発想だな
工学部だが9割男子だっぺよ
女子だって半田付けするもん
工学部にくる女子は男好きだっぺよ
クラス型の関数を作成したとき、関数内で生成したオブジェクトをそのまま返して大丈夫でしょうか。 調べたところ、オブジェクトのコピーが返されて関数にあったオブジェクトは破棄されるらしいのですが、パフォーマンス的にもっと優れた方法はないでしょうか
#include <iostream> #include <typeinfo> class A { int a; public: A(int i) : a(i) {} virtual void print() const { std::cout << a << std::endl; std::cout << typeid(*this).name() << std::endl; } }; class B : public A { int a; public: B(int i) : a(i), A(0) {} void print() const { std::cout << a << std::endl; std::cout << typeid(*this).name() << std::endl; } }; int main() { A* a = new B(100); a->print(); }
>>175 Factoryとかで生成したオブジェクトのポインタならいいっぺよ
ただしスマポに包んでおかないとdeleteする責任の所在があやふやになるっぺ
>>177 なるほど、そのようにするとパフォーマンスに優れますね。
ありがとうございます!
gdbってtypeinfoに対応してたっけ?
え、してたっけ?昔使って期待通りの結果が得られなかったから使い物にならなかった記憶が。
gdbがよく分からないので
>>176 をEclipse CDTでデバッガに掛けてみた
変数ウィンドゥではBのインスタンスを代入しても型がA*のままだな
右クリックから「型にキャスト」でB*にしたらちゃんと全ての要素が表示された
で、「オリジナル型の復元」でA*に戻る
a->print()で仮想関数が実行されてB::print()の中に入ると変数ウィンドゥ
の型が const B* constに変わりちゃんとBの要素が表示される
これ多分gdbの実行結果と同じだよね
だからポインタの先の実際の型までは表示してなくて、thisに変わった時に
初めて表示されるようだ
大学でプログラミングやってる女なんて 大概商業高校出身だろ
時代は農学部だからな
のうりん!
もやしもん!
>>163 Aが仮想関数を持っているなら
(gdb) set print object on
して
(gdb) whatis a
や
(gdb) ptype a
でわかる
リテラル文字列の文字コードはソースコードを保存したときの文字コードですか? // hoge.cpp (UTF-8Nで保存) int main(void) { puts("日本語の文字列"); // <-これはUTF-8N? return 0; }
void main() って、今でもダメですか?
implementation-definedという意味ではあり
>>191 そのプログラムが終了コードに何を返すか分かるか?
>>194 どうしてそういう持ってまわった言い方をするの?
直接的な表現が宗教的な理由でできないの?
不定な値を返すだけで、なんの問題ないじゃん
シェルやmake内で使い辛い
ERRORLEVELが不定とか気持ち悪い
エラーレベルとかダサい仕様だよな
同意求められましても
204 :
デフォルトの名無しさん :2012/07/07(土) 19:16:40.82
ダサいのは make 内で使うアプリとは限らないものにまで make の流儀を強制しているいかにもアチラな尊大さだ
1が真で0が偽だから 1が正常終了というのが自然
真偽はちゃんと審議しないとなっ!
>>206 wwwwwwwwwwwwww
お前才能あるwww
真偽中
久々に酷い自演をみた
零か!零かじゃ…?
foreach( list as l ) l->hoge(); みたいに簡潔に書きたい
__foreach(l, list, l->hoge);
for (auto& l : list) l->hoge();
しかしこうみるとJavaってほんと簡潔にかけるよなあ 生産性あがるのも納得だわ
new/deleteないだけで
>>217 途中からC#の尻を追い掛けるようになっちゃってるけどね
>>220 テンプレート様にはおよびもしないがジェネリックがある
ポインタがないのにぬるぽガール
ポインタをうまく隠蔽してるだけだから 中身はポインタだらけだよ GCを実装しているので特別な仕組みになってるけど
C++て難しいですか?
最も難しい
Haskellの方が難しいよ
俺は型の概念で挫折した 今もHSPしかやってない このスレはひやかしに来るだけ
C++の非テンプレートなクラスをCで使えるようにラップしてっていわれたんですけどCでクラスなんて使えるんですか?
C++で function(C++クラスのインスタンスへのポインタ, functionの引数) みたいなラッパー関数書きまくって頑張りなさい
で、そのクラスはstdcall APIをwrapしたユーティリティクラスと
231 :
228 :2012/07/08(日) 16:19:34.46
すいません自己解決しました
C++なんでこんなにかわいいの
俺の嫁だからに決まってんだろ
>>223 ハンドルをポインター言い始めたら関接参照全部がポインターになるだろうが。
ポインターよりチワワ
参照ってポインタの名前変えてるだけだと思ってた
小粒でもピリリと辛いと思ってた
参照の実現の仕方は規格で規定されてないけど大抵ポインタと同じ でも保証はないよ
参照は小粒でもぴりりと辛い
new が全くないプログラム作った場合メモリ管理は気にしなくても大丈夫ですか?
>>244 ゴミカスのお前が作る規模のゴミカスプログラムならそんなことは考えなくていい
>>244 newと同じ類のもの、mallocとかVirtualAlloc(windows)とかも使ってなければね。
でもopenしたファイルなどの「解放が必要なもの」はメモリと同じく注意する必要があるし
例外の絡みもあるので、基本的にC++ではRAIIという概念で管理する。
メモリもリソースも全部RAIIで扱えば楽だよ。
要はコンストラクタでopen(new)してデストラクタでclose(delete)する。
>>248 RAII初めて知りました
ありがとうございます!
ファイルをRAIIしたら最悪首くくる羽目になるよ
お前だけ
Ruby on RAll
るびーおんらいるる
ファイルをRAIIして首くくる奴はRAIIしなくても同じことになる
RAIIは理想であるが現実的には解放処理にエラー処理が含まれるリソースだらけだからRAIIは無力
お前がRAIIを分かってないだけ
解放処理にエラー処理が含まれる→RAIIは無力 こんな思考じゃ首くくる羽目になるのも当然だな
無力だろ 違うと言うならRAIIで完璧なコード書いてみろや
完璧なコードを書かせるなら無力になるコードを提示すべきかと それぞれどんなコードを見せてくれるのか興味津々
std::ofstream file("test"); file << "test"; 完璧だろ
ファイル書き込みが以外のエラーなんてlog取るか無視して全部握りつぶしでいいからRAIIで十分
解放時のエラーメッセージでも出したいなら デストラクタ前にclose呼べばいいだけだしな RAIIに、デストラクタでしか解放してはいけないなんて制限は無いし
文脈に沿ったエラー処理書いたデリータをもたせればRAIIで完璧だろ
そうそう幾らでもやり方あるのにね
今までRAIIで困ったことは無いけど
>>255 の言うRAIIが無力になるコードを見てみたいな
普通に興味がある
>>265 close()じゃなくてflush()してbad()だろ。
close()で失敗した場合は、close()の後に失敗したエラーを検知できん。
>>236 ポインター以外の関接参照は、アドレスを指してない場合が多い。
参照できるだけで見れば似てるが、委細が大きく違うんで
参照全部を引っ括めて呼ぶんなら間接参照と呼ぶべきだ。
間接参照 ⊇ { ポインター, ハンドル, ディスクリプター, リンク, 他・・・ }
cache = (char*)malloc(cSize); while(true){ size = nextReadSize(); // 何Byteファイルから読み込むか計算する if(cSize > size){ free(cache); cache = (char*)malloc(size); } if(breakCheck()) break; // ファイル読み込みが出来ない場合ループ終了 fread(cache, 1, size, fp); } free(cache); プログラムの中にこんなソース仕込んだら、プログラムがエラー無しでストップするようなエラーが出るようになったんだけど、 これってやっぱりダメなのかな? それともこれとは全く別の所にミスがあってプログラム止まってるのかな?
272 :
271 :2012/07/09(月) 23:36:11.99
すまん。2回目のmalloc後にcSize = size;を入れてくれ
ステップ実行とかさ、ログ吐くとかさ、なんかしようよ
ステップ実行てなんですか?
VC++でデバックモードならブレークポイントでとめたあとF10を押すと1行ずつ実行できる
>プログラムがエラー無しでストップするようなエラーが出る なんだこれ。
>>271 それ、どう考えてもcSize < sizeじゃないのか?
sizeがcSizeを上回ると確実に破綻するぞ。
>>277 スタックオーバーフローとかでよく見るけど、メモリースマッシュかも知れないし、0割かも知れない。
エラーなしでエラーが出るってのが意味わかんね。
エラーがないのがエラー、それがゴールデンエラーレクイエム
なんだその鎮魂歌。 要は、メッセージを伴わないエラーと言いたいのかそうでないのかはっきりしろと。
SIGたんだろ
挽歌
宿題スレの方で書きましたがスレチな気がしたのでこちらで聞かせてください。 スレチでしたら誘導頂けると幸いです。 O表記法についてなのですが、イマイチ理解できていません。 授業にて以下7つのルールを定義されたのですが 各々について具体的な数字の入った例をいただけませんでしょうか #数学の勉強が足りないのかもしれませんが、具体的な数字があれば理解できると認識しています。 #宿題ではないのですが、以降のテストで以下ルールを適用しながらアルゴリズムの証明を行う問題が出題される予定です。 1). if f(n) ∈ O(g(n)) and g(n) ∈ O(h(n)) then f(n) ∈ O(h(n)) 2). if f(n) ∈ O(h(n)) and g(n) ∈ O(h(n)) then f(n) + g(n) ∈ O(h(n)) 3). an^k ∈ O(n^k) 4). n^k ∈ O(n^k+j) for any j 5). if f(n) = cg(n) then f(n) ∈ O(g(n)) 6). loga n ∈ O(logb n) O(logn) 7). loge n ∈ O(loge n) お手数ですがよろしくお願いします。
>>285 どうみても言語スレ向けのネタじゃないだろ。
アルゴリズムスレ辺りじゃねぇの。
>>269 iostreamに限定してねぇよ
リソース一般の話だ
>>269 「close()の後に失敗したエラー」って何?
>>191-192 処理系依存でいろいろ認められるのは戻り値以外の部分。戻り値の型は int じゃないとダメ。
3.6.1 Main function p2
It shall have a return type of type int, but otherwise its type is implementation-defined.
エラー処理まで含めた安全なファイル書き込みのサンプル下さい
>>290 try
{
std::ofstream file(name);
file.exceptions(std::ios::badbit | std::ios::failbit);
file << x;
file.close();
}
catch (...)
{
...;
}
"..." のところは好きにしろ。
ライブラリ実装が例外を通して提供する情報が要求に対して
不足するようなら個別に try するなり各操作の戻り値見るなりしろ。
書き込むデータをメモリに蓄えて 書き込み先のファイルをバックアップして 書き込み成功するまで書き込みを繰り返す 失敗したらユーザーに指示を仰ぐ といった方法で書いてるんだが巨大なデータを生成しながら書き込む場合にメモリに乗り切らなくて困る どうしたらいい?
>>292 メモリに蓄えずに書き込めばいいんじゃね
変更が必要ならファイル使うとか
>>292 最初から別名ファイルに書き出していって、最後にリネームすればいいよ。
>>292 何か矛盾してないか
もしそのOSが仮想記憶を使ってるとしたら、スワップファイルもまともに動作しないのか
スワップファイルを安心して置けるドライブに書き込むデータを書いておいて
トランザクション処理しろよ
すいません自己解決しました 分割して書き込んでマージすることにしました
C++スレに書き込む事じゃないな 初心者スレにでも書け
^∈^
class templateClassInt; templateClassInt* p; template<class T > class A { typedef T Type; }; typedef A<int> templateClassInt; これ出来ないの?ぐぬぬ
こういうのはダメ? template<class T > class A; typedef A<int> templateClassInt; templateClassInt* p; template<class T > class A { typedef T Type; };
>>301 こんなことしたい
//a.h
//長いの書くのヤダ、ポインタだから宣言だけでオッケだよね
class VectorInt;
VectorInt* p;
//a.h end
//classInt.h
#include<vector>
extern template class std::vector< int >;
//本当はboost::nklklljkjdljlallkとかで長いし、名前がわかりづらいのでここでtypedefしときたい
typedef std::vector<int> VectorInt;
//classInt.h end
//a.cpp
//#include"a.h"
//#include"classInt.h"
template class VectorInt;//実体化
int main(){
p = new VectorInt();
return 0;
}
//a.cpp end
めちゃくちゃじゃないか
まったくです。わけわからん もう素直にインクルードするわ extern templateとか見つけて使ったがよくわからんwww //a.h #include"classInt.h" VectorInt* p; //a.h end そういえばここのヘッダーファイルごとにstd::vector<int>とかやったらコンパイルするの1回だけだよね いやぐぐります ありがとうございました
>>288 OSバッファでの書き出し失敗。
fcloseやiostreamのcloseはOSバッファまでは感知しないんで、
fclose後に非同期にOSバッファが書き出されるような状況で、
ディスクリプタを閉じてしまうと手も足も出せなくなる。
enum{TEMA, AFKA, SIZE}; int* Select[SIZE]={&TemaNum,&AfkaNum}; ステップ終了後なぜかTemaNumやAfkaNumに83291とか19とか入るんですけどなんでですか? enum定義前は両方0で初期化されてました。
デバッガの使い方を理解してない可能性大
>>305 >269の「flush()してbad()」なら「OSバッファでの書き出し失敗」が
検知できるってこと?
Cの規格 7.21.5.1, 7.21.5.2 を読む限りfflush()の動作にfclose()では
得られない追加の保証があるようには読めないんだけど、
>>307 ブレークポイントを前後に挟んで変数の内容を検証したんですが・・・
Releaseモードでやってるんだろ
>>286 亀レスごめんなさい
了解です
アルゴリズムスレ行ってみます
ありがとうございます
>>309 仕様云々じゃなく現実の問題。
fflushを2回実行したりすると1回目で取れなかった
OS側のエラーが出てくる実装が多い(実装者が意図してるかは知らん)。
closeだけだと1回で終わりだからそこまで検知できない。
>>313 へー。そんな話聞いたことないな。改めて適当に検索しても
見当たらない。
とりあえず GNU libc の実装だとバッファに何も無いときの
fflush()は何もしなさそう。
fflush()の繰り返しで OS からエラーを拾ってきてくれる実装を
どれかひとつ教えてもらえないかね?
検索すんじゃなくて自分でやってみたら? SDカードに限界までデータ書き込むとか 仮想マシン上で容量のすっくないディスク作って書き込んで見たり。 Windowsのランタイムライブラリーとかそうだからやってみ。 gccもVC用のランタイムライブラリー使ってるだけだから コンパイラーは何使っても構わん。
316 :
デフォルトの名無しさん :2012/07/11(水) 23:20:32.99
static union{ unsigned short int AX; unsigned char Hreg[2]; }; /*この位置だとエラー*/ //unsigned char& AL = Hreg[0]; //unsigned char& AH = Hreg[1]; int main(){ /*この位置なら正常にコンパイル*/ unsigned char& AL = Hreg[0]; unsigned char& AH = Hreg[1]; AX=0xabcd; cout << hex; cout << "AX=" << AX << " AH=" << (int)AH << " AL=" << (int)AL << '\n'; AH=0x12; cout << "AX=" << AX << " AH=" << (int)AH << " AL=" << (int)AL << '\n'; ーーーーーーーーーーーーーーーーーーーーーーー グローバル領域で参照の変数を定義すると undefined reference to `Hreg'となってエラーになります どこに問題があるのでしょうか?
標準を逸脱してんじゃなくて、実装依存の範疇。 標準の要件を超えてなきゃ標準無視とは言わん。
そっか。ライブラリ内のバッファぶんは掃きだすみたいだから、これで問題ないのか。
void hoge() { const int a[] = {0,1,2,3,4}; static const int b[] = {0,1,2,3,4}; } aとbって何が違うんですか
>>320 記憶域が違う。前者は自動変数。後者は静的変数。
自動変数だと関数呼出しごとに割り当てと初期化が行われるんで、
配列がとても大きいと時間がかかったり、再帰すると毎回違うアドレスが
得られたりする。
その例のままならたいして違わない。
>>317 OracleやらSunのUNIX向けコンパイラー、BorlandのKylix。
ジャーナリングを確実にしたいためだろうが真意はしらん。
>>320 後者は、戻り値で返すことができる。
前者は、戻り値で返すと異常を起こすので普通コンパイルエラーになる。
>>321 gnu c++コンパイラでは通らないですね
以下グローバル領域中で
>int a; int& ref=a;
>static a; int& ref=a;
は通るけど
static union{int a;};
int& ref = a;
は通らないのは共用体特有のなんちゃらかと考えましたが、
グローバル中の無名共用体の宣言でstaticをつける理由を考えると
参照が外部結合しては困るということなのか
static union{int a;};
static int& ref =a;
で通りました
>static union{int a;}; その名前なしの共用体に使い道があるのけ
>>326 それそのものは
もともとの使い道のサンプルから、問題となっている箇所を探すためのテストにすぎないですよ?
>>325 codepad は g++ 4.1.2 なわけだが。
エラーが出るバージョンは?
>>328 g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3ですね・・・
コンパイル通らないのは自分の環境が特殊なんですかね
javaのプログラムをC++に移植したらとんでもなくJavaの方が速いです
>>332 そこまでしてくれとは言えないですが、よかったら実際にコンパイルしてみてください
codepadではエラーを吐かないコードをマルコピして実際にコンパイルしたら問題のエラーが出ます
マニピュレータがstd::付けないと実際のコンパイラで通らないはずですが
codepad上では通ったりしてるので実際のg++の制約を遵守しているようには思えないんですけどね
やりたいことはわかるが 共用体の使い方が下手すぎるのがなんとも 316
>>333 コンパイルしてみろというのならコンパイルできるソースを出せよ。
>>333 codepadで通ってあんたの環境で通らないソースがあるんなら、
そのコードのcodepadのURL貼ってみればいいんじゃないの。
やりゃわかるけどideoneではエラーになるよ
C++には、無名共用体という特殊な共用体があります ワケワカで使おうとしてハマりまくってます状態?
コンパイル出来る出来ないより、何やりたいのか、教えてよ
g++ 4.1.3 では通るけど g++ 4.3.4 では通らない、と。
うむ
>>321 のソースはmingw-gcc4.7.0でリンカエラーになるな(win32、mingw公式のsourceforgeのバイナリ)
>>338 いや、
>>325 を勝手な解釈として自分なりには解決したつもりだったのですが
今はコンパイラに通る通らない論争ですね
>>341-342 わざわざありがとうございました
何がやりたいのかわからないってのはstatic宣言のことですかね?
グローバルでの無名共用体の宣言にはstaticが必要っていうルールがあるんですよ
詳しい理由が探してもなかなかないんですけど
prog.cpp:13: error: ‘hex’ was not declared in this scope ideoneではエラーになるよ エラーが英語だから?
>>342 あ、そうです!
正確に言うと最初から全部リンカエラーですね
unsigned char& AL = Hreg[0]; へー、こういう書き方すると初期化コードが必要になるんだ
初期化コードってなぁに?
汗のソース吐かせて見てみたら C++流の言い方は知らん
汚ねえな
フリーで超高速に最適化してくれるコンパイラ教えてください
gcc, clang, vc++ee っていうかいまどき最適化してくれないコンパイラのほうがめずらしいわ。
「超高速に最適化」って最適化を超高速に行うってこと? それとも超高速に動作するように最適化するってこと? どっちにしても「超高速」は無理かと
グローバルに無名unionを書いたら、unionにならなかった気がする。
横着しないで構造体に包めよ
宣言 アドレス アクセス ポインタの宣言 ポインタの中身へアクセス 変数 型 x &x x *ptr_x = &x *ptr_x クラス クラス名 cls &cls cls.(メンバ) *ptr_cls = &cls ptr_cls->(メンバ) 配列 型 arr[num] &arr[0] arr[index] ? ? 初心者です。いろいろサイト見て自分なりにまとめたのですが?がサイトによって説明が違くてよくわかりません。 先輩方教えてください
ポインタの宣言 (*ptr)[num] ポインタのアクセス ptr[index] それとクラスのメンバへのポインタはそれで動いたか? クラスの場合は必ずインスタンスが必要なので インスタンス.*メンバへのポインタ のようになる もしインスタンスへのポインタから参照するなら インスタンスへのポインタ->*メンバへのポインタ となる あと仮想関数が絡んで来るとかなり動作は複雑になる
「ポインタ変数」を「ポインタ」で説明するサイトは糞サイト ポインタの説明として「アドレス」を説明するのはいいが 「ポインタ」って表現を「アドレス」って表現しているサイトも糞サイト
>配列として宣言した変数は、ポインタ変数のように扱える。 「ポインタ変数」は誤解を招く >※配列は入れ物があるけどポインタは無い ポインタはある ポインタ変数とポインタをごちゃ混ぜにするからおかしくなる
あと、クラスですがインスタンスにしないとだめみたいでした みなさんのおっしゃるとおりでした、そこの部分もありがとうございます
>>361 より分かりやすく誤解を招かない表現を持ってるなら
俺に言わんでそれを初心者に説明してあげなよ
配列はポインタ変数のように扱える 間違いじゃん 配列にはポインタは無い 間違いじゃん 「分かりやすく」云々以前に間違ったことを教えるなっつーの
しかし正解は言わない365であった
>>365 ならそれを訂正しつつ君が説明すればいいじゃんって話なんだけど伝わってる?
別に厳密な言語仕様の話をしてわけじゃないし
配列名はポインタ a[1] は 配列名a に[]演算子を使っているだけ a[1] は *(a+1) に展開されたのと一緒 だから 1[a] は *(1+a) に展開されたのと一緒 よって以下は全部一緒 a[1] 1[a] *(a+1) *(1+a) 配列名はポインタでありポインタ変数ではないため 配列名に代入する a = &b のような記述は出来ない これで満足か?
厳密な話でないことは理解している でも「ポインタ」を「ポインタ変数」として説明するから 初心者が理解出来ずに配列とポインタで挫折するんだよ このあたりは説明する側が気を付けないと駄目って話
それを
>>361 の時点で書けば良かったという話だな
>>368 変数については分かった
入れ物云々については?
int a[1];
*a = 0;
は大丈夫だけど
int* a;
*a = 0;
は駄目ということを言いたかったんだけど
>>360 の最後のソースの補足として
自分でメモリ管理をするつもりは無いので あらかじめOSに「自分はこのくらいメモリを使うつもりなので覚悟してくれ」 というヒントを与える方法があるなら教えてくれ。 boostかSTLにあるAPIで。
>>371 すまん
言ってる意味が分かった
「配列は入れ物があるけどポインタは無い 」
自分は
「配列は入れ物がある」
「しかし配列にポインタは無い」
と言ったのかと思ってた
>>372 無いので、先にアローケートして自前でプールするしか無いと思うんだが・・・。
書き方しだいではmallocよりもはやくなるよ。
>>374 ならそういうライブラリでもいい
boostにならあるかな
>>361 配列って実際はアドレス定数だよな。
スタックポインタによって変わるから厳密な定数じゃないけど。
>>378 なんでわざわざ違うものを混同しようとするの?
テンプレート引数や、const値に使えない以外は特性がほぼ同じだから。 更に言えば、グローバルで宣言した配列の場合は、static領域をさした 定数そのものだから。
>>379 ・OOやテンプレートの様に演繹的に理解する事で、新たに理解する知識量を減らせるから
(他の機能と共通する特性を新たに覚える必要がなく、固有特性だけ考えればいい)
・教えるとき説明しやすいから
定数というか、constなポインターの方がもっと近いじゃなかろうか
sizeofで長さが取れなかったり、勝手にどこかの領域で初期化されるぐらいの違いでしょ
配列へのポインタや参照を知ってりゃ
>>378 みたいな事は言えねえなあ
int(*)[10]
クラス内で自分自身のコピーを作るにはどうすればいいですか
コピーコンストラクタ(*this);
それだと継承してたら死ぬだろ
継承に関係ないものだったら使えるのであれば大丈夫です ありがとうございました
あ、継承したクラスにコピーコンストラクタが定義されてるとうまくコピー出来ないのか 実験してみよう
スライシングでググれ
Effective C++によるとスライシング問題って関数に値渡しする時に起きるんでしょ? 今はわざわざclone()って関数を作って返してるんだし、だいたいコピーコンストラクタは 継承されないからね
わからないならいいよ いつか痛い目みてその時に気付くから
これcloneしたオブジェクトをポインタで返す時にスマポで包めんの? 共変にならないので困るなこれ うっかりdeleteし忘れてメモリリークの原因になる
スマポで受ければいい
ナマポを受ければいい
>>395 いや継承してるとclone()をvirtualにするでしょ?
スマポは型を固定してしまうのでコンパイル通らないのよ
virtual shared_ptr<Base> clone()で派生ではshared_ptr<Base>にDerived*入れて返せばいいだろ shared_ptr<Derived>とか欲しければ仮想でないshared_ptr<Derived> clone_derived()を派生側で定義しとけばいい
ありがと それで書いてみるわ
返り値でスマートポインタを返すな パフォーマンスの為に生使いたい人が困るだろうが
>>400 ありがとう
参考にさせていただきます
>>402 いや、メモリリークしないように自分で気をつけるのなら共変のポインタをvirtualで返せばいいよ
「パフォーマンスのための生ポ」はもうやめようや 小規模ならまだしも。
パフォーマンスだけじゃなくて再利用の利便性も下がるんだよね スマポ前提の設計だと後続のコードもスマポに合わせて設計しないといけなくなる 最近は標準化されたから少し抵抗減ったが 少し前にスマポと言ったらブーストなどのライブラリが必要だった これは使う側からすると面倒だ ナマポなら利用者がわからスマポの使用不使用や種類を選択しやすい
いらない子と言われて久しいけれど、時々でいいからauto_ptrちゃんのことも思い出してあげてください。
C++11ではついにdepricated指定されてしまったorz
乗り遅れた感もあるけど
ttp://codepad.org/NKX0xGnQ clone()の戻り値をスマポにしても良いかも
DerivedのコピーコンストラクタにClonable<Derived>()が無いと明示的な初期化が無いという警告が出たんだけど何でなんだろうか
>>402 生ポインタに比べて例えば std::auto_ptr のパフォーマンスがどう劣ると思ってるの?
>>405 つまり標準化されたからガンガン使えってことだね
ライブラリがスマポ指定でもラップしてナマポ形式で再利用できるだろ class hoge { smapo<x> p; void method() { p->method(); } hoge(): p(new x) {} hoge(hoge const &o): p(o.p->clone()){} }; hoge *p = new hoge;
auto_ptrがdeprecatedになったのは unique_ptrが入ったからか
コピーで所有権の移動とか直観的じゃなさ過ぎたよな
ptr プトゥル ioctl アイオークトゥル fcntl エフクントゥル ctrl クタール
clsXXX 来るすXXX calcXXX 軽くXXX
416 :
デフォルトの名無しさん :2012/07/14(土) 09:37:55.88
>>412 auto_ptr を deprecated にするために
unique_ptr その他を入れたってとこだな
>>413 コピーではなくムーブづら
>>411 効率悪すぎだな
最初から生ポインタを返せばいい
boost::shared_ptrとstd::shared_ptrってどう橋渡しするんだろう
>>418 まだstd::shared_ptrが入ってないコンパイラもあるからだ(どこのコンパイラとは言わないが)
要するにソースの再利用の話だよな?
boostの使用は禁止されていてstdなら良いって会社もあるから
どうするんだろうね?エディタかsedか他のスプリクト言語でまとめて置換か?
スマポの変換コード書き足して共存させればいい
どうせboostがboost::cast<std::shared_ptr>()みたいな感じで用意したり、 std::shared_ptr用のコンストラクター作るから使う側は問題ないだろ 問題はboostがどうやってそれを実装するかだ
簡単だろ bstsp<y> p(new y); stdsp<x> q(p.get(), [p](y*){});
速度最適化してるのにJavaより処理が遅いとかどんだけ・・・
スマポ間の変換を何万回する気だよ
>>424 ありがとうございます すごい早くなりましたw
てかなんかスマポ使ってるってわかったんですかねw
監視されてるよ
こわwでもこれで速度の壁超えたのでとある計画ができる! マジでありがたいw
typedef vector<string> vec; class foo{ vec x,y; public: foo( const vec &a, const vec &b ):x(a),y(b){} foo( const vec &a, vec &&b ): x(a),y(move(b)){} foo( vec &&a, const vec &b ): x(move(a)),y(b){} foo( vec &&a, vec &&b ): x(move(a)),y(move(b)){} }; 4つも書くのメンドイんですが、どうにかなりませんか?
右辺値参照は各クラスにキックできないの? んで、右辺値参照なかったら普通のコピコン動くんじゃなかったっけ? C++11はよく知らないんだけど。
イデオンって0x出来たのか
受け付けたく無い型を特殊化して削除
is_barとか作ってディ酢パッチ
int,bar bar,int int,intの三つ? "4つも書くのメンドイ"の解決にならんじゃん…
>>437 vectorって誰かがoperator vec作るアンポンタンなことせん限り暗黙変換可能な型ないはずだが。
でも、enable_ifはいいアイデアだと思う。static_assert使うよりまともなエラーになるな。
>>405 いまだにこんな書き込みがあるとは恐ろしいな。
組込で作ってるならC++自体使うなって話だがw
>>441 反論は論理的な文章で書きなよど素人さんwww
つうかパフォーマンス=組み込みってwww
HSPを1年くらいやってたんですがC++に移るのは難しいですか
簡単だお!
>>444 HSPに比べればはるかに大規模コードがバグりにくくなるし、良いんでないの
C++固有の難解なトコに触るレベルまでいかないなら難しくはない
型制限はenable_ifでSFINAEが現在の常道
c++ってなんでみんな必死に汚コードの生産性あげようと努力してるの?
オジャバやウゾムゾスクリプトと違って実用十分なコードでも常に磨き上げる余地があるし コード蓄積有無で実行/書上げ効率が別次元になるからねー
やっぱりJavaやっててよかった!
実用不十分な段階で手の入れ様が無くなるオジャバ哀れ
>>448 生産性でJavaに追いつかれないように必死なのさ
>>448 Javaは実行してみると分かるけど突然JITコンパイラやGCが働いてCPUの
負荷が跳ね上がる
マルチコアCPUなら問題ないが、組み込みとかでシングルコアだと致命的
オペレータオーバーロードしてまるでプリミティブのように擬態するクズクラスが気に食わない
演算子オーバーロードはうまく使えばタイプ量を劇的に減らしてしかも堅牢性が増す って利点が分からないのか C++11になってムーブコンストラクタが新設されてからさらにその性能がアップしている
>>455 バカ乙
一目見てなにやってるかわからんコードなんてクズ
初回に書くときだけ楽でも後でいじる奴の仕事が二十倍遅くなるわ
一目見てわかるようにオーバーロードしてんだろうがカス これだから土方クズプログラマは…
>>456 こういうバカが多いから未だにCがトップシェアなんだな・・
>>457 カスだな〜おまえ
一目みてわかってるのはそのコード最初に書いたクズだけだよ
オペレータオーバーロードする奴はアスペルガーみたいなもんだわ
i += j; はい このコードがなにをしてるか当てて下さい わかるわけねーだろ!! あーあ、ヘッダかドキュメント見に行かなきゃ〜 時間無駄したな〜 クズがオペレータオーバーロードなんかするからさ〜まじ氏ねよ
>>460 お前仕様書書いた事ないのか?
サンデープログラマーなのか
i に j を加えている。
>>460 お前の上司はそんなこと聞いてくるのか
かわいそうに同情するよ
>>462 違います
あーあ致命的なバグ出しちゃうよおまえ同寸の
単なる構ってちゃんだろこいつ それかC言語しか出来なくてC++が理解出来ない己の頭の悪さを このような形で解消しようとしていると見る事もできる
>>466 コードに依存します
ドキュメントかヘッダを毎回参照して確認し時間を無駄にして下さい
アスペだから他人のためにコメントを書くっていう行為ができないんだろうな
>>468 馬鹿発見
コメント書いてたらご自慢のタイプ量が少ないメリットが帳消しだろwww
本末転倒ってこの事だな
やはり例外なんていう見えないgotoをありがたがってるバカなだけあるわwww
悔しいが例外は俺も出来損ないだと思う
ドキュメントは全て無駄、コードが全て。 アマチュアかよ。
>>467 >コードに依存します
すくなくとも、俺のところではそんな馬鹿な仕様のクラスは使わない。
>ドキュメントかヘッダを毎回参照して確認し時間を無駄にして下さい
君のところだけだよ、そんな馬鹿なことしてるのは。
>>472 そんなクラスは使わないんだな?
要するにオペレータオーバーロードしたクラスは使わないという事だな
なんだ意見一致したジャないか
>>474 >そんなクラスは使わないんだな?
そんな「馬鹿」なクラスは使わない。
アホと意見が一致することはないだろう。(w
簡単な事に関してはアホが意見を言えるため議論が迷走する いつもの事だな
スコープ毎にusing operator 型; みたいなの強要するのもありかな
479 :
デフォルトの名無しさん :2012/07/16(月) 17:44:39.83
>>460 i = func(j);
これだって同じくらいなにしてるかわからないだろ。
型が普通の型じゃなければ 必ず演算子オーバーロードされてるのだから 何も悩む必要は無い
a.Add( b ); a += ( b ); 名前つけようが、templateでの可搬性が下がるだけでメリット無し。
その適切な名前がoperator+=なのですよ。
>>478 iの型も分からないくらい長い関数作ってんだからお察しだろ
例外に突っ込まないあたり自覚は有るんだな cppは例外を採用し見えないジャンプコードに汚染されたクソ言語ってな
俺は1レスしか書いてないがそれ以降スレが伸びてるのが愉快
>>484 わからなくても動くようにしないといけないだろ。
こういうテンプレートでの可搬性が下がる。
template< class Iterator, class Type > Type Sum( Iterator begin, Iterator end, const Type &initial )
{
Type sum = initial;
while( begin != end )
{
sum += *begin;
++begin:
}
return sum;
}
>>487 >template< class Iterator, class Type > Type Sum( Iterator begin, Iterator end, const Type &initial )
>{
> Type sum = initial;
> while( NotEQ(begin,end ))
> {
> sum = Add(sum, Unref( begin);
> Next(begin);
> }
> return sum;
>}
こちらのがはるかに理解しやすい
理解しやすいかどうかはどうでもよくて、整数型と互換性がない。
>>489 なんのためのオーバーロードだよwww
プリミティブにも同じく定義すりゃいいだろ
クラスを本来クラスの機能と直接関係ない演算子と関連付けるほうがキモイわ
どのオーバーロードが呼ばれるんでしょうねぇ 余計にたちが悪いわ
>>492 なんだオーバーロードのルックアップのルールも知らない素人か
>>488 NotEQってなんだ?特にEQって
Nextって次の値返すんじゃないのか?
テンプレート書くときも、オーバーロードした関数
単体で使うときも何に使うもんかさっぱり判らんぞ。
>>494 流石にそれはアスペだろ
鉛筆みてこれはなんだ箸か?とわかってるのにわめいてるようにしか見えないよ
いや、お前が世界の辞書だと思うなよ お前のルールで仕切ってる職場ならしらんが、 整数型に演算子と同じ動きをする関数が定義されてるなんて 普通思わないから。別の何かをしてるもんだと思う
俺が法律だ!!!
>>495 無いとは思うがそんな自慰行為職場で済んなよ。
>495 その言葉は459にこそ当てはまるべし。
std::not_equal_to とかあるのにこれ以上乱立させんな
オペレータオーバーロードがある理由はイテレーターやポインタや関数のシグネチャをエミュレートできるようにってだけだからな 基本的にそれ以外のオペレータオーバーロードは一部の例外を除いて非推奨だぜ
>基本的に非推奨 だれが?
常識だらろ
オペレーターのオーバーロードはC++以前にSimulaやSmalltalkで導入されたもんなんだけどな。 OOPLじゃ他にも.Net系言語、PythonやRubyでもできる。基本C++の他の設計とは関係ない。 オペレーターをオーバーライドして整数型に対する関数を再利用するために用意されてる。
>>504 お前の常識はどうでもいいから、非推奨してる規格委員の資料を出せ。
コレってあれだろ? 炎上式勉強法ってヤツ
>>507 たまにあるね
何気ない書き込みが思惑を超えて勝手に炎上して
それを見て学ぶ
>>508 いやいや、わざわざ知ったかしたり、上みたいにキチガイな主張をして、それを正論で叩き潰そうとする人の正論を見て勉強をするっていうやつ
これが真性か炎上勉強法なのかは知らんがw
>>509 ああ、それか
それもたまにやるけど、ツボを突くのが難しいから
成功率低いんだよな・・・
>>485 お前が例外安全なプログラムが組めないヘボプログラマってだけだろ・・・
狂人の真似とて大路を走らば、即ち狂人なり。
>>507 ばれたかwww
かなりスルーされにくいから重宝するんだよなこれ
>>485 見えないジャンプコードが入っていてなんの問題があるんだ?
breakでも見えないジャンプコードは入るだろうしreturnだって入るだろ。
そもそも、Cでまともに例外処理してたなら、try-catchで例外処理したって
困ることないだろ。Cで戻り値やerrnoの例外情報もみ消すことが当たり前の
頭になってるから発狂するはめになんだろ。
意図して捕まえないとアボートとなんら変わらないというか選り始末に負えんgotoだから嫌われるんジャナイかな
>>515 意図して捕まえるケースなんてそうないよ
大体はRAIIで済む
>>507 QZがやっているやつか。恥しらずにしかできないだろうね。
519 :
デフォルトの名無しさん :2012/07/16(月) 22:05:43.45
あるアセンブリが、 デバッグモードとリリースモードのどちらでコンパイルされたかを 判断するコードを教えてください
>>515 エラー処理せずに進んじゃ困るから例外扱いにするんだから、
いずれにせよ結果的は異常終了で変わらないだろうにね。
try-catchと違い戻り値無視に関しては最悪データを飛ばすけど。
int id = 0; ExampleRead( &id, "key" ); //戻り値チェック無視 ExampleDelete( id ); 0 == idが有効なリソースを指していた場合、当然意図しない情報領域が飛ぶ。 効率を考えて、0初期化しなかった場合、より不特定な情報領域が飛ぶ。 同時にクビも飛ぶ。
そしてミサイルがとぶ
一発だけなら誤射でセーフ
>>519 コードは知らんが、リンクされてるライブラリを調べれば分かる
googleがまったく逆の実行パラダイム提唱実行してなかったか?
例外は再利用がめんどくさい ラップしてnothrowにしないとCとかで使えないし
>>527 戻り値でもモジュールまたげば翻訳することになるから同じこと。
>>485 pythonもrubyも「例外を採用し見えないジャンプコードに汚染されたクソ言語」だと思ってるの?
Schemeあたりの継続なんか見せたら卒倒しそうだな。そのまま起きてこない方がありがたいけど。
見えない敵と戦っているクソ言語
まあ、理由も書かずにクソ言語とか言ってればなんか偉くなったように思えるんだろうな。
>>485 みたいに、ヘタに理由書くとフルボッコだし。(w
要するにエラー復帰か
template<typename S, int ... X> class E { S s[size(X...)]; constexpr int size(int x) { return x; } template<typename ... P> constexpr int size(int x, Y ... y) { return x+size(y ...); } }; 配列sがつくれません。 どうしたら直せますか?
PのところYに訂正します。
もう一度書き直しますね。 template<typename S, int ... X> class E { S s[size(X...)]; constexpr int size(int x) { return x; } template<typename ... Y> constexpr int size(int x, Y ... y) { return x+size(y ...); } }; ソースコードを日本語で翻訳すると可変長のテンプレート引数の 総和の長さを持つ配列を作りたいけれど。 定数になる関数を使ってもコンパイルできませんということです。 ちなみに配列を初期化する前には関数はないのかもとおもって静的関数にしてみてもできませんでした。
>>537 sizeの宣言と定義2つをEの定義の外に出す。メンバ関数を作りたいわけじゃないだろう
>>539 gcc4.7ではできる。ideoneの0x gcc4.5.1ではエラー
constexpr int size(int x)
{
return x;
}
template<typename ... Y>
constexpr int size(int x, Y ... y)
{
return x + size(y ...);
}
template<typename S, int ... X>
class E
{
S s[size(X...)];
};
int main() {
E<int, 1, 2, 3> e;
}
有難うございます。 GCC4.7じゃないので出来ませんでした。 GCC4.7に変えたいです。
>>533 PDF読んでみりゃ解るが、これって単なる例外じゃなく
バッファーオーバーランとかセキュリティ的に極めて致命的な
場合に限った話で、他の例外は今までどおり例外処理が必要なんだよな。
そもそも、エラー忘却型って訳語自体がおかしいし。
こういう論文って何処から拾って来るの?
質問が2つあります
http://ideone.com/h7kQf このコードはideone(gcc-4.5.1)だとコンパイルが通りませんがgcc-4.6.0と4.7.0だと通ります
またエラーの出ている行をreturn this->f_(g(arg));のように変えると
コンパイルは通りますが今度は例外を出して落ちます
質問の一つ目はコンパイルエラーの理由で二つ目はランタイムエラーの原因と対処です
お願いします
なんで無名関数の戻り値型書いてないんだ?
cはf.compose(g)のthisをキャプチャしているがc(3.0)の時点では既に寿命が尽きている
>>443 をファビョらせちゃったかな?
スマートポインタの有用性はもはやググレばいくらでも見つかる・・・と思ったら
ぜんぜんないでやんの。
そりゃ生ポインタ返せって言うヤツがまだいるわけだな。
訳:面倒くさいので誰か調べて下さい
ナマポで返して使う側がスマポを外から付け加えてやればいいだけ何度も言わせんな obj *obj::clone(); // クラス製作者が書くべきコード //利用者が書くべきコード spobj create(...) { return spobj(new obj(...)); } spobj clone(spobj p) { return spobj(p->clone()); } 当然テンプレートを使って楽していいぞ
常識だよな 普通に考えて「スマポを生成する」なんて機能は論理的に考えて元々のクラスに不必要な機能なんだよ だから当然スマポを生成する機能は分離するのが正しい設計だ
>>549 オーバーライドが不便すぎる
所有権の無くなるスマポを返したい時、手の込んだ事せにゃならん
逆も言えた話ではあるがいくぶんかマシだわ
shared_ptrの場合はスマポ返さないと全く意味がない
auto_ptr 返せば現状での十分な移植性に加えて shared_ptr も unique_ptr も 使う側の入れ物は好きに選べるんだぜ。最強じゃね?
ヘッダで#include <memory>するとallocatorやらなんやら、auto_ptrやunique_ptrが使いたいだけにしては重すぎるんだよな。
上の方でスマポのパフォーマンスの話出てたから前スレのレス貼っておくね
301 :デフォルトの名無しさん [sage] :2012/05/25(金) 16:45:50.43
スマポが使えるなら使ったら方がいいが、
パフォーマンスやメモリの観点で使わない方がいい場合もあるからケースバイケースだな。
302 :デフォルトの名無しさん [sage] :2012/05/25(金) 17:04:43.03
shared_ptrはともかくunique_ptrは消費メモリもオーバーヘッドも生ポインタと変わらんと思う
303 :デフォルトの名無しさん [sage] :2012/05/25(金) 17:23:15.50
生成と破棄x30000000、sizeof比較
int*: time: 2.13s
http://ideone.com/2tLcx std::unique_ptr<int>: time: 2.13s
http://ideone.com/wtba4 std::shared_ptr<int>: time: 4.41s
http://ideone.com/UDuJE sizeof:
http://ideone.com/EtftU > sizeof(int*) = 4
> sizeof(std::unique_ptr<int>) = 4
> sizeof(std::shared_ptr<int>) = 8
304 :デフォルトの名無しさん [sage] :2012/05/25(金) 17:24:20.59
亡きauto_ptrさん
http://ideone.com/sc7fr
ユニポは削除子がイマイチ使いにくい テンプレートで指定だからムーブする時に型を合わせないとダメだし 動的にしたるかと思ってfunction使うと例外安全じゃ無くなるし
shared_ptrみたいにするとサイズが増えるんじゃないの
>>556 だとサイズが2倍で生成/破棄時間もほぼ2倍になってるね。
処理時間≒メモリアクセス時間という俺の持論通りだ。
わろた
共用体がよくわからん(´・ω・)
共用することを強いられているんだ
混浴風呂を思い浮かべてごらん a)入り口に男湯と書いてあるところに入る b)入り口に女湯と書いてあるところに入る あら不思議 どっちも同じ風呂釜に
ただし女湯側から見た時には仕切りがあって 1の湯、2の湯と分かれている 男湯側から見ると3の湯がひとつしかない
風呂に入ってるひとにアクセスする方法が 男湯.3の湯 女湯.2の湯 女湯.1の湯 というパターンがあることになる
銭湯ではわかりにくいのでブロリーで例えてください
家族で歯ブラシを共有することを思い浮かべてごらん 君は歯ブラシを歯磨きに使う お母さんはその歯ブラシをちょっとした掃除に使う
俺の歯ブラシで掃除するなよ
569 :
デフォルトの名無しさん :2012/07/18(水) 18:56:38.88
ツマンネ
>>545 どれですか?
>>546 だからランタイムエラーが出てしまうんですね
ではgccのバージョンが違うとうまく動くのはなぜなんでしょうか
>>570 > ではgccのバージョンが違うとうまく動くのはなぜなんでしょうか
>> return { [this, g](Arg arg) { return f_(g(arg)); } };
thisをキャプチャしていて (*this).f_ が可視なら f_ が暗黙的にキャプチャされるのが正しい処理
そこに不具合があったからコンパイルエラー
共用体は、下位バイトを共用すると覚えておけばOK!
共用体のレイアウトはリトルエンディアンかARMや各種サーバーで使うビッグエンディアンで 全然違ってくるけど、下位バイトってなんの事言ってんだ?
言い直します。 LEの場合は、共通の下位ブロックを共用する。 BEの場合は、共通の上位ブロックを共用する。
実際は処理系依存で、ビッグエンディアン系か リトルエンディアン系なのかで、実行環境関係 なかったりするんだけどな。
>>572 下位バイト=パンツ
家族でパンツを共有することを思い浮かべてごらん
577 :
デフォルトの名無しさん :2012/07/19(木) 07:38:14.95
template <size_t n> void func(const double (&arr)[n]); にdouble*を渡す方法ありますか?(キャストなどで) 具体的には array<double,10> xs; に対してfunc(hoge_cast<・・・>(xs.data()))みたいなことを考えています。 (静的な配列なのにAPI的に配列の参照が取り出せないので困っています)
アレイクラスでオーバーロード
あー疲れた
>>577 func((double const(&)[10])xs.data());
581 :
デフォルトの名無しさん :2012/07/19(木) 20:02:35.92
Hoge& operator=(const char* s) { set( s ); return *this; } Hoge& operator=(const string& s) { set( s ); return *this; } Hoge& operator=(int s) { set( s ); return *this; } みたいなのを延々と書きたくないんだけど、どうしたらいいの?
マクロ
エクセルでコピペ
マジか。マクロかよ
>>581 その例だと設計からおかしいぞ
stringとるならchar*とるのはいらないし文字列と数値のどちらもを直接代入できるのは基本的には悪い設計
class A { public: int hoge; A(int a) : hoge(a) {} }; このコンストラクタって A(int a){ hoge = a; } と同じ意味? なんでこんな書き方が用意されてるの? 仕様決めた人は代入すら面倒だったの?
代入じゃなくて初期化したいから
>>586 class A {
public:
const int hoge;
A(int a) : hoge(a) {}
};
こうなったときどうする?
>>587-588 ありがとう、ものすごくなっとくした
仕様決めた人はいろんなこと考えてくれてんだな
operator<< ってなんて読むの?
おぺれーたーくく
子供じゃねーんだからさぁ・・・
左シフト演算子
なんでお前らはコンストラクタのイニシャライザ使いたがらないの?
コンストラクタの中からset()とか呼ばね?
すごい使ってるけど
キャスト演算子のオーバーロードって継承されたっけか
>>597 そのset()が例外飛ばしてきたらどうするんだろうな
コンストラクタでset()を使う理由がわからんけど
>>581 template<typename T>
Hoge& operator=(const T& s)
{ set( s ); return *this; }
605 :
デフォルトの名無しさん :2012/07/20(金) 00:45:27.78
stringstream をつかって、文字列の後ろの数字を取りたいんだけど どうしたらいいかな stringstream ss; string dami; int suji; ss << "unko123"; ss >> dami >> suji; ってやったんだけど、数字取れなかった。
>>604 Tがchar const *になってhoge& operator=(char const * const & s)になるだけ
>>600 別にコンストラクタで例外飛ばしても問題ないけど
まだコンストラクタからの例外にごちゃごちゃ言うやついるの? もう絶滅したと思ってたんだけど。
まともにRAIIを扱えずにコンストラクタからの例外で リソースリークしちゃうコード書く奴は割といる。
612 :
デフォルトの名無しさん :2012/07/20(金) 14:09:38.39
配列とかのiterator で、最後かどうかの判定に 元の配列を使わなければならないのはいやなので どうにかならないものか
>>612 具体的に。アクセスの過程で要素数が変わらないのなら、事前にend()を保持しておけばよさそうだが。
iteratorのなかにend()をとっとく場所くらいあればいいのになぁ
ポインタのシンタックスに合わせたいからって理由のためだけにああいう仕様にするんだよな馬鹿らしい isEndやNextなどのメソッドを作るべきなんだよ純粋なOOPとしてはね ただCの表記に合わせたいという不純な動機のためにオペレーターオーバーロードや始点と終点の分離なんて要らないものを書かなきゃいけない
>>616 あーうんこんな感じこんな感じ
標準でこの機能ついてりゃいいんだよな
boost::rangeでも使ってろ
boost::rangeはイテレータじゃないじゃん
BidirectionalIterator未満を捨てればおk
C++って仕事少ないっすね Javaの勉強すれば良かったと後悔しました
C++分かるならJavaもすぐ分かるだろう C++は手続型言語の仲では最も難しい部類の言語だから それができるなら他の言語なんてすぐ覚えられるよ
C++/Java/C#はセットで覚えていいレベル
すぐといってももう就活には間に合わないでしょうから意味ないんですわ
今日明日で覚えれ
C++知ってるならJavaとか2日もあれば十分だろ
Java参考書読んだレベルで使えるって言ってもいいならそうかもしれない
C++を使い込んでる人は、ロジック汲み上げる過程で色々発見するでしょ 3日で基礎を覚えりゃ仕事いける。
俺みたいなNNTクズは派遣バイトで生きながらえて趣味でC++やるしか無いんだな……無念だ
で、Javaの仕事ってそんなに多いのか? C#かVBかC++の仕事しかやった事無いが
>>633 SEの説明会みた感じだとJavaかなり多いと思う
組み込み、制御系はCだからプラプラあまり使わないらしいし
ゲームぐらいじゃないかな他にプラプラ使うとこは
画像を扱う系統のはC++よく使うよ ゲームに限らず 表示系でもLinuxとかならC++はある
シミュレーションとかデータ解析とかはC++多くね? JavaやC#と速度比べるとやっぱ段違いだからな
規模が大きくなりそうなので、ビルド影響範囲を減らしたい。 他の人も利用するので、IFは綺麗ににしたい。 ってことで、IF公開/継承で隠蔽するか、ピンプルにするかで悩んでます。 それぞれのデメリット ピンプル:外部提供機能を増やすたびに接続を書くのがめんどくさい。 IF:クラスのインスタンス化にnew が必要になる 位に捕らえてるんだけど、他に注意するべき違いってありますか?
ツイッターやフェイスブックもC++って聞いたような。 大量のアクセスをさばこうと思ったら、phpよりもいいのかな?
phpをgccコンパイル・・ってあったわ。こんなこと出来るのか
最初ピンプルって何かと思った
RAIIってなんて発音するの
らいー
らつー
>>624 どういう意味で言ってんだ?就職先か?案件の話か?
自社開発してて、グラフィック系だと基本C++の仕事が半分位だぞ。
半年〜1年連続してC++で遊べることもある。
C++は人のソース読みたいと思えない
>>637 どっちもクラスが小さいと速度に影響する。
>>637 new が要るのは pimpl もいっしょじゃね?
allocaした領域をコンストラクターで初期化して返す関数なら最速なんだけどな。 如何せん、allocaに相当する関数を自前で作らにゃならんのが手間。
>>647 deleteの面倒を見る場所は変わるから
使用感の差はあるだろうな
>>637 pimplはややトリッキーなので
知らない人が見ると理解してもらえない事があるな
メンバー関数の実体をpimplじゃなく、pimplを使ってるクラスに配置しとけば コンストラクター、デストラクター以外の処理速度が下がらない。 MSのコンパイラーやiccなんかだと翻訳単位超えてインライン展開してくれるからな。
ピンプルとかパンプルとかパムポップンだな
>>644 グラフィック系というと3DCG?
画像解析とかは別ものか
画像を扱うものなら何でも 3DCGもそうだし、CODECとか医療系(CT、MRI)とかも
>>653 医療かーなるほど
どうもっす探してみるっすおっす
>>652 色々。ウチは2次元ベクトルデータが多い。
図面だったり、組版した文書だったり。
単に書類関係でも使うけどね。 ビジネスロジックとプリンターの中間は結局描画処理しなきゃならんから QRコード作ったり、装飾描いたりってなるとC++になる。
ド阿呆な質問で悪い。なんでstdio.h使わずiostream使わないといけないのか教えて欲しい Cしか勉強してないから違和感が抜けないんだ…
誰もそんなこと言ってないけど
C++勉強すればわかるよ
ストリームの抽象化が強力だから
使わないと行けないわけではないし、cstdio( <stdio.h> )使ってる人も多いだろ。 iostreamを使ったほうがいい理由は、streambufを変えたり、istream, ostreamの派生を 作ることで、iostreamを使った処理の出力をTCPソケットだったりstringだったり、 いろんなモノに使いまわせる点。cstdioでも似たようなことが出来なくはないが、OSに依存する。
>>657 無理やり理由をひねり出すんだったら、可変長引数を使わないで済むってことかなぁ。
アレはなんでも入れれるけど、Voidポインターなんでアブネー。
あとは、開放忘れが無いとかかな。
見た目がダサいのは慣れで済むけど、APPのクラッシュはそうはいかない。
ostream out1( "text.txt", std::ios::out );
example.Store( out1 );
MailStream out2( "no titile", "To:
[email protected] " );
example.Store( out2 );
前者だとexampleの内容が、text.txtに書き込まれ、
後者だとメール送信される。
この時Store自体の実装は一切変更しなくて済む。
具体的にどうすれば?
それぐらいはまともな入門書読めば判るだろ streambufのサブクラス作るだけだが、 長くなるから個々には書かん
ソケットに対するストリームならBoost.Asioに実装がある。 Boost.InterproessのvectorstreamとbufferstreamはなぜInterprocessにあるのか分からない。
>>657 自分や誰かが作ったクラスや構造体などをprintf/scanfで入出力できるようにするのは無理だけど、
iostreamの<<と>>ならできるってのは便利と言えば便利。
まあ boost::format がないと不便だけどねえ
boostのvariantって四則演算できないのか
中身が空の関数であっても、関数本体は cppソース側に書いたほうが いいのかな
STL使ってるとインデクサなんかにsize_tが使われてるみたいだけど、実装する時はintとかじゃなくてsize_tに統一するべきなの? VS使ってると警告がウザいん。因みにsize_t型が32/64bitで長さが変わることは心得てる
>>675 まあこの例に限らず警告がゼロになるようにした方がとにかく無難
>>675 面倒でもstatic_cast<int>してるわいつも
参照な引数を省略する方法ってある? int hoge( int &unko=0 ); みたいな感じで省略されたときは返さないみたいな感じで
const int& unkoならいける
なんでインデクスは符号無しなんだろうな 計算でインデクス出して負になったときに 符号ありなら簡単にチェック出来るのに 符号なしだと単に大きなインデクスを指定したのと区別がつかないから欠点だろ
>>680 const かぁ・・・
思い切り下の方ではいじる気満々なんだよな
あきらめるわ。 ありがとう。
>>678 size_t残してたらキャストしないといけないところが他にも出てきたりしてウザイだろ
>>681 unsignedじゃないとメモリを全部指せなくない?
メモリアドレスより大きい型使えればいいんだけど・・・。
>>679 int hoge() { int unused; return hoge(unused); }
>>684 そんな状況は value_type が (signed/unsigned) char の vector か vector<bool> でしか
ありえないわけで、あんまり強い根拠だとは思えないなぁ。
まー、言語仕様っちゅうもんは今だけ良ければイイっていう観念で作ってるわけでは無いからね。
>>681 そもそも負の値があっちゃいかんから、
負の値を渡すなという意味合いでもある。
明示的なキャストが無い場合警告を出すことで凡ミスを検知できる。
負の値を使いたい計算なら計算結果にoff_tなんか使えばいい。
大き過ぎる値渡したらチェック出来ない(結局メモリ循環して負の位置にアクセス)から意味ない という主張は昔は正しかったかも知れないが今はCPU側に保護機能あるから大丈夫っしょ
初期化子って継承できないの?
>>689 http://stackoverflow.com/questions/10168079/why-is-size-t-unsigned > Bjarne Stroustrup wrote in The C++ Programming Language:
>
> The unsigned integer types are ideal for uses that treat storage as a
> bit array. Using an unsigned instead of an int to gain one more bit to
> represent positive integers is almost never a good idea. Attempts to
> ensure that some values are positive by declaring variables unsigned
> will typically be defeated by the implicit conversion rules.
> Another relevant article by Scott Meyers is here <
http://www.aristeia.com/Papers/C++ReportColumns/sep95.pdf >.
> To summarize, he recommends not using unsigned in interfaces,
> regardless of whether the value is always positive or not. In other
> words, even if negative values make no sense, you shouldn't
> necessarily use unsigned.
>大き過ぎる値渡したらチェック出来ない そもそもこれに意味があるのか判らんな。 負だろうが正だろうが、範囲チェックするならするし、 しないならしないだろうから結局変わらんだろ。 あと、unsignedならsignedと違って0下回った時シグナルとかで検知できるぞ。
>>681 計算結果が負になった時だけチェックできても中途半端だよ。
ちゃんと上限もチェックしようよ。
696 :
695 :2012/07/22(日) 16:53:44.12
かぶった...
>>694 > あと、unsignedならsignedと違って0下回った時シグナルとかで検知できるぞ。
kwsk
>>694 変わらんならsigned使えよ。まともに引き算できないunsignedウザイから。
> あと、unsignedならsignedと違って0下回った時シグナルとかで検知できるぞ。
値がラップするだけのはずだけど、どういうこと?
アセンブラならキャリーフラグが立つ
>>698 俺に言われても困る。C++の標準委員会とかそのへんに言えよ。
>>701 > FPE_INTOVFLOW および FPE_INTDIV0 シグナルは整数演算によって生成され,その他は浮動小数点演算によって生成されます。
FPE_OVERFLOW は飛びませんね。
FPE_INTOVFLOW も signed だけでしょう。
>>702 unsigned int x = -1 とすれば x は UINT_MAX になるものと規格で定められている。
自分でコンテナ書くときはintで書いてしまうな どうせ大きいインデックスなんて設計ミスしなきゃ使わないし 仮に使うとしてもインデックスをクラスで置き換えたBigVectorみたいなの作るし
>>703 今さら標準を変えるほど大きな問題ではない。問題ないとわかってるアプリ側で
signedにキャストすれば十分。
問題は標準コンテナがunsignedを使ってるからって自作のコードでもunsignedを
使いまくるやつら。
普通に unsigned 使うだろ。 > まともに引き算できないunsigned なんて言ってる奴は、自分からアホ公言してるのと同じだし。
>>704 そうね間違えたFPE_INTOVFLOW。
>FPE_INTOVFLOW も signed だけでしょう。
試してみたら?
>>710 まずは unsigned 整数に負の値を入れてシグナルの発生を確認したコードを貼ってくれ。
Unsigned Integerについて 教科書を書いている人のなかには、負にならない数値を表現するのに unsigned 型を使うことを推奨している人たちもいます。これは自己文書化のためです。 しかしCの場合には、実際のところ文書化するメリットよりもバグを引き起こすデメリットの方が上回ります。次の例を考えてみましょう。 for (unsigned int i = foo.Length()-1; i >= 0; --i) ... このコードは止まりません。gccはこの種のバグに気づいて警告してくれることもありますが、気づいてくれないことも多々あります。 signed と unsigned を比較するときにも同じくらいひどいバグを引き起こすおそれがあります。つまり、Cの型昇格の仕組みによって、unsigned 型は期待と異なる動作をするおそれがあるのです。 したがって、変数が負でないことを示すにはアサーションを使ってください。unsigned 型を使ってはいけません。
>>714 (お前の日本語では何を相談しようとしてるのかさっぱりわからんから問題の)C++(ソースコードとコンパイラからのエラーメッセージ)で(問題を示せば)おk
>>710 unsignedでシグナル飛んだら規格違反じゃないの?
>>712 foo.Length( ) が 0 になるかも知れないのに
> unsigned int i = foo.Length()-1;
なんていうコードを書く人は、どうせ他のところでもバグるので unsinged 云々の話じゃないと思う。
>>717 signedならfoo.Length()が0だろうが何の問題も無いコードなのに、何言ってるの?
つっこんだ順序がなんとなく保持されるような連想配列mapってある?
Cはその辺きちんと理解できてその手の下らないバグを入れることが無い人のための言語。 それが出来ないならBASICでも使ってろカス
>>705 え?オーバーフローとアンダーフローって未定義じゃないの?
>>719 直接そのものは無いけどmap<Key,list<Value>>でいいんじゃないの?
unsignedって使わないようにしてる
>>719 作れるだろ?。
map<T,U>なところを
map<T,pair<U,int>,COMP>に、pairの後ろのintはつっこんた順にインクリメント、
COMPはpairの後側で比較、取り出すところはit->secondを*it->second.secondにすればよかろ。
725 :
724 :2012/07/22(日) 18:07:14.34
>>724 訂正:
×取り出すところはit->secondを*it->second.secondにすれば
→取り出すところはit->secondを*it->second.firtにすれば
>>721 signedの演算についてはそうだけど、unsignedについてはそもそもオーバーフローというものが
起こらないことになっている。
3.9.1/4
> Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2n where
> n is the number of bits in the value representation of that particular size of integer. *46
...
> 46) This implies that unsigned arithmetic does not overflow because a result that cannot
> be represented by the resulting unsigned integer type is reduced modulo the number that
> is one greater than the largest value that can be represented by the resulting unsigned
> integer type.
>>718 >
>>717 signedならfoo.Length()が0だろうが何の問題も無いコードなのに、何言ってるの?
そういうことを言いたいのではなく、変数の取りえる範囲を考えずにコーディングする奴は馬鹿だってこと。
何でもかんでも考えなしに signed にすれば OK なんて思って奴はマ辞めた方がいい。
>>727 誰も「変数の取りえる範囲を考えずにコーディングする」とも「何でもかんでも考えなしに signed にすれば OK」とも言ってないよ。
値の範囲を考えた上で、signedで問題ないところはsigned使えって話。
>>728 > 誰も「変数の取りえる範囲を考えずにコーディングする」
unsigned int i = foo.Length()-1; は、範囲を考えずにコーディングしているとしか思えないけど。
> 「何でもかんでも考えなしに signed にすれば OK」とも言ってないよ。
だったら、どう考えればいいかを書かないとダメでしょ。
>値の範囲を考えた上で、signedで問題ないところはsigned使えって話。
それなら、「値の範囲を考えた上で、unsignedで問題ないところはunsigned使えって話。」でも
同じだが。
n分木みたいな構造のものを 端から順に返すイテレータってどうやって書けばいいか どっかにサンプルとかある?
>>729 > unsigned int i = foo.Length()-1; は、範囲を考えずにコーディングしているとしか思えないけど。
-1になるからここではunsigned使うわけがないってことか?
気付いてるかどうかわかんないけど、-1が無くてもバグってるからね。
> それなら、「値の範囲を考えた上で、unsignedで問題ないところはunsigned使えって話。」でも
> 同じだが。
どちらでも問題ないところでも、unsignedを使うと上でいろいろ挙げられてるようにデメリットが大きい。
だからなるべくsignedを使えって話。
gnu系だと-ftrapが使えないと使えんからな
http://en.wikipedia.org/wiki/SIGFPE > In C, SIGFPE (or any other signal) will never be issued for unsigned integer types. These are guaranteed by the C standard to wrap around silently.
ですよねー
>>730 直接的ではないけどboost.graphの深さ優先探索かな。
visitorで実現できるけどiterator化するのは少し難しい。
できないことはないけどややこしいだけだよ。
>>731 > -1になるからここではunsigned使うわけがないってことか?
というか、-1 になることを気づいていないんじゃないかと。
まあ、本当のところはコード書いた本人に聞くしかないけど。
> 気付いてるかどうかわかんないけど、-1が無くてもバグってるからね。
i >= 0 のことならわかるけど、これも unsigned の値の範囲を考えればわかる話しだろ。
それ以外にあるなら、具体的に書いてくれ。
>どちらでも問題ないところでも、unsignedを使うと上でいろいろ挙げられてるようにデメリットが大きい。
>だからなるべくsignedを使えって話。
問題ないのに、デメリット?
君の主張は、よく考えなくても問題ないケースが多いから signed の方がメリットあると言う風にしか
思えないけど。
よく考えても、unsigned の方がデメリットあると言うなら、具体例 plz
>>737 値の範囲について signed, unsignged どちらでも問題ないところでも、 unsigned を使うと
暗黙変換の残念なルールにより間違いが起こったりコンパイラの警告を黙らせるための
汚い回避策を講じないといけなくなるなど、デメリットが多い。
ゲームのタイトルメニューを作成しているのですが、 いくつかあるメニューの中で何か1つ選択したときそこだけを拡大して表示する方法のヒントをご教授願いたいです。
>>734 したりしなかったりするよ。実装依存。Cの仕様が云々上で言ってたりするがCは関係ない。
そもそもハード依存でCの機能じゃないからCPUとコンパイラーが対応してるかどうか次第。
コンパイラーが対応してなくてもアセンブリでスイッチ入れられるものもあるらしいがそっちは知らん。
>>736 ありがとう
iteratorの勉強をするときのネタとして自分への宿題とするわ
>>740 ハード依存で整数オーバーフローに対してシグナルが発生するとしたら
C,C++コンパイラはunsignedについてそれを避けるようにコンパイルする義務が
あるように読めるのだが。 >726
>>740 unsignedの演算結果について実装依存や未定義の部分は無いのだから、
そんな動作をすると規格準拠のコンパイラとして認められないだろう。
で、例えばどのコンパイラがどんなスイッチでそんな動作をするの?
SPARCとかPOWER PCとか現実がそうなんだから知らんがな
>>744 現実だと言うのならコンパイラとオプションとコードの組み合わせを示せよ。
>>745 コンパイラ以外は既に出てるがな
gccでもftrapサポートしてるかfpu_flags関数使えると行けるぞ
fpu_flagsはgcc固有じゃなくOSとハードウェア固有だけど
>>737 何でそんなにunsigned使いたいの?
超下品ゲーム作ってたんですが、肛門からでてくるものでおならクラスとげりクラスとうんこクラス、うんこにはまきぐそクラスと垂れ流しうんこと太巻うんこがあります。
>>748 じゃないな。こっちもググったけどでてこないし。実機のmanぐらいにしか乗ってないんだろうな。
まーそんな処理系があっても規格違反なんだろ?ここでは論外。
>>748 -ftrapvって結構危険よ。今は知らないけど昔は加算とか取りこぼしてた。
>>753 gccはコンパイラの名前じゃなかったのか・・・
WindowsもってないんだけどEXCEPTION_INT_OVERFLOWって符号付きのみだっけ?
>>752 んなこと言い出したらスレッドセーフとかって話も論外だろうし
環境依存しないオーバーフロー検知なんて無理だって
あと、オーバーフローが検知できりゃsignalじゃなかろうがなんでもいいんだろ
>>757 C++03までの規格でスレッドセーフを語ることは確かにこのスレにとっては論外だ。
C++11により、規格に沿ってdata raceの有無を語ることができるようになった。
環境依存しないオーバーフロー検知なんて話は誰もしていない。
>>738 > 暗黙変換の残念なルール
だから、具体的に書いてよって言ってるんだが。
>>747 考えなしに singed 使うのがおかしい、と言ってるだけだが。
>>759 unsigned int ichi = 1;
assert(ichi > -1); // fails
assert(ichi - 2 == -1); // fails
761 :
760 :2012/07/22(日) 23:10:59.75
> assert(ichi - 2 == -1); // fails ん?こっちは通るか。ごめん。
762 :
760 :2012/07/22(日) 23:17:43.65
これでいいか。 assert(ichi - 2 < 1); // fails
unsigned 使ってて、-1 の値と比較しておかしくなるとか… 「値の範囲を良く考えて」も、そんなコード書いてるのか?
>>760 普通こうじゃね?
int f(unsigned a, unsigned b)
{
assert( a < a + b );
return a + b;
}
>>763 考えるべき「値の範囲」ってのが変数や関数の値域のことならまだわかるが、
その値を使った演算すべての値の範囲を考えろと言われても無理だろ。
>>765 > その値を使った演算すべての値の範囲を考えろと言われても無理だろ。
「演算すべての値」というのが意味不明だが、演算結果と仮定して、
演算結果の範囲もわからんままコード書いてるということなのか?
>>766 例えば何かのクラスで「サイズ」を返す関数を設計するとき、戻り値が負になることが無い
のはわかってるから unsigned にしたとする。
クラス利用者が「a のサイズから b のサイズを引いて N より小さくなるとき」という仕様に
対してこんなコードを書いたとする。
if (a.size() - b.size() < N) ...
このコードは a.size() < b.size() の場合に正しく動かない。
最初の unsigned の選択を守ったまま正しく動くようにコードを変形することもできるけど、
仕様とコードは乖離するし、同様の問題が他の利用箇所にもあることは十分考えられるので
根本的な解決とは言い難い。
最初の設計時点でこのような利用をされることが「無い」と判断することは不可能なので、
別途特別な理由が無い限りは signed にしておいたほうが経済的。
>>730 boostのxmlパーサあたりとか同じような感じじゃね。使い方とか調べるの面倒くさいけど。
標準ライブラリがsize()でunsigned返す件について
ぶっちゃけfor分のループカウンタがunsigned か signedかなんでどうでもいい。 これを考慮してナントカする必要を感じるのは、この程度の違いで大問題を引き起こす新人に なにかさせる場合だけだな。
ポインタに加算して使うインデックスをsigned整数で扱うと値が小さい負数になったときに実行時エラーが出ない可能性がある。 unsignedなら極度に大きい値になるので多分segmentation faultが出るだろう。
>>770 馬鹿だろ
この程度で大問題を引き起こす言語だからこそ
プロでも数年に1度はやっちゃうし、その上
見つけにくくて困るんだよ
signedで扱える範囲なのに負は扱わないからunsignedでカウントしよう なんて考えること自体が馬鹿 プロなのにこの程度の問題を数年に1度やっちゃう奴は…
プロなら安全な整数クラスで置き換えるだろ
size_t max = sizeof(hoge); for(int i=0; i<max; i++)... みたいなので警告でて for(size_t i=0; i<max; i++)... と書き直すときの敗北感
size_t と ptrdiff_t の使い分けを真面目に考えるとややこしい
int setOppai( int oppai, bool chinko ) oppaiをセットするとき、ついでにchinkoもセットするんだけど 引数でchinkoが省略されているときは なにもしないようにしたい どうしたらいいかな 素直に別関数作った方がいいのかな
size_tはC/C++界最悪の発明
ちょっとした再帰をしたいときに引数に関数定義したいんだけど どうしたら簡潔に書ける?
ん? 再帰関数に関数ポインタ食わせる話?
テンプレート
引数に関数定義ならラムダ的なものじゃね?
787 :
675 :2012/07/23(月) 18:00:39.81
size_tて結構初歩的な問題抱えてるのね。勉強になったthx 長さ系の引数はとりあえずsize_tで統一しとくわ
暗銀は魔法もカット率100%だよ
size_tはunsigned long long相当で大きくて遅いコードになったりするからなぁ。
790 :
デフォルトの名無しさん :2012/07/23(月) 20:06:12.76
ちょっくらコンビニ行ってくる . △ △ ..----━━=≦[]≧=━━---- .----━━=≦[]≧=━━---- 〔 ]_. . п п _[ 〕 . { ≡|-二二二/ ̄ ̄\二二二-|≡ } . [II/ ∪^|ロ□|□ロ|^∪ ヽII] lロ ⌒ ロl (._。○。_)
for(int i=0; i<hoge.max(); i++)... っていうのは遅くなるからhoge.max()は外に出せ、みたいな話あるけど ループ外に出すと変数使ってうっとおしいんだけどいい方法ある? って聞こうと思ったけど、やっぱりいいや。
for( int i = 0, max = hoge.max(); i < max; ++i ) この程度でうっとおしいと思うならしらん
for(int i=hoge.max(); --i>=0;)... にする
やっぱりいいっつってんだろ
うっせハゲっ なら最初から書き込むな
覆水、盆に帰らず。 たまには正月に顔見せに帰ってやれよ。
抜けた毛は二度と戻らないもんな・・・
int→floatキャストってなんであんなに速いんでしょうか? 指数部を割り出すのに対数関数使ってるかと思うんですがlog(x)一回より何倍も速いし。
>>800 スレ違い。
普通、実数演算ユニット周辺に変換ロジックも実装されている。
iPhoneが規制されてるので自宅のノートパソコンを経由してにちゃんに書き込むプログラムを作りたいんですがいったいどうすればできるのか検討も付きません なにかヒントを教えてください
ノーパソに串鯖立てればいいだろ
>>802 自宅のノートパソコンに認証付きプロキシ入れてルーターでポート開放
VPNかSSHポートフォワーディング使うとより安全
あとは該当板へ
ありがとうございます しかし自分はサーバーの事とかよくわからないので Cとフリーのライブラリだけでできる方法を知りたいんです よろしくお願いします
ドキュメントが山ほどある既存のサーバープログラムのインストールすら出来ない奴が サーバープログラムを作ろうとするとか茨の道すぎるだろww
>>807 無線LANルータのプログラムなんて、そんなに文献無いだろ
>>808 意味不明なんだけど何で無線LANルータが出てきた?
>>808 丁寧な口調が剥がれてるぞ
知識ないんだったらあるやつの言葉に従っとけ
みんなネットワークとかどこで勉強してんだ プログラムの入門書はいっぱいあるのにそういう実践的な技術の本って本屋で見かけないんだけど
ネットワークの入門書を嫁よ…… 検索しろ
メソッドチェーンってどう思う? getChinko( index )->SetName("magnum")->SetSize("13cm"); みたいなやつ 例外を使いたくない環境下ではエラーを検知しづらくて いやなんだけど
SetSizeを"9cm"で呼び出すとうまく行くかも
ちんこが見つからなかったときにヌルポインタではなく 自前のヌルちんこを返す ってのがポイントなんだな
>>813 チェーンにする意味のあるメソッドならそうすればいい
無意味ならやらない方がいい
ヌルヌルちんこっていいな
もしかしてオーバーライドした関数って継承されない?
オーバーライドじゃねいオーバーロードだ
オーバーロードの継承を簡潔に書く方法を知りたい
using method;
Cから移行するのにC++とObjective-Cどっちが難しい?
cppが無ずいってかごちゃごちゃしててめんどい
>>824 アップル製品と(Windows or Linux)のPCどっちが好き?
別にどっちも難しくないよ。 問題は、作りたいものに必要なライブラリ次第だ。
>>823 あっれー出来たわ
なんで出来ないと思ったんだろおれ
コンストラクタにvirtualつけれんの?
仮想コンストラクタというテクはあるよ
>>828 派生クラスでもオーバーロードしたんじゃない?
>>826 Objective-CもC++もOS関係無いだろ
GNUStepといい、Objective-CはNeXTがMacに移るまで UNIX系で発展してる言語ではある むしろAppleとの馴れ初めは短い
馴れ初めじゃないな付き合いだな
837 :
デフォルトの名無しさん :2012/07/24(火) 21:25:28.63
>>824 CからならObjective-Cのほうが楽
Objective-C++てのもあるぞ
Objective-C++とか、改悪。。 なぜC++使わずにObjective-C使うのかがわからなくなる
>>837 え、そうか?
見た目が違うからかもしれないがC++より手こずったぞ
>Objective-C++ なにそのひし形継承みたいな
>>838 改悪もクソも移植用のブリッジだろ
アレで本腰入れて開発するつもりか?
クラスを配列で多数作ると、Array of Structureになってしまいますが、 そこのところをうまく、Structure of Arrayにする方法ってあるのでしょうか?
>>842 `SoAにしたいならすればいい。メンバとして配列を幾つか抱えればいいだけだから、
寧ろ書きやすいと思うが。一体、なにをどう「うまく」やりたいんだ?
それとも、こういうこと?
ttp://ideone.com/Kup5A VCの実装だとstd::arrayはスタックに確保される。
初期化ができるのは、デフォルトのコンストラクタが一切定義されてないので、POD構造体の初期化的なことができる。
>>846 何か警告が出る
..\Array2.cpp: In function 'int main()':
..\Array2.cpp:22:38: warning: missing braces around initializer for 'std::array<Vector<float>, 16u>' [-Wmissing-braces]
..\Array2.cpp:22:38: warning: missing braces around initializer for 'std::array<Vector<float>, 16u>::value_type [16] {aka Vector<float> [16]}' [-Wmissing-braces]
..\Array2.cpp:22:38: warning: missing braces around initializer for 'std::array<Vector<float>, 16u>::value_type {aka Vector<float>}' [-Wmissing-braces]
-std=c++0x付けてるんだが
あ、コンパイラはgcc4.7.1です
SoA<Vector<float>, 16> Data = {{{{0.f,}}}}; こうやったら警告なくなった SoAのVectorのarray[16]で、さらにVectorは要素が4つあるから4重カッコになるのか
>>849 GCCは使ったこと無いんで正直分からない。すまない。
VCも最近、規格追従度が微妙になってきたしなぁ。参った。
privateとかpublicとかって、なんて名前? なんとか識別子?
しゅーしょくしじゃないの?
よくわからんでし
アクセス修飾子とアクセス指定子、正しいのはどっち?
修飾子は修飾対象が必要。 C++の修飾対象とは宣言に伴うインスタンスの事。 だからそれらが当てはまらない指定子が正しい。
インスタンスってなんぞえtemplateの実体か?
JIS X3014に従うならアクセス指定子
クラス宣言の中でだけnamespace使いたいときはどうするの?
中でusing namespace
複数のインタフェースを継承させて Observeに利用したいのですが、 メンバ変数の衝突を、どうやって回避しようか悩んでます。 命名規則には、セオリー的なものはあるのでしょうか? --------------- class IHoge { virtual void up()=0; }; class IHoge2 { virtual void up()=0; }; --------------- class A :public IHoge ,public IHoge2 { void up(){} //<- どっちかわからない } 今は hoge_up()とhoge2_up() というメンバ名にすれば良いのかなぁと思ってるんですが、 もっと見栄えの良い方法はありますか?
多重継承なんてバグの温床なのにねえ
a->getChinko() で返ったポインタが使われる前と後を 自動で処理するいい方法ある? a->getChinko()->lock()->polish()->shoot()->unlock(); を a->getChinko()->polish()->shoot(); みたいな感じで済ます方法というか、うまくいえない
ポインタでなく値を返す
>>861 コードまでありがとうございます。
ここまでやらないとダメなのか…。
ミスが起きそうなので、
衝突したらIF側を変える方向でやってみます。
>>863 数人で組むにあたり、ぶつかったらどうしよう・・という流れでした。
いわゆる循環参照がよくわからん class A{ public: B unko; }; class B :public A{ public: int chinko; }; これってどうすればいいんだっけ
>>871 それ、一体何十年前の記事?
60fpsで数百回ってことは、高々秒間一万回前後でしょ。
そんなのんびりした関数で遅いの速いのなんてナンセンスでしょ。
つーか、本気で高速化を検討するなら、実測が基本よ。
遅いといっても許容できる程度なら考える手間が無駄 それともどんなに手間をかけてでも 1 ナノ秒でも速くしたい?
>>871 その関数内で大量にループ回してループ内でアクセスするならな
>>869 ポインタで自己参照体を持つしかない
class B;
class A {
public:
A(B* bp = 0) : unko(bp) {}
B* unko;
};
class B : public A {
public:
B(int i = 0, B* bp = 0) : A(bp), chinko(i) {}
int chinko;
};
int main()
{
B b(123);
b.unko = &b;
A* ap = new A(&b);
std::cout << ap->unko->chinko << std::endl;
std::cout << b.unko->chinko << std::endl;
}
>>871 件の記事のコードで試してみたけど、差が出ないわ。
つーか、アセンブリ出力見る限り全く同じコードになったよ。
>>871 そんな事を言っていたら仮想関数の呼び出しはどうなる
それにthisがレジスタに持たれれば関係ないだろ?
x86のようなレジスタが少ないCPUなら少しはコストが掛かるだろうが
x64で最適化を掛けてコンパイルすれば高い確率でthisをレジスタに
してくれるのでは?
>>877 件の記事の例くらい簡単な内容なら、それすら杞憂ですぜ。>876はx86ですから。
腐ったBCCでもthisをECXに入れたコードが生成された
だいたい
>>871 のコードは実数をフラグに使っていて、しかも実数の配列を
アクセスしてるんだろ?そしたらレジスタではなく必ずメモリ経由になり、まあ
L2キャッシュに乗る分もあるけど、メモリレイテンシが一番大きいのでthisなんて
コストはかき消されてしまうと思う
VC+SSE2ならこのフラグがXMMに乗ってしまう
で、配列は相変わらずメモリ or L1 or L2アクセス
thisのコストを引き合いに出したいのなら大容量の配列相手ではなく、double
も使わず、もっと整数のメンバ変数を多量に使ったプログラムにすべきだな
>871のリンク先は学生さんかな? teuって、パソコン通信の時代は一騎当千の奴が結構いたと思ったんだけどなぁ。
int A = ( B < C ) ? 1 : 0; って int A = ( B < C ); と同じ結果になりますが、 条件判定の結果は1(true時)または0(false時)であることが保証されていますか?
はい
884 :
882 :2012/07/26(木) 16:17:59.35
ありがとうございましたぁ!!!!
885 :
◆VD2btbRbPs :2012/07/26(木) 18:43:46.20
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define NODE_NUM 10 #define RAND_SEED 0x1031000 必要な関数・構造体の定義をここに書く int main(void){ struct BST_Node *T_root; int i; T_root=(struct BST_Node*)malloc(sizeof(struct BST_Node)); T_root->left=T_root->right=NULL; T_root->value=0; srand(RAND_SEED); for(i=0;i<NODE_NUM; i++){ insert_v(T_root,rand()/(double)RAND_MAX*NODE_NUM*10); } 木の高さや木の形をここで表示 } 補足 プログラムを書いてくださいますようお願い申し上げます [3] 環境 [3.1] OS:Windows7 [3.2] bcpad C++ [3.3] 言語:C 二分探索木の高さを調べる実験とその結果 提出期限:7月28日 12時まで
宿題は宿題スレへ
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define NODE_NUM 10
#define RAND_SEED 0x1031000
typedef struct BST_Node {
int value;
struct BST_Node *left, *right;
} _BST_Node, *P_BST_Node;
void insert_v(P_BST_Node n, int v){
二分探索木の生育方法をここに書く
}
int main(void){
P_BST_Node T_root = (P_BST_Node)malloc(sizeof(_BST_Node));
T_root->left = T_root->right = NULL; T_root->value = 0;
srand(RAND_SEED);
for(int i = 0; i < NODE_NUM; i++){
insert_v(T_root, 10 * NODE_NUM * rand() / (double)RAND_MAX);
}
木の高さや木の形をここで表示
}
続きは
>>888 さんどうぞ
馬鹿には無理
は?しねよ
宿題は宿題スレへ
891 :
デフォルトの名無しさん :2012/07/26(木) 19:31:46.47
糞コード晒してんじゃねぇよ
892 :
デフォルトの名無しさん :2012/07/26(木) 19:33:13.54
,r'^''=ァ- , -、 , -''´_,,r ''" _______.. 、、-ァr| i´_ ,r'_´__ _ _  ̄¨``…=''|-─ヒ!--−… '' "゛´ il「~lii r亠、 | ''rへ,、 |・._ | __.. 、、---‐─…! ├^ー‐_: =====━… , -| `´ |  ̄  ̄ ̄  ̄二ニ! ̄ |`¨ ̄ _,. -1 |¨¨i | _ | 。 ⌒L、 _ , 、-_''´‐''" _,ゝ._| /7 / `l | rz─=,ニ=-─===z二 ̄ _< _,. - ''" _」 = 「´ / .| . | ( ' ̄//  ̄`l¨`i ``T'F ̄  ̄丶. -<´ l凹 | / | | /´ ̄rュ`'ー┘ ° L0!_ r‐、 ` ''┴==-┴−-、__/ | …==i=(_ o 。 ° ロ  ̄ ‐┴-⊥., -‐- 、 _≦'、_ | |┘゙コド"−-、- - _ /F、-、 )イ ̄  ̄´  ̄ (O  ̄ ̄"``ー- 二 _  ̄ __王ニ-‐ ´ ̄´ r !!、 ̄ ¨¨ ̄(.○゙ ゙‐'-' //Λ_Λ | | | |( ´Д`)// <うるせぇ、オスプレイぶつけんぞ \ |
___ / \ / ─ ─ \ / (●) (●) \ | (__人__) | <こいよオラ!!オラ!! ,.゙-‐- 、 `⌒´ ,/ ┌、. / ヽ ー‐ <. ヽ.X、- 、 ,ノi ハ ⊂>'">┐ヽノ〃 / ヘ 入 ´// ノ } ,..,.._',.-ァ / `ー''"´ ,' c〈〈〈っ< / __,,..ノ ,ノヽー'"ノ { ´ / ``¨´ /´¨`'''‐、._ ,'\ ∨´ `ヽ、 ノ ゙ヽ ∨ ヽ _,,..-'" `ヽ ∨ 〈-=、.__ } ヽ、 } ``7‐-. / ヽ リ /′ ノ /′ , { / / { ! ,ノ ,/′ ! / / `‐-、 ! ,/ ゙ー''' ー---' ', / { } ゙Y `ヽ、 ゙ー--‐'
あなたが投げたオスプレイは、CVですか?MVですか?
>>863 多重継承由来のバグって、たとえばどんなの?
インターフェースの多重実装なんてザラだと思うんだけど。
bool operator==( const char* a ) const; 最後のconstってつけたらダメなの?
>>895 バグ以前にコンパイルエラーで気づくだろうにな
>>896 クラス定義内のメンバ関数宣言なら、いいよ。
>>898 なんかねー、constつけるとエラーになる
operator内でメンバ書き換えてんだろ
>>900 書き換えてないんだけどなぁ
まあいいや
constなんていらん
const付けないプログラマはクソ以下の存在
C++がキャストを試す順番って規定あるの?
>>899 相談に乗って欲しいならコードとエラーメッセージを出せ。
906 :
デフォルトの名無しさん :2012/07/26(木) 22:22:02.96
c++でOfficeファイルのバージョンを取得する方法知りませんか?
バイナリ解析してなんとかがんばる
どこで聞けばいいか分からないからここで聞きます 「Microsoft Visual C++ 2010」を使っているんですが デバッグ開始ボタンをしてHello worldを出力したら ちゃんと表示されているかを確認する前にウィンドウが自動で閉じてしまいます 何か設定がおかしいのでしょうか
Ctrl+F5
おー毎回getchar()かいてたけどcntrl f5、そういうのもあるのか・・・
ブレークポイントを使うナリよ ソースコードの左端の灰色になってる所クリックすると赤くなる
Releaseじゃ動かないナリー
男は黙ってlog出力
>>915 でもhelloworldのメッセージを見たいって話だからな
リダイレクトでファイルに出せばいい
>>916 それぐらいならパチスロやってれば余裕で見えるだろ
919 :
デフォルトの名無しさん :2012/07/27(金) 00:41:16.22
パチスロとか半島に金が流れるものに金使ってるイケヌマンがいるのはこのスレですか?
>>918 2chで質問する奴はジャグラーがペカった時に店員を呼んで目押しさせるのと同じ。
PrintScreenの動画キャプチャー版を使えば HelloWorldも捕獲出来るかも知れないぬ
2つのキーを持つmap がほしいです 2つのキーのうち片方で検索してリストを作るとか そういうことができるようにしたい
map<pair<key1, key2>, value>
>>924 key1で検索した結果のイテレータって、どう書く?
文字列の配列を作って、そこに検索追加削除をするようなとき 普通は文字列の配列を作るけど mapみたいに
map<key1, map<key2, value> >にしました。
ユーティリティクラスって、インスタンスを作られないようにした方がいい?
>>929 なんでそんなふうに思うの?「ユーティリティクラス」って言われてもよくわからんし。
>>929 用途によるだろうけど、
複数作ってマズイものはシングルトンにすればいいし、
そうでないものは過度の制限はしなくてもいいんじゃね?
用途はコメントに書いてもらえば多少マシかと・・・。
シングルトン死ね
で、でた〜シングルトン全否定やつwww
まー、シングルトンはグローバル変数とほぼ同じだと思うけど、複数作れないものはしょうがない。
>>930 Java生まれの用語かと思ったら、Java(Sun)は
コンテナーや簡単なアルゴリズムを提供するクラス群を
ユーティリティと呼んでた。
多分コボラーがクラスで関数を書くために考えた言い訳じゃね?
クラスにしないほうがいいと思う
>>934 中身が不定なI/O用や、中身が変わらないものだとだいぶ違うだろ。
関数の呼び出し先と、呼び出し元の相互で理解が必要な単なるグローバル変数は危険だが、
stdinとか、stdoutは、まず問題にならないからね。
個人的には、Singleton使うぐらいならMono State使うべきだと思う。
SingletonのInstance関数はC++の初期化順序云々の問題を
解決するためのものだけど実際初期化順で困る事ないし。
C++だと普通に関数提供すればいいわけで、まず要らないな。
つかJava専用だろ
わざわざクラス公開しといてインスタンス作れませんとかひとつしか作れませんとか、アホな話だよな。 ならはじめっからクラス公開すんじゃねーよ、と。
広域関数書けないくせに 10.Log( 10 ); とか書けない 欠陥言語の尻拭いだから・・・
944 :
929 :2012/07/28(土) 00:16:24.40
ありがとう ファクトリメソッドが必要だったんだけど、そうか、普通の関数でいいのか すっきりした
ホモですか?
人間は全員ホモだよ
シングルトンをshared_ptrで管理して不要になったら削除するようにすると メモリ効率がいいよ!
アホか?
shared_ptrである必要はないっちゃないけどね。 C++あんがい使いこなしてるやついないのはマジで驚くわー。
シングルトンはまだいいんだけど、 shared_ptr使って、インスタンス生成クラスがインスタンス管理を放棄するようになると、 可読性が落ちない? 集中管理前提で、安全なポインタを分けるってイメージならまだいいんだが。 といいつつ、boostを使ってると使わざるを得ないケースが多々ある・・
>>950 うちはもう生ポインタ使用禁止になったよ
ナマポ禁止か・・・
ゴム必須か・・・
循環参照にだけは気をつけろよー
>>953 そこは、もう働くしかないな・・・だろw
入れ子集合モデルのデータを、テキストに図にして表したいです。 コマンドプロンプトでtreeって入力した時に表示されるフォルダ構成の図が理想です。 お願いします。ご教示ください。
わざわざC++専用スレで聞かんでもいいがな 勢いがある初心者スレの方が丁寧に教えてくれるぞ
スタックオーバーフロー 日本語にすると再起不能
ED=勃起不能
>>960 たしかにスタックオーバーフローは
再帰不能になるな
963 :
956 :2012/07/28(土) 16:13:18.75
自力解決しました。 とても綺麗なソースで自分でも感動。
multimap のfindで、最初にキーがマッチしたもののイテレータが 返ってくるけど、it++したら次のはマッチするの?
そういう風にラップしたらそうでしょうね
基底クラスのコンストラクタを継承したときも必ず呼ばせるように 基底で工夫できることはありますか?
デフォルトにアサートでもしこんどけば?
>>967 基底のすべてで共通する処理は関数に書き出しておいてすべてのコンストラクタに呼ばせる。とか??
万能解ってあるんかな??
>>964 30秒しらべてみたが、
お前が望んでるのはequal_rangeじゃね?
972 :
967 :2012/07/28(土) 18:03:11.75
コンストラクタはなんか全部呼ばれますね。 すみませんコンストラクタじゃなくて普通の関数の場合の質問でした。
基底のコンストラクタに呼び出すように書いておけば
975 :
967 :2012/07/28(土) 20:38:53.65
クラス名と関数名を両方表示してくれる定義済みマクロって なんだっけか
__function__だっけ gcc拡張だろ
ブーストのやつはどうやって実装してんだろう
ideone.com/huV2b void* から インターフェースを継承していたら、 インターフェイスのf()を呼び出したいんだけど、どうすればいいでしょうか? TYPE_Aを作るしかないのかな
それよりqueryInterfaceした方が綺麗だよ
>>984 typeidはデマングル面倒くさいじゃないですかー! やだー!
XMLをきれいに整形して出力する出力ストリーム ってどこかにある? なんか構文解析とセットになってるのしか見当たらない
シリアライズ
コンテナの走査中に追加するのってどうやればいいんだろ 今見てるのを削除するってのはよく見かけるけど
コンテナの種類や追加削除の仕方によるがなるべくしないようにプログラムを設計するべき 削除はすぐにしないで削除フラグをつけるだけで 追加分はtempコンテナに貯めて置いて 走査が終わったら一気に削除追加するとかね
元コンテナとと別のコンテナ用意して削除不要な 項目だけコピーすりゃいいだろ。 線形探索で削除していくなら速度面じゃコストは無い。 むしろ早い場合もある位だ(特にベクター) よっぽどメモリーを消費するような場合じゃなきゃ 別コンテナでいい。
const static int な変数を継承したいんだけどどうしたらいいかな
整数ラッパーの継承で我慢しなさい
CRTPとか
995 :
デフォルトの名無しさん :2012/07/29(日) 19:26:07.99
const static char* はダメか
個人でiphoneアプリ、Windowsアプリをマーケットに売って生き残れ javaやlinuxは手間がかかる 一人でやるには手間がかかりすぎる 手間がかからないで一人で開発できて 人の多いところで直接販売できる仕組みが提供されているメーカ製言語だけやる ずばりiphone またはWindow 8 Metro App Store C# やるならメーカー製の言語 洗練された仕様 脆弱性が少なく 開発ソフトが優れ 課金ライブラリ アップデートライブラリが提供されていて 情報、書籍が多く開発しやすい 奴隷になりたければオープン系をやればいい 時間がかかり 人は多く 仕事の取り合い 足の引っ張り合い 脆弱性が多く 互換性がなく 癖があり 大規模開発中心 詳細設計しかやれない体になって年取ってぽいだ 独立もできない 手間のかかりすぎる仕様だから 派遣屋 IT経営者はその方が喜ぶ 大規模分割開発では使い捨てても独立はできまい 代わりはいくらでもいる 嫌なら辞めろ 若い派遣営業は舐めた態度をとってくる ひどいピンハネ オープン言語、日本独自開発の言語・フレームワーク ガラパコ携帯 javascript html5 android java linux python rubyやnode.jsとかやめとけ メディアに金を払ってステマ宣伝してくるが釣られて手を出しても情報は少なく手間がかかり スパゲッティコード 未完成 デスマに陥る コンパイルできないからパクられ 直接売る場所がないから企業に買い叩かれ金にならない 生きていけない奴隷仕様だ ここから抜け出すにはiPhone一択 またはWindow 8 Metro App Store(未確) C# Objective-CやC#を覚えるとサーバーサイドからクライアントサイドまでカバーでき人の多い場所でソフトを売る権利を得られる 仕事や趣味でこれらの言語をやっておけば派遣切りされても会社辞めることになってもソフトを売って生きていける それはセーフティーネットになる WEBサーバーIIS Win2008ServerVPS SqlServer Oracle MySql 言語はマーケットで売れるメーカー製のみ C#は自分用業務支援ツールとして使える 例えばPHPでWEBアプリを作っていて管理者画面はC#(EXEアプリ)で作るとかなり早く作れる(Smartyなんか使うよりもかなり早くだ)
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。