テンプレここまで。あと続けたい人は好きにして。 変更点 - 禿リンクを www.stroustrup.com に変更 - Libraries復活(順番間違えた。Booksよりこっちが先だった。)
struct edge; struct node { list<edge> edges; node_data data; }; struct edge { node * to; edge_data data; }; struct graph { vector<node> nodes; }; こんな構造でグラフを作ってます グラフの形状が初期化してから変わらないなら問題ないのですが これだと要素の追加削除に無駄が多い気がします もっとグラフの変形に強いデータ構造はないでしょうか
>7 疎なグラフならstd::map<Node, Node>でよろしかろう ここでNodeはノードを表す型で、std::map<key, value>が勝手に行うコピーに手当てされているものとする 疎でないグラフなら行列(隣接行列)でおk 行列表現のC++における最も良いやり方は知らん
9 :
8 :2012/08/25(土) 13:18:29.33
というより、グラフはノード(頂点)集合Vと枝集合Eの二つ組(V, E)で一意に規定されるのだから、 - Vのは、std::map<int, Node>で表してノードのキーからNodeオブジェクトを引けるようにしておいて、 - Eのは、std::map<int, int>でノードのキーの対として表現する 等の2段構えとするのが自然かも試練 詳細は何を効率よく行いたいかによる有効グラフはEの表現で工夫する
以下のコードが動くのは、環境依存ではなく、正しい挙動ですか その場合const性を保つために暗黙的にコピー動作に変更されているということでしょうか これをエラーや警告を出すようにすることはできませんか 特にaut const std::wstring STRING = L"hoge"; void f(const std::wstring &s) {} const std::wstring & e() {return STRING;} int main() { f(L"hoge"); auto a = e(); a.push_back(L'a'); std::wstring s = e(); s.push_back(L'a'); }
>>10 そこコードのどこについてどんなエラーや警告を出したいの?
仮想関数を持ったスーパークラスのポインタに派生クラスを入れて、 仮想関数を呼び出したいんだけどどうすればいいでしょうか? class SuperC{ virtual bool func()=0; }; class SubC{ virtual bool func(){ 何らかの処理 } }; int main(){ SuperC* super=new SubC(); return 1; } インスタンス化する予定はないのにSuperCのポインタは宣言できませんって言われる
class SubC:public SuperC{ です
public:
16 :
デフォルトの名無しさん :2012/08/25(土) 15:20:22.69
>>10 まずe()は、return STRING;であって return &STRING;ではないから、
e()の呼び出し毎にSTRINGがコピー(ていうか新規生成)されてそれがスタックに積まれて返される
(中略)
以降は呼び出し元の勝手
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
auto&としない限り参照で受けないわな
21 :
デフォルトの名無しさん :2012/08/25(土) 17:30:06.45
>>10 コピーをもろに要求する文脈だが?
変更なんかされてなく
関数側で型を指定しているのにそれが無言でスルーされるのはどうなんだ
ちょっと何言ってるかわかんないですねー
24 :
16 :2012/08/25(土) 22:40:17.16
>>10 >これをエラーや警告を出すようにすることはできませんか
>10なコードでコピーが起きるのは、e()が参照を返した後の話なのでe()の対策ではできない
エラーにしたいとしたら、STRINGをコピー不可能なクラスにすることが考えられる
例えば class wsrting2 : public std::wstring { private: wstring2(const wstring2&); /* delete */ };
というクラスを設け、>10なコードのstd::wstringをwstring2の置換する(std::wstringのかわりにwstring2を使う
他にもっと良い方法があるかもしれんが知らん
>>10 が本来やりたいことは
auto a = e();
じゃなくて、
auto& a = e();
じゃないのか?
C#のenumeratorのが便利だよな なんでiteratorにしちゃったの標準のアホども
28 :
デフォルトの名無しさん :2012/08/26(日) 22:21:19.55
// コンストラクタ CTest::CTest(int num) : m_num(num) { } ↑”:”を付けて右にm_num(num)と書いてあるんですが、これなんという書式名? ぐぐって調べたいが検索キーワードがわからん
>>30 増えなくね?
例えばvectorなら始点終点のポインタで普通は4*2=8
vectorに対するenumeratorを実装するとしたら
コンテナへのポインタ+現在位置へのポインタで4*2=8
あるいは始点終点へのポインタで同じく4*2=8
分離してるかしてないかってだけで実用上では同じサイズでしょ
より包括的なrangeコンセプトがある
rangeはめんどくさい 自作するときにかなりだるい enumeratorの実装は簡単だったなぁ
34 :
デフォルトの名無しさん :2012/08/27(月) 16:08:36.99
>>34 やっぱりかw
ぐぐっても出てこないはずだ
で、正解は?
member initializer list
初期化子リスト
自作のコンテナやイテレーター、アロケーター、ファンクタなどを作る時のガイドラインってどっかにないですか? STLが期待してるクラス内のtypedefとかメンバ関数とか制約をきっちり理解したいです
>>40 規格書のほうは有料(?)っぽいのでとりあえずリファレンス読んでみます。どうもでした
輪廻のラグランジュ があるんだから 輪廻のStroustrup もあっていいと思う
規格書のハッシュありますか?
随分難解なポエムをお求めですね
これって駄目なんだね なんかハマって脱力した struct Base { protected: void Function(){} }; struct Derived : Base { Derived(Base *b) { Base::Function(); // OK b->Function(); // NG } };
bは他人なんだから触れないに決まってる
47 :
デフォルトの名無しさん :2012/08/29(水) 01:03:21.50
>>45 割愛したコードに究極の馬鹿が隠れていそうだな
多分、組んだ奴的にはProtectedで継承したFunction()が動くと思ってたんだろうな 実際には継承した方を完全スルーして引数で受け取った方を動かそうとするから・・・(ノ∀`)
protected は中途半端。制御としては中途半端。 「見えちゃ嫌だけどちょっとは見えたほうが」 そんなの微妙すぎ。
でもこれはいいんだろ? 糞が氏++ね struct Derived : Base { Derived(Base *b) { Base::Function(); // OK b->Function(); // NG static_cast<Derived*>(b)->Function(); // OK } };
>>50 無理キャストを通すやつが悪いに決まってる。
ふーん
54 :
デフォルトの名無しさん :2012/08/29(水) 09:06:53.06
>>50 dynamic_cast でないと危険だろ
>>49 friend好きは卑屈過ぎます 自分に自信がない証拠です
名前空間は決して怖くなーい 勇気を持ってください
C++だけの話じゃないんでここで聞いていいかわからないんですけど メンバ関数ってなんでわざわざ struct Obj { void Method(void); }; Obj obj; obj.Method(); っていうふうにドットつけて書くんですかね? struct Obj { void Method(Obj & obj); }; Obj obj; Method(obj); みたいな仕様ではダメな理由でもあったんでしょうか?
58 :
デフォルトの名無しさん :2012/08/29(水) 12:34:20.98
>>57 禿本には両者がほとんど同じと書いてある
おまえさんのご希望は ADL がかなえてくれるかも知れない
>>57 なんだか後者だと「クラスが引数な関数」っぽい……
>>57 わざわざ?
メンバー関数に同じ引数をわざわざ繰り返し書くよりもドット1文字で済む方が楽に決まってるじゃん
C++/CLIについて質問です。 C++からC++/CLIのクラスライブラリ(dll)を使うことは可能なのでしょうか?
c++ではまず無理です
む、、、無理なんですか・・・orz 困った...
>>57 主語述語が逆転したみたいだな
唐突に出てくるメソッドが正体不明で気持ち悪い
そこまで嫌わんでも
関数ポインタとメンバ関数ポインタで区別しなくていいから関数スタイルのがクール
メンバ関数ポインタを使う時点でクールじゃない
メンバー関数ポインター型はきもい
71 :
デフォルトの名無しさん :2012/08/29(水) 18:41:18.74
禿も間違えるんだよ 「ほとんど同じ」とか言いながら virtual と多重継承でぷーくすくす
yeild return便利やなぁC#最高 C++も少しは見習えよって思うよね
>>62 お前みたいなバカがやると盛大にメモリリークするから辞めておけ。
74 :
デフォルトの名無しさん :2012/08/30(木) 00:33:04.20
vectorにstringを200万行程度入れるのは問題無いのにclearする時にフリーズしたかと思うほど遅くなるような現象に遭遇した人はいますか?
はい
76 :
デフォルトの名無しさん :2012/08/30(木) 00:42:00.58
解決方法などわかった教えてください。原因がさっぱり想像できない状況です。
嫌です。
DBにツッコンドケ
そりゃ200万回メモリ開放するんだから重いに決まってんだろ・・・
80 :
デフォルトの名無しさん :2012/08/30(木) 01:43:02.72
一気に開放する良い方法ってないんですか?
プールから使うように仕込む
固定長にして std::vector<char> にする
固定長にするならarrayのほうがよくない?
>>82 バッファを一箇所にしてnull文字とかをデリミタにして区切るってこと?
固定長にする理由は?
>>83 その場合、素直に実装すると
バッファ長に対する実使用量をみるのに毎回ループかけることになる
>>74 入れるときよりclearのほうが時間掛かるってこと?
それぞれ計測してみた?環境は?
カスタムアロケータ使えよ 1MB程度のブロック単位でmallocして、それを切り分ければ まとめて解放出来るだろ
88 :
デフォルトの名無しさん :2012/08/30(木) 11:04:10.11
皆様、色々アドバイスありがとうございます。
>>86 reserveして入れていますが、入れるときは30秒程度、clear時は10分以上かかります。
環境はWindows Vista SP2 Visual Studio 2010 SP1 です。
簡単にstring使ってましたが、そもそもstringを使うこと自体がこの規模だと厳しいのですかね?
VS2008だけど1秒もかからん
>>88 デバッガの上で動かすならせめて _NO_DEBUG_HEAP を設定してから測れ
デバッグ状態だとLFHとかの高速アロケータOffになんだよ
93 :
デフォルトの名無しさん :2012/08/30(木) 13:32:24.51
>>92 _NO_DEBUG_HEAP=1で瞬時に解放できるようになりました。
ありがとうございました。
94 :
デフォルトの名無しさん :2012/08/30(木) 13:48:06.52
アクセサなど、1行メソッドが大量にあるクラスを書くのですが、 そういうロジックって、ヘッダファイルに書く?それともcppに書く?
短くてinlineでよくて変更があまり無さそうなのは基本的にヘッダに実装書いてる
struct IHoge { virtual void Func() = 0; }; struct IFuga { virtual IHoge GetHoge(void) = 0; }; インターフェースを返すメンバ関数を持ったインターフェースを作りたいんですがうまくいきません なにかいい解決法はないでしょうか
97 :
デフォルトの名無しさん :2012/08/30(木) 17:40:44.81
ポインタで返す
>>83 >>84 ちがうちがう
各文字列を固定長にするだけ
文字列の個数は可変長
>>96 お前頭おかしいんじゃね?
何がHogeだよ。
お前みたいなキチガイにプログラム組んでもらわなくても誰も困らないからさっさと消えろ。
>>99 HogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHoge
HogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHageHogeHogeHogeHoge
HogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHoge
>>96 hoge使っても異常だって気付かないんでしょ?
だから自分のコードの異常にも気付かない
お前本当にゴミだな
C++の規格書って更新どれぐらいの頻度であるんですか? 今はC++11となってるみたいなんですがこれもう買っちゃっていいんですかね?
またhogeに憎悪を抱くキチが湧いてるのか
104 :
デフォルトの名無しさん :2012/08/30(木) 20:51:28.33
>>96 =本物のヴァカ
そりゃまともなコードも書けないだろ
親がDQNだと
>>96 みたいなヴァカが生まれる
世の中に直接的に迷惑をかけるのは
>>96 だけど
原因は
>>96 の親
>>96 の親は世の中にとって産廃並の不要物
99=101=104はhogeが原因で家族が死んだりしたんだろうな・・・ 同情するわ。
107 :
デフォルトの名無しさん :2012/08/30(木) 21:12:56.72
クロスキャストがしたいだけか
>>102 ISO標準の承認(C++11)まで行ったから買っちゃっていいよ
webで修正版の規格がタダで公開されてるが
またhoge厨が沸いてたのか キモすぎ
N3337は正式規格後のドラフトで、違いは誤字や記述の修正だけ。 N3338で変更点が列挙されている。
hoge Hなオージー
HでOGEレツ
N3337とN3338を読めばおkってことですか? 正式版って買う価値なしってことですかね
誰が読むんだかわからないJISは今回の改定大変だな 割に合わないし廃止になったりしないんだろうか
120 :
デフォルトの名無しさん :2012/08/31(金) 20:14:31.95
翻訳やりたいやつ大勢いるだろ 狭き門で募集かければ総額バカ安でできるぞ
>>120 品質重視に決まってるから「一応」業者に依頼すんじゃね、知らないけど
データメンバa, bを有する自作クラスFooをストリームに出力するために std::ostream& operator<<(std::ostream& stream, const Foo& obj) を定義したとして、その中で stream << obj.a << obj.b; と書いたとき、下記のsetw()の効き方はどうなるのが正しいのよさ? Foo obj; std::cout << setw(16) << obj; VC++ 2008だと、obj.aの出力のみにかかっているような気がしてならないんですが、 std::ostringstream等で一つの文字列にまとめる以外の回避策はありますか
JISって普及させなきゃ意味ないのに 今時PDFがスキャン画像
検索はできるぞ。 OCR付きで自炊したPDFみたいな感じ。
>>122 自己解決しますた、
obj.aとobj.bの表示幅がそれぞれwa, wbとして事前に与えられる(固定長等)として、
これでおk
int w = stream.width; // (1)
stream << setw(w - (wa + wb)) << obj.a << obj.b; // (2)
さもなくば、std::ostringstreamを使わざるを得ない:
std::ostringstream ost;
ost << obj.a << obj.b;
stream << ost.str();
ユーザー定義型変換等でobj.a, obj.bがstd::stringに変換可能なら、std::stringの連結でも可
ストリームの用途からして、(1)と(2)の間に他スレッドがstreamに出力するケースは
考えなくて良いよね
OO特有の第一引数マンセーじゃない?
テンプレートにお詳しい方に伺います。 メンバ変数のオフセット値を取り出す際、現状以下のような関数を定義して取得しているのですが、 この変換を静的に解決してテンプレート引数として使いたいのです。 どうすればいいでしょうか template<typename U,typename Class> unsigned int offset( U Class::*address32 ) { union { U Class::*pointer; unsigned int t; }imp; imp.pointer = address32; return imp.t; };
129 :
デフォルトの名無しさん :2012/09/01(土) 18:59:18.37
素直に offsetof 使ったら?
>>129 ありがとうございます。
offsetofはインテリセンスとも相性悪いのがちょっと・・・
あと、考えてみたらオフセット値はテンプレート引数にはつかないですね。
すみません、質問閉じます。
×つかない ○使えない
C++でoffsetofは御法度だろ。 肛門にチンコを挿入するような演算子を使えよ。
>>132 >肛門にチンコを挿入するような演算子を使えよ。
*← こんなのか?
メンバ変数ポインタを使えという事か? C用に定義された可変長構造体の 固定長部分のサイズを取得するのに offsetofは使わなくもない
ttp://ideone.com/WaqyD このコードにおいて同じ文で生成されたオブジェクトは後に生成されたものから破棄されています
この動作はC++規格で決められている動作なのでしょうか もしそうであるならば規格のどこに記述がありますか
>>135 12.2 Temporary objects
C++ではリファレンスで束縛されない一時オブジェクトの解体は 完結式の評価の最終段階で行う (12.2p3) c.f().f().f().f().f(); の終わりで解体 基本的に変数は生成された逆順で解体される(12.2p5,3.7.1-2,3.6.3,6.7) かな?
ふんふん
>>137 乗っかるようで申し訳ないけど、ふと疑問に思った事があります。
「リファレンスで束縛」のところなんだけど。
もしかして、関数の戻値で値返ししているような一時オブジェクトも、リファレンスで受け取れる仕様だったりする?
string getName() {return "moemoe";}
const string& s = getName();
もしかして、これ合法?
141 :
デフォルトの名無しさん :2012/09/02(日) 14:18:56.50
ムブコンがいる
典型的なJava脳なのですがJavaでやってたことをC++に移植したいと思った場合、 これだけ覚えておけばいいよってことはなんですか? どの入門書、解説ページ見てもストリームと演算子オーバーライドから始まって、 こんなん使わない、sprintfでいいやんとしか思えないのです。 やりたいこと等 ・Javaで作ったSwingアプリをGDIアプリに移植したい。 ・C言語の基本構文は知ってる、ポインタと修飾子はよく知らない ・GDIについては自分で調べる ・Javaのライブラリは三角関数(Math)のみ使用、文字列は使わない。
>>143 >ポインタと修飾子はよく知らない
ここを改善すればよい
>GDIについては自分で調べる
Windowsベースなら、それはそれで茨の道だが、とりあえずポインタだ
>>142 ありがとう。
知らなかった。
割りと避けてたかも。
これで安心して規格書漁れるよ。
有るか無いかすらわからない情報を探すのが、一番骨が折れるんだよね。
>>144 まぁだいたい分かってると思うんですが、学習経験と実務経験がないから自信がないって感じですかね。
Javaは新入社員研修でIBMのネット教材を思いっきりやらされたから自信があるまでに理解できたけど
C/C++はテキスト見ながらだと危うく感じてしまいますね。
ま、理解できたつもりでやってみます。
147 :
デフォルトの名無しさん :2012/09/02(日) 22:19:04.43
>ま、理解できたつもりでやってみます。 危うい・・
148 :
デフォルトの名無しさん :2012/09/02(日) 22:25:54.93
g++4.6.3 で、constexpr を使いたいのですが、 main 関数内の f2 を constexpr にするとコンパイルが通りません。 何が問題なのか教えていただけないでしょうか。 #include <iostream> #include <initializer_list> struct Foo { constexpr Foo() : p0(), p1() {} constexpr Foo(std::initializer_list<int> list) : p0(*list.begin()), p1(*(list.begin()+1)) {} constexpr Foo(const Foo& bb) : p0(bb.p0), p1(bb.p1) {} int p0; int p1; }; constexpr Foo operator | (const Foo lhs, const Foo rhs) { return Foo{lhs.p0 | rhs.p0, lhs.p1 | rhs.p1}; } int main() { constexpr Foo f0{1,2}; constexpr Foo f1{4,8}; const Foo f2(f0 | f1); // OK // constexpr Foo f2(f0 | f1); // NG std::cout << f2.p0 << std::endl; std::cout << f2.p1 << std::endl; }
>>148 エラーメッセージ嫁。意味がわかんないなら貼れ。
150 :
148 :2012/09/02(日) 22:51:17.98
以下、f2 を constexpr にしたときのエラーメッセージです。 tmp.cpp: 関数 ‘int main()’ 内: tmp.cpp:21:26: in constexpr expansion of ‘operator|(Foo, Foo)(Foo((* & f1)))’ tmp.cpp:21:26: in constexpr expansion of ‘Foo(std::initializer_list<int>(((const int*)(&{(((int)lhs.Foo::p0) | ((int)rhs.Foo::p0)), (((int)lhs.Foo::p1) | ((int)rhs.Foo::p1))})), 2ul))’ tmp.cpp:21:26: エラー: ‘(std::initializer_list<int>::const_iterator)(&{5, 10})’ is not a constant expression
>>146 お、java やってて、後から c やったときの、まごついたところをレポよろしくです。
自分はc/c++やってて今java/c#に苦戦中
>>148 ,150
std::initializer_list<T> の size() も begin() も end() も constexpr 宣言されてないからダメ。
18.9/1 ね。
153 :
148 :2012/09/04(火) 00:17:39.30
>>152 ありがとうございます。
そうなると、配列を含むクラスのコンストラクタを constexpr にするには他の方法を使わないといけませんね。
>>153 std::array でいいんじゃないの?
155 :
デフォルトの名無しさん :2012/09/04(火) 13:43:47.09
CopyFile関数でファイルを10個ほどコピーしています すると10個のファイル転送が終わるまで処理が止まってしまいます。 コピーしろって命令だけ出した状態で直ぐに関数を終わりたいのですが そのような関数はありますか?CopyFileExというのを見つけましたが これはコピー中の経過が見えるだけで関数が待つという点で同じみたいです 出来れば別スレッドでコピーを実行とか難しいので非同期にコピーしてくれる関数がしりたいです よろしくお願いします。 サンプルソース for(i=0;i<10;i++) { CopyFile(src[i], dst[i]); //ここを非同期Copyにすり替えたい }
hoge.batファイルにcopyコマンド10個書き込んで system("hoge.bat");ではいかんのか?
>>156 hogeとか書いてる基地害はさっさと失せろ
お前マジで頭おかしいよ
自覚ないみたいだけど
まーたhoge厨かw hogeだってよwwwww ヴァカじゃねwwwwwwwwwwwwwww
出来ませんので別スレッドでやってください
160 :
デフォルトの名無しさん :2012/09/04(火) 14:15:40.36
非同期コピーありそうでないんですね 素直に別スレッドでやることにします
161 :
デフォルトの名無しさん :2012/09/04(火) 14:24:29.97
C++のスレでバッチファイルの話をする池沼
>>156 。
Hoge使ってる奴の池沼率は異常に高い。
今回も例外ではなかった。
具体的な対案示さずに批判とな?
>>162 hoge使わなくてもcopyfileとかcopyasynchronousとかいくらでもあるだろ
思考停止してんのかこいつ
ハッシュ関数って奴のオススメの関数教えてください。
165 :
デフォルトの名無しさん :2012/09/04(火) 14:49:42.16
どうでもいいよ無能ども
168 :
デフォルトの名無しさん :2012/09/04(火) 15:10:23.44
hogeを見ると発狂するアンタッチャブルが住み着いてることは分かった
>>169 >アンタッチャブル
それってむしろスルー力高すぎる奴じゃね? TCG的に考えて
またhogeに憎悪を抱くキチが湧いてるのか
.NETではそれなりのファイルコピーが用意されてるっぽいね
ユーザーインターフェイスを表示するためにUIOption.AllDialogsを指定し(デフォルトでは表示されない)、
ユーザーがキャンセルしても例外(IOException)をスローしないようにUICancelOption.DoNothingを指定し(デフォルトでは、例外がスローされる)
//参照にMicrosoft.VisualBasic.dllが追加されている必要がある
Microsoft.VisualBasic.FileIO.FileSystem.CopyFile(
"C:\test.txt", "C:\test1.txt",
FileIO.UIOption.AllDialogs, FileIO.UICancelOption.DoNothing);
ttp://dobon.net/vb/dotnet/file/filecopy.html
>>174 これで試したら非同期コピーできたよ
簡単だし、途中でキャンセルできたり上書き確認もあったりで至れり尽くせり
176 :
デフォルトの名無しさん :2012/09/05(水) 23:21:52.92
177 :
デフォルトの名無しさん :2012/09/05(水) 23:23:17.76
>>176 ですが、popenは使いません。
CreateProcessを使うやり方でお願いします。
よろしくお願い致します。
>>177 CreateProcessはファイルアクセスには無関係だろ。
単にファイルをunicodeで読み出せばいい。
179 :
デフォルトの名無しさん :2012/09/05(水) 23:42:40.65
>>178 え?
知りたいのはc++プログラムから外部のexeを実行して標準出力を取得する方法です。
ファイル開いて中身を読むのではありません。
単純に考えて 1.外部exeをUnicode出力するようにする 2.一旦sjisで受け取り、mbtowc()などでUnicodeに変換する
外部exeのUnicode出力は、自分のプログラム側でなんらかのメソッドを使うことにより可能になるのですか?イメージがわかないのでサンプルか参考ページかあると助かります。
外部exeが自作でなければ1の方法は使えない
2の方法は、一旦ReadFileでマルチバイトで受け取り、その後Unicodeに変換するということですよね?Unicodeに変換する際に情報が足りず文字化けするということはないですか?
Unicode→sjisは変換不可能な文字はあるが sjis→Unicodeは問題ないんじゃないかな。実際にやってみないと分からんけど 気をつけるのはsetlocale(LC_CTYPE, "")しとくくらいか
GC以外に循環参照をうまく扱えるイディオムてないですか 複数のノードが無向グラフを組むように互いに参照しあっています 外部からどれか一つでも参照されるノードがあればグラフ全体が生きて 全てのノードが参照されなくなったら即メモリなどのリソースを開放しなければなりません
weak_ptrは?
>>186 いろいろ試しましたがうまくいきませんでした
Windowsはワイド文字変換のAPIがあったよね C++標準のとどう違うのかは知らないけど
ロケーション 文字コード ワイド文字 この辺の扱いが難しい とくにロケーション
>>185 循環参照関連で面倒なら、GCに頼った方がいいんじゃね
アプリ全体の言語変えるのがアレなら
割と高速なGC持ち言語を(Lua, V8/JavaScript)を
組み込んで使うのも手
>>184 wave sign 問題とか minus sign 問題とか
以下のコードでエラーが出て困っています。
http://codepad.org/IDIXMH8z エラーの内容は以下の通りです。
1>Landform.obj : error LNK2019: 未解決の外部シンボル "public: void __thiscall GameObject::SetBody(class b2Body *)" (?SetBody@GameObject@@QAEXPAVb2Body@@@Z) が
関数 "public: __thiscall Landform::Landform(class b2Body *,struct b2Color const &)" (??0Landform@@QAE@PAVb2Body@@ABUb2Color@@@Z) で参照されました。
1>C:\workspace\C++\VC++\Practice\Debug\Practice.exe : fatal error LNK1120: 外部参照 1 が未解決です。
Box2D.hは
http://box2d.org/のものですが 、あまり関係ないような気がします。
こちらVC++2008、マルチバイト文字セット使用です。
vc++に強く関わる問題ならそちらのスレで聞きます。
inline関数をcppで定義すな
とりあえずinlineを外しましたがエラー内容は変わりませんでした。
ツリーに使える再帰イテレータ ってどうやって
>>192 ライブラリをリンクしてないだけじゃない?
>>196 どのライブラリが必要なのでしょう?
Box2Dならstdafx.hに
#ifdef _DEBUG
#pragma comment(lib, "Box2D_d.lib")
#pragma comment(linker, "/NODEFAULTLIB:MSVCRTD.lib")
#else
#pragma comment(lib,"Box2D.lib")
#pragma comment(linker, "/NODEFAULTLIB:MSVCRT.lib")
#endif
と記述し、stdafx.hは全てのファイルでインクルードする設定になっています。
GameObject.cppとLandform.cppなら静的ライブラリ化していません。
197です。 stdafx.hの #pragma comment(linker, "/NODEFAULTLIB:MSVCRTD.lib") をコメントアウトした所リンクに成功しました。 お騒がせしました。
可変長ビット配列を効率よく扱える純粋なC++用ライブラリは無いでしょうか。 無ければ自作しますが、今やってる作業はできるだけ中断したくないので、 できれば既存のライブラリを使いたいです。 求めている機能・性能は下記のものです(括弧内は例です)。 ・2進数を表現した文字列による初期化(Bits bs("1011001001101")) ・インデックスによる1ビット単位の高速リードアクセス(if (bits[3] == 1) ) この2つが満たされれば、他の機能・性能は特に要りません。 初期化以降リードオンリーでも、リサイズが非効率でもかまいません。
ブーストでええやん
文字列からの変換は自作してstd::vector<bool>を注意深く使うとか
>>199 boost::dynamic_bitset
これ以上の物を見た事がない
libcのstd::tr2に入れられてるし次期標準になるのかもね
んなくだらないサポートは要らんからはよLINQサポートしろや糞標準委員
threadじゃだめなん(´・ω・`)
208 :
199 :2012/09/07(金) 07:12:39.15
アドバイスや提案ありがとうございます。
用件を全て満たし、かつ使いやすそうだという事で、
>>203 の boost::dynamic_bitset を採用することにします。
イテレーターカテゴリの話なんですけど デリファレンスでコンテナの中身への参照をそのまま返すのではなく なにか他の型のテンポラリオブジェクトを返すようなイテレーターって ランダムアクセスできようがなんだろうがカテゴリはoutput_iteratorでいいんですか? 例えば template <class Proxy> class MyIterator { std::vector<MyClass>::iterator i_; public: Proxy operator * (void) const { return Proxy(*i_); } // ry }; std::vector<MyClass> vec; MyIterator<Hoge> i = vec.begin(), j = vec.end(); while(i != j) { *i = MyClass(); // コンパイルされるがテンポラリへの代入なので意味ない。あるいは型によってはコンパイルエラー ++i; }
210 :
209 :2012/09/07(金) 12:15:20.22
すいませんoutputではなくinputに置き換えて読んでください
int a = 1; と int a; a = 1; で意味が異なるのはどうすれば直せますか?
int a(1);
意味不明
意味が異なるってどういうことだ?
初期化と代入ってことじゃね
>>211 なるほど
もしやと思ってたんですがやっぱり標準に問題があったんですね
初期化と代入で究極的に生成コードに差異があるとでも? 意味論は読み手の問題では?
最悪コンパイルエラーなるやろ 重要やで
#define int MyIntClass
VC++2010 でヘッダファイル作って適当にコード書いたら、 class という文字のところに波線が表示されて、次のエラーメッセージが出た。 (エラー一覧ウィンドウに警告ではなくエラーとして表示された) 「Intellisense: PCH 警告: ヘッダーの停止はマクロまたは #if ブロックには配置できません。 Intellisense PCH ファイルは生成されませんでした。」 後半の Intellisense PCH ってのはよく分からんけど、 たぶんそんなファイルは必要ないだろうから、どうでも良い。 (今まで使った記憶が無い) ただ、前半のヘッダーの停止の意味がよく分からない。 ヘッダーの停止って何? 停止も何も、初めから動かないと思うが。 ヘッダーって内部的には、コンパイル時に #include <...> が ヘッダーファイル内の文字列に置換されるだけなんじゃないの? 書いたコードは次のもの。 #ifndef TEST_H #define TEST_H class Container {}; #endif たったこれだけ。
>>218 RAIIの意味が理解できないロートル乙
225 :
デフォルトの名無しさん :2012/09/07(金) 20:39:04.55
>>209 Hogeとか使ってる精神異常は失せろ
ゴミが
>>223 インクルードしてる側のコードも晒して。
C++にはガベージコレクションないからなあ
自分の書いたコード以外で勝手に動かれると何か気持ち悪い…
>>227 いや、まだどこにもインクルードされていない。
Win32 コンソールアプリのプロジェクトを新規作成して、
test.h ファイルを新規作成して、
>>223 のコードを書いたらこうなった。
(正確に言えば、コードにはもう少し空行があるが、ここに載せるために縮めた)
ちなみに、#ifndef #endif のペアじゃなく、#pragma once を使ったら、
このエラーは発生しなかった。
じゃあ #pragma once でいいじゃんと言うことだが、納得いかない。
>>218 初期化と代入はいくら区別してもしすぎることはないんじゃわー
一般にaへのbの代入は初期化済みのaが存在するからこそ成立するし、
aが保持するリソースの適切な処置(開放等)を伴う
究極的には初期化が無ければプログラミングは成立しないが
代入は無くてもプログラミングが成立し得るという違いがある
>>233 私のプロジェクトには stdafx.h などというファイルは存在しないが、
stdafx.h を作れという意味?
環境に依存しない言語仕様の問題の質問だと思うのですが、 ある関数が呼び出されたとき、その関数を呼び出したのが「誰」かによって 動作を変更することは可能でしょうか?
呼び出した人を引数で渡せばイイよ
なんか、セックスしたら逆に尿道異物挿入されたみたいで気持ち悪いなそれ・・・・・
>>232 >代入は無くてもプログラミングが成立し得る
関数型の考え方ですね。いまちょっと苦闘中‥‥
>>235 呼び出し先Aにしてほしいことをサブ関数にまとめて、そのサブ関数のポインタを呼び出し先Aに渡す、というのはよくみる光景かと。
コールバックか なる
241 :
デフォルトの名無しさん :2012/09/07(金) 23:02:08.98
> 代入は無くてもプログラミングが成立し得る メモリマップド I/O をどうやって成立させるんだよ アセンブラに逃げるという答えは聞こえねえぞ I/O でなくてもメモリそのものへのアクセスサイクルすら同じことで 代入の変形でしかない初期化だけで満足してるようならおめでたいぜ
>>241 外界は移ろい行く世界であるから破壊的代入の世界なんじゃわー
したがって、I/Oまで非破壊的代入で通すことはとうぜん無理が大きい
しかしそんなことはプログラミングする上では瑣末な事柄であって
代入を含むアルゴリズムが皆初期化だけでも書けることが重要なんじゃわー
代入のかわりに初期化を使うと何がうれしいかと言うと、マルチスレッドがメチャ安全に実現できる
言い忘れたがっていうか捕捉するが、 >I/O でなくてもメモリそのものへのアクセスサイクルすら同じことで チューリングマシンはチューリングマシンを模倣する能力があり、 かつチューリングマシンとチャーチのモデルは等価なんじゃわー したがってプログラミングする上ではどっちでもおk 外界やメモリや無限の長さの磁気テープが破壊的代入の産物であることは 事実ではあるが、漏れが初期化だけで満足することを全く妨げない
244 :
デフォルトの名無しさん :2012/09/08(土) 00:02:01.18
TCB が初期化だけで書けるか? operator new ですら初期化だけでは無理なのに
245 :
デフォルトの名無しさん :2012/09/08(土) 00:03:52.83
>>17 一ヶ月ぶりに来たけど、まだあって安心した。
テンプレート引数を特定のクラステンプレートに制限することはできますか? 例えば template <int N> class A { ・・・ }; template <typemane T> class B { ・・・ }; これで、クラステンプレートBのテンプレート引数に設定できる型を クラステンプレートAの実体化された型に限りたいです。 つまり、 typedef A<3> a; typedef B<a> b; // ok typedef B<char> b2; // コンパイルエラー このようになってほしいです。 できるでしょうか。
>>244 そんなことは知らんが(普通はTCBなしくみの上に非破壊代入のみの世界を作る・・・(1)
書こうと思えば書けるまずTCBはつまるところタスク間の同期管理のしくみである同期しなくて良いなら
単にシングルスレッドなプログラムがタスクの本数分、ということでタスクの初期化(生成)だけで済むことは自明
で、破壊的代入なプログラミングで書かれたタスクA、Bの同期というのはAとBの状態が揃ったとき
先に進むということに他ならない
そうした言語では1行1行の実行が無限長の磁気テープか有限状態制御部の状態遷移を伴うからである
これの非破壊代入版への単純な翻訳ではそれが全てタスクの部分に相当するプログラムの新規生成となる
生成に要する引数が揃わねば次のプログラムを生成できないのであるから、理論上そこで同期せざるを得ない
(まあ徹底的に非破壊代入にそろえるとこうなってしまい、マルチスレッドの概念からして覆ってしまう
>242の最後の行はここまですることは意図していない(1)のケースにおけるメリットを述べたもの
できるよ
249 :
デフォルトの名無しさん :2012/09/08(土) 00:29:56.25
非破壊とは const のことか? unko& unko::operator = (unko&&) const { return *this; }
>>248 どのように記述すれば良いのでしょうか。
>>250 質問に答えが返ってきてから後出し質問するなよゴミ
どんな教育受けてきだんだ
お前の親はマジで人間のクズだな
>>251 クズ呼ばわりされては親に申し訳ないので新規に質問します。
>>246 は忘れてくださるとありがたいです。
テンプレート引数を特定のクラステンプレートに制限する方法が知りたいです。
例えば
template <int N> class A { ・・・ };
template <typemane T> class B { ・・・ };
これで、クラステンプレートBのテンプレート引数に設定できる型を
クラステンプレートAの実体化された型に限りたいです。
つまり、
typedef A<3> a;
typedef B<a> b; // ok
typedef B<char> b2; // コンパイルエラー
このようになってほしいです。
記述方法を教えていただけないでしょうか。
253 :
デフォルトの名無しさん :2012/09/08(土) 01:02:42.87
自分に都合の悪いことは忘れろとか基地害?
一般的には、テンプレート引数に制約を設けるには コンセプトという機能(C++0xに入る予定でキャンセルされた) がないと難しいような。
>>252 template<typename T> IsClassA { static const bool value = false; };
template<int N> IsClassA<A<N> > { static const bool value = true; };
みたいなメタ関数を作ってBの中でstatic assertする。
インスタンス化は防げるけど、型はとれちゃうんじゃ
template<typename T, typename U=enable_if<IsClassA<T> >::type> struct B {}; ならいけると思う
w
#include <hoge.hpp>
プリコンパイルヘッダーのおっさんはどうにかなったんだろうか 気になる・・・
プリコンパイルヘッダーのおっさんって誰よ
PCH云々のやつね ヘッダだけコンパイルするとか、あまりやらないよな
>>263 あぁ、俺のことか
ヘッダだけコンパイルなんてしてないよ。
VC++ 2010 はコンパイルしなくてもリアルタイムでエラーを見つけてくれる。
やった事は、VC++ を立ち上げてから
>>230 だけ。
この状態で、class と書いた部分に下波線が引かれ、
エラー一覧ウィンドウにエラーが表示される。
ただ、エラーを無視してそのままいろいろコードを書き加えていくと、
いつの間にかエラーは消えている(どの状態でいつ消えるのか法則がよく分からん)。
そして、わざと書き加えたコードを消して
>>223 のコードの状態に戻しても、
同じコード内容なのにもうこのエラーは出ない。
しかし、また別のヘッダファイルを新規作成して
>>223 のようなコードを書くと、
そのファイルで同じエラーが出る。
ちなみに、警告では無くエラーとして出ているくせに、
エラーが出ているそのヘッダファイルをインクルードした cpp ファイルは、
何も問題なくコンパイルできる。
よって、目に見える実害は体験していないから、とりあえず無視して作業を続けてる。
しかしだ。
>>230 の操作だけでこのエラーが毎回出ることは確実で(いつの間にか消えるが)、
またエラーの内容も意味不明だから、気持ち悪いことこの上ない。
c#からc++へのトランスレーターないですか?
>>264 それIntelliSenseが解析できませんってエラーでしょ?
>>266 そんな感じに読み取れるエラーメッセージだが、
「ヘッダーの停止はマクロまたは #if ブロックには配置できません。」
って何を指摘されているのか分からない。
ヘッダーの停止に関してできないことを俺がしようとしたために出たエラーであるなら、
ちゃんと理解して、できないことをしないようにしたいのだが・・・
多分#endif書く前にインテリセンスが走ってエラー出力がされているだけだと思う インテリセンスもバグが有ったりするから実際のコンパイルで何も言われなかったら気にしないのが吉
269 :
デフォルトの名無しさん :2012/09/08(土) 20:17:48.91
アルゴリズムに、下の感じでクラスのメンバ関数を渡したいのですが、 staticメンバか関数オブジェクトしか渡せない(?) mem_funみたいな便利な関数ありますか? #include <algorithm> class A { bool positive(int x) { return x>0; } public: bool test() const { int a[] = {3,2,4}; return std::all_of(a,a+3,positive); } }; int main() { A a; a.test(); }
std::all_of(std::begin(a), std::end(a), std::bind(&A::positive, this, std::placeholders::_1));
ラムだ使えよ
ラムダ使っても結局リフレクションしてるだけだし、 thatをいちいち参照させないといけないからダサい。 てかラムダ記法ダサいからなるべくつかいたくないw
bindのが千倍ダサイわ
>>270 ありがとう。知らない記法ばかりだ。
動的配列でもstd::end(a)とか定義されるのかしら・・・?
>>269 bind1stかbind2ndとthisを使っても出来るよ
つmem_fun
誰だよmem_fnとか導入した奴w 名前かんがえろ!
プリコンパイルヘッダーのインクルードは #include <stdafx.h> でなく #include "stdafx.h" と書く方がお行儀が宜しい スケルトンもそうなってるし、<>だとカレントをすっとばして探される危険性がある まあ /Yu "stdafx.h"というオプションがあるからカレントの"stdafx.h"を探してくれるから良いようなものの、
282 :
252 :2012/09/08(土) 21:37:44.15
アドバイスありがとうございます。 出された2つの案について、仕組みや長所短所などをこれから調べてみます。
複数行をコンソールに更新表示(?)したいのですが、いい方法はないですか? 1行だけなら printf("%d ¥r", num); でできるのですが…
system("cls");
改行しまくってから 新しいの書くとイイよ
ありがとうございます!!!
289 :
デフォルトの名無しさん :2012/09/10(月) 02:29:29.15
ペロッ……これは新手のマルチ!
まあここで答えろってわけじゃないんだし マルチというわけでも・・・
コピペせずに参照貼るのはプログラマとしてはあるべき姿
>>292 こっちで答えを考えてるときに参照元で議論が進められると、
同期を取らなくちゃならなくなるし、こっちの思考がリセットされる可能性もある。
いくらC++と言えども、パフォーマンス問題が無い限り、
できるだけ参照透過性は意識してほしいところ。
関数型でいこう
同期というか共有だけど、質問投稿サイト間で質問が共有されるのってあれ何? ぱっと見マルチ投稿に見えるんだよね……
298 :
デフォルトの名無しさん :2012/09/10(月) 20:59:53.20
ひとつ外のスコープとして変数を宣言できたりしますか? { ◯ { int i; } } で、◯のスコープとして i を宣言できると便利なときがあると思ったり。
{ int i; { } } でいいだろ
>>298 例えばどんな時?
ちょっと意図がわからないので、具体例を出してくれると嬉しい。
>>299 俺も真っ先にそう思った。
なにもつかない{}を知らなかったんだろ
>>302 それいっちゃうと君が黙らないといけなくなるよ?
class A{ public: A(); ~A(); }; inline A::A() {処理}; inline A::A() {処理}; と記入するとinline AのAの部分が曖昧と扱われコンパイルされません どのように解決すればよいのでしょう?
class A{ public: A(); ~A(); }; inline A::A() {処理}; inline A::~A() {処理}; 書き間違えました 正しくは上記の用にです
inlineにしたいなら class A{ public: A(){処理} ~A(){処理} }; ってしろよ
>>306 確かにそのとおりなのですが、VC5ではコンパイルが通ってVC10では通らなくなった理由が知りたいのです。
>>308 通りますね・・・
何か書き間違えてるみたいです・・・
出直してきます
intってintのビット数が変わってもいいようにbitの長さは定義されてないじゃないですか。 でも、64bit用のコンパイラーはアドレスは64bitになりましたがintが32bitのままなんで long longを使うのだと思いますがlong longはintより長いとしか定義されてないような気がしたので 将来的に128bitcpuが標準になったころにはコードを書き換えないといけなくなるじゃないですか? だったらintもlong longもつかえないことになってどうしたらいぢえすか?
ptrdiff_t
それポインター用なんで 整数用ないですか? コンパイラオプションでintの大きさ変えられないですか?
アドレス扱うのに何でアドレス用の型使わないの?
は?intは整数をあつかうものなんですけど?
固定ビットの整数型が欲しかったら std::int64_tとか使う
>アドレスは64bitになりましたがintが32bitのままなんで >long longを使うのだと思いますが これがアドレスをlong longで扱うという意味でなく 単にアーキテクチャ幅と同サイズの整数型が欲しいということなら typedefで自分で型用意すればいいんじゃないの 普通はそのままint使うけど
typedef decltype((char *)0 - (char *)0) int_adoresu_t;
intの長さは可変を前提にプログラムするのがあたりまえなんだけど、 なぜそれを守らなかった人のためにintを32bitにするんだろう。 これから先128bitが標準になってもintを32bitで貫くんだろうか。 そうなると大変なことがおこるだろうな。
>守らなかった人のために そんな理由じゃねぇよ
むしろsizeof(int)==sizeof(void*)という 間違った前提を持ってた人の方が多そう
だからptrdiff_t使えよ これで何の問題があるんだよ ほかにどんな選択肢があるんだよ 必要十分だろカス
>>322 ポインターの長さっていうのはメモリーの容量と関係するわけだけど
CPUが128bitになったときに128bit必要な大容量のメモリーが
登場していなければ64bitのままの可能性もあるから、整数が
CPUのレジスタサイズに対応した可変の型があることが必要なんだよ。
上位32ビットが無駄なスペースって言うけど 使わなかったらもっと無駄なんじゃ、レジスタを二つにわけて並列演算 するとかしないかぎり。
OSやコンパイラ作ってる連中にアドバイスしてきてやれよ
任意二つの要素が一致しないn個の要素からなる集合を作りたいんですけど、 集合の要素はXbitの長さの整数であって Xbitの整数はランダムな値を持つとすると Xにはどんな数字をいれたらいいですか?
32でいいんじゃない?
330 :
デフォルトの名無しさん :2012/09/11(火) 21:01:44.97
ハッシュ関数を自前でつくる必要があるのですが、 std::unordered_set<std::pair<int,int>,Hash> 適当にHash(a,b)=a^bとかやってもパフォーマンスが悪いです。 どっかの教科書にはHash(a,b)=41*(a+41)+bがよいとか書いてるのですが、 次のような性質が分かっているときにうまいハッシュ値をつくれないでしょうか? ・ペアの要素型はintですが、非負整数が入ります。 ・{a,b}が存在するときはほとんどの場合に{b,a}も要素にもちます。(つまりHash(a,b)!=Hash(b,a)としたい)
ちなみに、一つ目の性質があるのでHash(a,b)=a-bとかはやってみましたが、やはり悪いです。 てかCSの専門じゃないのでハッシュの基礎的なことが分かってないです。 という意味でスレ違いかもしれないですが、まずはunordered_setにペア型をつっこむとき、 C++コミュニティ推奨の方法とかあれば教えてください。
>>322 ポインタサイズの符号付整数型はstd::intptr_tであってstd::ptrdiff_tじゃねえよ
妙な使い方するなカス
>>331 まずは値の分布調べろ
分布がないと話にならない
>>333 いまクヌース読み始めたけど、その通りですね。
言語標準にしては使うのが難しい・・・。
intのサイズはデータバス幅、 ボインタのサイズはアドレスバスの幅 これがそのアーキテクチャに対して一番最適な値
>>323 メモリ空間はRAMだけのものじゃない
メモリサイズとポインタサイズは無関係
メモリポインタ
>>336 おまえはなしかみあってないようにみえる
ぐぐったら sizeof(size_t) == sizeof(ptrdiff_t) < sizeof(char*) ってあり得るんだな 知らんかった nearやfarを使ってた頃って色々面倒だったんだな
C99のintptr_t/uintptr_tの実装って任意なのかよ char*最強だな・・・
で、アドレスを格納するのに十分な整数型は結局なんなの?
intptr_t
用途によるけどintptr_t無かったらchar*でなんとかするしかないんじゃね?
http://viva2ch.net/tech/1201153965-800.html >C89やintptr_t/uintptr_tの存在しないC99処理系では、
>一般にポインタ→整数→ポインタのラウンドトリップな変換をする方法はない。
>
>完全に蛇足だが付け加えると、size_tがポインタを格納できる大きさだという保証はない。
なんのためのcppなのか メタプログラミングで型を決めるとかあるだろ
>>340 > ぐぐったら sizeof(size_t) == sizeof(ptrdiff_t) < sizeof(char*) ってあり得るんだな
実在しない
typedef boost::int_t<sizeof(void*) * 8>::exact intptr_t;
VisualStudio2012使えるようになったみたいだし C++11の話題もこっちに入れていいのだろうか
規格に沿った話なら別に問題ないのでは
VSみたいなオモチャをまだ使ってるやついたの? 早くGCCに換えろよ。
__gnu_parallel::for_each ってVisualStudioで使えるの? __gnu_parallel::for_each そもそもWindowsではOpenMP使わない方がいいのか?
VS2012はまともにC++11に対応してんの?
>>338 あんたが話についていけてないだけしゃないの?
>>352 規格のミスだ
故意に悪化を狙わない限りそういう実装は作れない
357 :
デフォルトの名無しさん :2012/09/12(水) 20:31:16.34
>>352 sizeof(size_t) < sizeof(char*)
こんな実装は作成不可能。
規格でそれを許容しても気にしなくていい。
>>354 残念ながら、とってもお寒い感じだな。
CXとかAMPとか、言語拡張のほうに力が入ってるような。
ただ、.NET出始めの頃にC++だけ置いてけぼり食らった歴史もあることだし、
開発力をどう割り振るかは非常に悩ましかったろうな、とは思う。
360 :
デフォルトの名無しさん :2012/09/12(水) 20:49:35.27
>>360 こういうケースがCの実装ではあっても
C++の実装では作れないってこと?
C++しか使わないから
それが事実ならありがたいことではあるけど
作成不可能だって主張する根拠を示してほしいよな
>>362 >>359 1. スモールモデル以外は、size_t = 16bit よりも void * = 32bit の方が大きかった。
2. win3.1 と MSVC1.5=MSC/C++8.0 が同じくらい。
struct int_ptr { char * p; int_ptr & operator += (const int_ptr &other); ・・・ }; みたいなのじゃいかんの?
365 :
デフォルトの名無しさん :2012/09/12(水) 23:39:26.82
C++11準拠の実装は全てsizeof(void*)==sizeof(size_t)なんだがな
規格の話をしている時に既存の実装の話をする阿呆
まあDOS時代にはよくある事だった 組み込みではどうなんだろう?
>>366 規格と実装は不可分特にC/C++のは後付けのなにものでも
マルチスレッドでスレッドをどんどん増やしていくC++プログラミング手法を インターネットのホームページでみかけたんですけど、 CPUのスレッド数までしかスレッドを作らない方がパフォーマンスよくないですか? スレッド増やしすぎると切り替えるのにじかんかかりすぎますよね?
>>369 その認識であってる
プロセス及びスレッド増やしすぎずに
非同期処理を正しく扱える方がスループットに優れる
が、OSのスケジューラの恩恵を得られないので
やり方によってはタイムシェアリングの品質に問題が出る
例えば2コア環境のサーバーアプリで
ユーザーA,BのためのIO待ちなどが発生しない処理を長時間続けると
ユーザーCの処理がずっと進まない
そのような場合、OSのスケジューラに頼らず自分で適切に処理をスイッチする必要がある
長文書いておいて何だけどC++とほぼ関係ない
371 :
デフォルトの名無しさん :2012/09/13(木) 17:00:40.11
>>366 ここ十数年のC++の規格の話は全て実装の後追いですよ
>>369 スイッチの無駄を減らす方がいいというのは、つまり少ない方がいい。
対CPU時間での効率を上げたければスレッドは少ないほどいい。
しかし待機してヒマしているコアが発生すれば資源の有効活用になっていない。
対実時間での効率を上げたければスレッドの数を増やせばいいが、その上限はコア数まで。
GDIでプログラミングしてるのですが質問です。 ペンで線を引くのではなくウインドウの縦横指定のドットに色を設定すると言った処理はないでしょうか? ググってもGDI自体のリファレンスも出てこなくて困ってます。GDI+ではないです。
SetPixel
セックスピストルズ?
スタンドの方しか思い出せない
>>374 ありがとうございます。
別のAPIでもsetPixelだからそういう名前じゃないかなと思ってました。
ならggrks
死ねカス
もう来んなKS
今時GDIって、 と思ったが、LinuxでもいまだにXlib叩くしな
>>371 実験的に実装して、具合がよければ規格になる。
どんな言語でも同じだろ。
そもそも
>>366 は、そういう話じゃないし。
Hamigakiが bjam install だけで /usr/local にinstallされるって書いてあるんだけど /usr/local/include にそれらしいものがない 何かコマンド間違ってる?
なーに言ってんだこいつ
bjamがないならインストールすればいいじゃない
bjam-1_46 というのは入ってる なので Hamigakiを解凍したディレクトリに移動して bjam-1_46 install コマンドを実効したけど インストールされてるようにみえない
installスクリプトの中身読む知恵すらないのか猿
388 :
デフォルトの名無しさん :2012/09/16(日) 10:41:06.54
>>386 ヴァカはパソコン触るな
触るなら自分で解決しろゴミ野郎
ファイルのドラッグドロップで苦戦してます。 フォームにbuttan、listboxを配置しリストボックスに ファイルを表示させるというものです。 #pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { listBox1->AllowDrop = true; } private: System::Void listBox1_DragEnter(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) { e->Effect = DragDropEffects::All; } private: System::Void listBox1_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) { for each (String^ item in dynamic_cast<array<String^>^>(e->Data->GetData(DataFormats::FileDrop))) { listBox1->Items->Add(item); } }
C++で実装するプラグインシステムについてよくまとまってるサイトとか本おしえてくだしい!
プラグインシステムなんてプラグインされる側で様々だと思う俺は、古い人間なのか…
抽象度の高いアーキテクチャと、その実その一例が詳しく載っているサイト、 あるいは書籍を教えて欲しいのだと推測してみる。
> その実その一例 その実装の一例
データアクセスとイベント送受信のAPIを公開するだけ
実現する機能も様々なのにアーキテクチャとか言い出す奴って…
>>390 なかなか無いね。
ただ、実現の仕組みはそんなに難しくないよ。
バイナリレベルであれば、DLLの仕組みがプラグインそのもの。
ソースレベルや概念レベルであれば、GoF本の内容が役に立つかな。
おっと、デザパタの話を出すとヤツが来るかな。。。
バカは黙ってればいいのに…
簡単な例としては、set_new_handler だよな この仕組みをバイナリ間で行えるようにしたのが dll や com だよね ぶっちゃけ、プラグインの基本概念は、関数ポインタ
アセンブラなら、 プログラムカウンタに設定する値をロードしたバイナリのテーブルから引くだけ
そういう低レベルな話じゃなくて プラグインとしてよい設計とはなにかみたいな話ではないの?
GoFでも読んでろw
プラグインの設計ってインタフェースの設計そのものじゃね
>>404 馬鹿GoFだ全部大文字で書くな意味をしらないのか馬鹿
中身理解できない奴に限ってそういうところに妙に細かいんだよな (w
「ひな壇は韓流タレント中心に」という構想が一変、TV界と韓流の今 09/16 13:00
http://woman.infoseek.co.jp/news/entertainment/cyzowoman_16Sep2012_25106 日韓の関係悪化の影響により、韓流離れが加速する現在のテレビ業界。
しかし、2年ほど前には広告代理店を中心に「ゴールデンタイムの番組には韓国人タレントを使用する」流れが作られていたという。
現在は吉本興業所属の芸人が幅を利かせる“ひな壇タレント”を、そっくり韓流と入れ替えるという計画だったそうだ。
日本国内で、KARAや少女時代がブレークした2010年。
日本音楽事業者協会会長で「尾木プロ」社長の尾木徹氏が、K-POPアーティストの誘致に尽力したと伝えられていた。
そして同時期頃から、広告代理店やテレビ局上層部の間では、こんな“定説”が存在していたという。
「2011年以降は、ゴールデンのバラエティから、吉本芸人はほとんどいなくなります。
代わりにひな壇に座るのがK-POPアーティストや、韓流タレントたち。
安定してレギュラー番組を続けられそうなのは明石家さんま、島田紳助、ダウンタウンくらいで、その他の芸人たちは有名無名問わず降板させていこうという方針でした」(広告代理店幹部)
ところが3月の震災で、エンタメ業界は数カ月ほど停滞状態が続くことに。
その前後に日本デビューを果たしたK-POPアーティストや、バラエティに登場した韓流タレントも少なからず存在したが、テレビ出演者が大幅に入れ替わるといった事態に至ることはなかった。
「紳助は引退してしまったし、高岡蒼佑のフジテレビ韓流傾倒批判など想定外の事態はいくつも発生しました。
特にネット上でのフジテレビ批判は見過ごせるレベルの話ではなく、連日の抗議デモやスポンサー企業の不買運動など、韓流に対する不安要素ばかりが高まっていきました」(同)
そして今回の竹島問題で、韓流コンテンツへの傾倒に関して沈黙を貫いてきたテレビ各局も、方針を表明。
フジテレビは当面韓流ドラマの放送予定はないとし、またBS日テレの定例会見では赤座弘一社長が「韓国ドラマが多すぎるのではという声もある。
少なすぎるという声はないので、今後、(韓流ドラマを)少なくしていく方向になると思う」と発言したことも話題になった。
class ResourceHandle { /* ry */ }; ResourceHandle resourceHandle = spManager->GetResource("a.bin"); std::shared_ptr<???> spResourceHandle(resourceHandle, [spManager](resourceHandle) { spManager->ReleaseResource(resourceHandle); }); 上のように生ポインタではなくポインタライクなインターフェースを持ったハンドルクラスをshared_ptrに渡したいのですが shared_ptr<ResourceHandle> spResourceHandle(new ResourceHandle(spManager->GetResource("a.bin")), [spManager](pResourceHandle) { spManager->ReleaseResource(*pResourceHandle); delete pResourceHandle; }); このように書くとnew/delete一回分増えるのが無駄になります shared_ptrにResourceHandleをそのまま、あたかもポインタのように持たせるにはどのように記述すればいいんでしょうか
無理 GetResourceがshared_ptr<ResourceHandle>を返すようにしろよ
<<nはnが大きいほど処理時間がかかるのですか?
いいえ
414 :
デフォルトの名無しさん :2012/09/18(火) 11:48:12.72
operator << の中で、たとえば n の表示に再帰を使っているなら n が大きいほど時間がかかる operator でない << も、シフト命令をマイクロプログラムのループで実装している CPU では n が大きいほど時間がかかる シフト命令をバレルシフタで実装している CPU では n の値と処理時間は無関係 いずれにせよ n の値と処理時間が反比例したり負の比例定数を持つことはない
じゃあIntel i5プロセッサーはどうですか?
416 :
デフォルトの名無しさん :2012/09/18(火) 11:56:36.03
スレチ
>>412 C++の場合、その演算の対象となる型によって答えが変わる。
対象が整数型の場合、>414の後半の通り。
今時のCPUなら、大抵同じ時間で処理できる。詳しいことは、該当CPUスレなどで。。
>>414 operator<<()が表示を担っているという前提はおかしい。std::ostream以外の可能性も考慮すべき。
boostスレッドが死んでるのはC++11が便利過ぎてboostいらなくなったからとか あるのだろうか
419 :
デフォルトの名無しさん :2012/09/18(火) 13:55:18.69
>>417 たとえばつったじゃん
負数を考え落としたのはアフォだったけどw
黒魔術つかった不思議に便利なライブラリよりも XMLパーサとか普段の仕事で使える実用的で黒魔術的じゃないライブラリの充実を目指したほうがいい boostは終わったコンテンツ C#ライブラリのような方向を目指さないと未来がない
421 :
デフォルトの名無しさん :2012/09/18(火) 23:27:57.88
なにをゆうてんのかわからん
xmlパーサならあるだろ
423 :
デフォルトの名無しさん :2012/09/18(火) 23:41:52.90
たしかにテンプレートライブラリはもう十分すぎていらんな
実用的で黒魔術的じゃないライブラリといえばprogress_display
426 :
デフォルトの名無しさん :2012/09/19(水) 01:14:53.51
>>424 全然足りない、というか不備だらけ
あの大風呂敷の範囲内でだけど
concept さんには退学とまでの苛烈な仕打ちをしながら
不審者 GC には甘い顔というのは、原理主義者に言わせると唾棄すべきだし
テンプレートテンプレート引数君に気高く見守られているもう終わった老人
禿自身が atomic に及び腰で超問題児 volatile をどうにもできないし
社歌に起立しない者にもナメられっぱなし
427 :
デフォルトの名無しさん :2012/09/19(水) 01:21:00.82
∧_,,∧ ♪マンドクセ ∧_,,∧ ♪ o(・ω・ `)o o(´ ・ω・ )o (( / ( )) (( ) ヽ )) シャカシャカ し――J し――J
boostのソケット周りの実装がウンコ過ぎて泣ける
テンプレート駆使するよりも python使ってCのプログラムを自動生成したほうがよくないか
std::stringのdata()に書き込んじゃダメ? std::string s; s.resize(10); char *p = const_cast<char *>(s.data()); for ( i = 0 ; i < s.size() ; ++i ) p[i] = 'a'; こういうことやりたいんだけど
>>430 デバッガのステップ実行ができん
(python のコードがステップ実行されないと意味ないからな)
まぁテンプレート駆使されると似たような状況かも知れんが、まだまし
433 :
デフォルトの名無しさん :2012/09/19(水) 19:52:31.60
const_cast の前には掟なし ついでに reinterpret_cast も使ってヒャッハー
>>431 自己責任なら何でもあり。
それがC++
435 :
431 :2012/09/19(水) 21:09:04.89
書き込んで実際に使えたらいいけど よく調べてみたらdata()には書き込めないらしい stringをchar *のように扱えたらいいのに
マジレスすると、 operator[] を使えと。 あれ? でも、メモリの連続性に vector と同じ保証ってあったっけ?
C++11からOK
>>431 わざわざconst修飾子を外して書き込むとは・・・
s[i] = 'a'; でいいじゃない
C++11から大丈夫
442 :
431 :2012/09/19(水) 22:56:20.89
俺がやりたいのは、 char *の引数にstringを渡したいってことなんだよ 逆ならできるけど イテレータ→ポインタは無理か
>>440 ありがと。
と、言う事は単純に
>>439 の方法でも良いし、
char* p = s[0];
でも良いわけだにゃ。
444 :
433 :2012/09/19(水) 23:02:05.00
間違えた。 char* p = &s[0]; だ。
char *p = str.c_str(); で良くないの?
446 :
433 :2012/09/19(水) 23:05:54.65
>>442 それでもオケ。
但し、&(*iteratder) とするのが合法かな?
>>445 2003 規格では const charT* です。
11でもconst CharT*です
C++03の場合はメモリの連続性が保証されてないから一旦char*にコピーしてから書き戻すのが良いと思う
#define string vector
>>451 いやそれではstring特有の豊富なメンバ関数が使えない
アルゴリズムを使って何とかしろというのか
453 :
431 :2012/09/19(水) 23:43:18.14
>>446 なんだかよくわからないけどできた
ありがとう
レガシーにも使いやすい文字列クラス作ればいい 三時間もあれば十分だろ
まあ標準文字列クラスは失敗作だと言われているからねえ でも新しい文字列クラスを作る必要があるのだろうか? エンバカみたいなUnicodeStringみたいなクラスなら意味はあるかもしれんけど
>>450 実際連続じゃない実装なんて存在しないから
気にしなくてもいいと思うぞー
まあ、自己責任だけどな
クラスでnewを使って 動的にインスタンス生成することの メリットが分かりません 教えて下さい
std::vectorやstd::stringを使ったことがありますか? new(malloc)が無いとああいったものの実装もままなりません
459 :
デフォルトの名無しさん :2012/09/20(木) 16:03:18.06
>>457 焦んなくていい
むしろ必要性を感じるまで使ってはならないものだ
テキストファイルの各行の長さは、コンパイルするとき、わからないから、動的に対応する
一度代入されたら変更されない変数はconstつけた方が高速になる?
>>461 そうとも限らない
const付けても強制的に型キャストすればいくらでも変更可能だから内部表現は環境依存
ただし文中では意味が異なる
配列数に使えたり
あれそう言えば強制的に値を替えて配列数に使った時はどちらの値が使われるんだろう?
>>464 サンクス
こういう辺りが何か気持ち悪いんだよなあ
>>464 な、なにが、ど、どうなんているの、ですか?
後者の「配列宣言に変数」はそもそもGCC拡張だけど
C++のスレだし
>>464 はどう見たってC++
C99でconstは定数にならないから前者のサンプルもおかしくなるな
いやc99のフィードバックで可能になった処理系もある(c99有効化フラグ立てて初めて使えるコンパイラとか) gccとms、Intelのコンパイラくらいしか使ったことないのかもしらんが
たしかいつかのコードウォーリアにはそんな設定があった
C++11がC互換部分でC99取り込むことになるから今後の処理系は色々捗るんだろな
まあ環境依存スレじゃないから例として不適切だとは思うが
for (int i = 0; i != hoge; ++i){ for(int j = 0; i != fuga; ++j){ ... } } iとjを間違えているバグ(i != fuga)を突き止めるのに小一時間かかった。 こういうミスを防ぐ、あるいは発見するコツってありますか?
i j kではなくx y z やa b cのように見た目が似て居ない変数でループを回しなさい
476 :
デフォルトの名無しさん :2012/09/21(金) 22:52:23.54
>>474 hogeキチガイはプログラムなんか組まなくていいから回線切って引きこもってろよ
>>474 お前ゴミだな。
hogeは覚える暇があってもコーディングスキルを身に付ける暇はないんだな。
マジでゴミ。
会社で何か嫌なことでもあったの?
>>475 とてもシンプルですね。
確かにiとjが似ているせいで発見されにくかったと言えます。
>>476-477 hogeへの拘りにワラタ。
480 :
デフォルトの名無しさん :2012/09/21(金) 23:07:34.06
>>479 低レベルな内容で詰まる癖にhogeとか使う余裕ないだろ
生活が苦しいのパチ屋につぎ込んで生活破綻するDQNと同じ思考回路
エディタのフォントを変えてみるという手も・・・? まあ視認性悪くなって効率悪くなりそうだけど
会社なら
>>479 みたいな奴は窓際行きだよ。
ゴミと同じくらいな価値しかないもん。
親がクズなんでしょ
まともに教育できない癖にガキ生んだのがこの結果
何を優先すべきかという判断力が全くない
だからつまらないミスで引っ掛かって赤の他人にきいてるんでしょ
親がクズだから
>>479 に罪はない
>>479 も自覚はなさそうだし
親がクズというより
>>479 は精神疾患系じゃないか?
485 :
デフォルトの名無しさん :2012/09/21(金) 23:27:35.20
心理学の話できいたけど、できちゃった婚とかだと子供は望んで生んだわけじゃないから、法に触れない最低限の教育しかしないらしい。
だから、全員とは言わないけど、よく思考回路の狂ったガキが輩出される。
コーディングもままならないのにhogeとか使ってる頭のおかしな
>>479 もその可能性が高い。
誰にも望まれずに、親にすら望まれずに生まれてきたガキ。
当然社会にもいらない。
いい大人が子供相手に叩きすぎw
お前らだって小さい頃にチンゲン菜の「チンゲ」とかに反応したことあるだろ?
子供のうちはそういうものに反応するんだよw
>>479 も中学校に進学する頃にはまともになってるさ
>>479 変数はbokuhagomidesuのほうがいいんじゃね?
そのほうがお似合いだぞ
>>474 そういう糞みたいな間違いを防ぐ方法を教えてやる
「無能なPGは即クビ」
ソフトの品質保つにはこれが一番効く
病人怖い
hogeは良い文化だと思うけどね。 hogeを使ってるかどうかでまともかどうかある程度ざっくり判別できる。 hoge使ってるような奴はまともじゃないから当たり障りのないように適当に相手をしておけばよい。
>>490 そうやって当たり障りなく相手にするから
>>479 みたいなキチガイがまともに相手してもらえてると思って調子に乗るんだろ
for(int hoge = 0; hoge < 5; ++hoge) for(int fuga = 0; fuga < hoge; ++fuga) 凄い!iとjを使う1024倍見やすい!hoge&fugaってすばらしい!
hage
もう少しまじめに議論しないか
outsideLoopCounterとでもすればいいのにhogeとか マジモンの池沼か?
497 :
デフォルトの名無しさん :2012/09/22(土) 00:22:59.91
議論せき止めてるアンチhoge厨いい加減にしろや みんなマジで迷惑してんだけどなんで気付かないの?
>>497 意味の無いアルファベットの並びなんか何だっていい
なぜそんなものに不快感を示すのか分からない
hoge使うから議論が止まってんだろ
基地害
>>479 の自業自得w
>>499 そうか?
お前クレジットカード申し込み書の記入例の名前欄にに「スーパーおまんこ天国 放射能ひろしDX」とか書いてあったら、この会社頭おかしいなって思わない?
記入例だから何でもいいけど、普通は「山田 太郎」とかにするだろ。
何でもいいとはいえ時と場合で限度がある。
「スーパーおまんこ天国 ひろしDX」に疑問を感じない
>>499 の神経にはびっくり。
502 :
デフォルトの名無しさん :2012/09/22(土) 00:36:06.39
869 名前: デフォルトの名無しさん 投稿日: 2012/09/19(水) 08:04:53.77 亞汰魔がおかしい 927 名前: デフォルトの名無しさん [sage] 投稿日: 2012/09/20(木) 02:48:04.54 "亞汰魔"の検索結果、7件 どこぞのゲーマーのブログに引っかかる訳だが、恥かしくねーのかな? 本人か、影響されたバカか、それとも晒すためのワザと書いてるのか、 知らんけどさー 928 名前: デフォルトの名無しさん [sage] 投稿日: 2012/09/20(木) 02:58:47.68 亞太魔wwwwwwwww hogeと同じレベルwwwwwwwwwwwwwwwwwwwwwwww
>>501 「意味の無い」 「アルファベットの並び」 と言ったはずだ
>>503 例だろ
そんなことも分からないの?
じゃぁスーパーおまんこなんたらやめて
「じゃびみょぱひるるきいぱ かぴよだばままさろゅぴ郎」に読み替えろ
hoge擁護派にもまともな香具師がいないなぁ
>>501 この会社頭おかしいと思っても、
>>476 の様にその会社に暴言を吐くことは普通しないよな。
子どもじゃないんだから。
黙って、そのまま記入するか、作るカードの会社を変える。
あと、例があまりに非現実的だし、下品で笑えない。
もう少し現実にありそうな事を考えてくれよ。
またhoge厨が湧いてんのか。 こうなることは目に見えてるから荒らすためにわざとhoge使ってるんだろ。
507 :
デフォルトの名無しさん :2012/09/22(土) 00:49:11.64
>>505 まずhogeってのが非現実的で下品だから釣り合いは取れてんじゃね?
hogeから下品な想像できる人なんてこの世にほとんどいないよ 無視して大丈夫なレベル
>その会社に暴言を吐くことは普通しないよな。 2chだからいいだろ。 現実ではググレカスも言わないし、初対面の相手にタメ口をきくこともない。
510 :
デフォルトの名無しさん :2012/09/22(土) 01:02:02.84
そもそも無意味な変数なんてあんの? 意味あるなら意味ある名前付けると思うけど
>>510 例えば一時的なカウンタとして使用する i j k などは、
その「使われ方」からカウンタという意味を読み取るが、
「名前自体」からは意味を読み取ることはできない。
>>501 のような例を思いつく人間の思考が気持ち悪い
2chってサイコーに面白いね
使われ方で分かるならhogeじゃなくてijkxyzでいいだろw
516 :
デフォルトの名無しさん :2012/09/22(土) 01:10:39.33
確かにhogeは単純にウザい面もあるね
517 :
デフォルトの名無しさん :2012/09/22(土) 01:11:31.50
hogeって・・・ 馬鹿じゃねwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
はい感想掲示板と質問掲示板の区別もつかない
>>512 のレスはいりましたー
意味ない変数ならundefinedvariableとかでいいんじゃないの?って思うけど・・・
意味がないなら名前は何でもいい 何でもいいなら短いほうがいい しかし短すぎるとすぐに枯渇するし打ち間違えしやすい つまり4文字程度がベスト 4文字で無意味な文字列といったら誰もが思い浮かべるのがhoge つまりhogeがすべてを兼ね備えたもっとも美しい識別子なんだよ
521 :
デフォルトの名無しさん :2012/09/22(土) 01:33:02.07
短いのがいいならfooにしとけks 枯渇しねーしfoo打ち間違えるならIT機器に触るのはやめろ
fooでいいと思う。 そうやって何でもかんでもガラパゴス化を推し進める愚図が多いから 日本のITは世界に遅れをとってるんだろうな。 システム自体に顕著にガラパゴス化は現れてなくとも そういう精神の愚図が作ったものはやっぱりそういう性質になるんだと思うよ。
fooは奇数文字数だから美しくない bar bazとつなげた時も韻がなってないからごろがわるい 一方でhogeならその辺はすべて安心して使える
ケータイでガラパゴス化に懲りたと思ったらまだそんな人がいるのか。 一人ならいいけど大勢いるとなると日本のIT産業は衰退していくだろうね。
hoge使ってる奴はクズ たまにDQN親のイミフな主張をきくけどあれと一緒
>>479 親子ってこういう感じなんだろうな。
残業がどうとかじゃなくて普通に神経を疑われるようなことをさも当然のように行っている様は、
明らかにおかしいhogeをさも当たり前のように使っている様子にそっくり。
以下コピペ↓
2年前にはいってきた新人
うちは少なくとも週に2〜3回は残業が当たり前っていうのは言ってたのに
1ヶ月ほどで母親が電話してきた。
「うちの息子は何も悪くないのになんで残業させられるんですか?」
残業って別に悪いことしたお仕置きでやってるわけじゃねーよって思ったけど
この新人が社長の知り合いの紹介で入ってきたって言うこともあって
当時の上司が少し様子見ってことで新人だけ残業なしにしてやった。
当然、みんなで残業した次の日には新人君は話に入れない。
みんなでメシ食った話や○○さんのがんばりのおかげで10時に終わった〜とか・・・
そしたら今度は母親が怒鳴り込んできた。
うちの息子ちゃんをみんなでいじめてる。息子ちゃんのわからない話で盛り上がらないで!
残業のときの話は禁止にしてちょうだい!って社長に直談判したらしい。
さすがに社長も「特別扱いはできない。もとより残業免除って言うすごい特別扱いしてるのに
それでも耐えられないんだったらうちの会社があわないのですかね〜?
では次からは特別扱いなしで残業もしてもらいますよ。」って言ってやめてもらった。
ほんと神経わからん親子だった。
527 :
デフォルトの名無しさん :2012/09/22(土) 07:47:46.20
質問なのですが 明解C言語入門編LVのC言語は理解できるのですが 独習C++か標準講座C++のどちらを買おうか迷っています。 ネット上にて独習C++はCの知識がある人向けと書いてあったのですが、どのくらい必要なのかわからないので質問しました。
hoge hoger hogest
>>527 ストロストラップ本買え
理解できないならC++を使うのは諦めろ
hage hige huge hege hoge
homo
535 :
デフォルトの名無しさん :2012/09/22(土) 14:59:35.27
事実だな むしろ割引きなくらい
マジレスすると興味あるFOSSのコードを落としてきて読め そのレベルの書籍から学べることは何もない。まったく何もない。本当に何もない
初学者に何言ってんだアホか
文法おぼえたら、後は設計だけだよ
書籍の購入なんて初学者が嵌る罠だから
>>538 おまえがそう思うなら、既に罠に嵌っている
書店で手にとって気に入った本を選ぶ
田舎は大型書店でも書籍の品揃えが悪いよ 一度だけ東京の書店に行ったけれど、品揃えの豊富さには感動したもの
そうそう神戸の田舎者も感動しました都内の書店には
文法覚えたらMPやら型消去が身に付くのか? 余程の天才じゃない限り無理だろ まぁ媒体は本でもWebでもいいけど脱初心者向けのガイドは必要だろ
>>542 九州の南の方ですが何か
>>543 それって本当に必要な機能か?
本質的な問題を解決するために、ソフトウェアを書くために絶対的に必要な機能か?
初学者に必要なのは文法、コーディング規約、つくりたいものに似たOSSのコード あると便利なのがプリンタとkindle
尼さんステマ乙やがな
>>542 神戸なら、三宮のジュンク堂でいいじゃん。
都内の三省堂、紀伊国屋、八重洲ブックセンターとかには敵わないけど、
C++ 程度ならそれなりに揃っていたと思うが。
ム板もここ数年で本当にレベルが落ちたな。
核実験時代の放射能で徐々に知能低下や無気力化が進みこの前のあれでトドメさされた感じやね ゆとりたちは完全に老害の被害者だよ
550 :
デフォルトの名無しさん :2012/09/23(日) 01:33:51.18
やっぱりロベールかなー
551 :
デフォルトの名無しさん :2012/09/23(日) 12:40:49.34
>>539 >文法おぼえたら、後は設計だけだよ
えっC++の場合文法知識だけでいきなり書き始めたらいろいろ罠に嵌るんでないの
メモリポインタとか
>>531 はげどう
・まずストロストラップ本を読みます
・ストロストラップが積極的に言いたがらない暗黒面を『Effective C++』で補完します
…
まあハードルが高いのも理由があるということで
554 :
デフォルトの名無しさん :2012/09/23(日) 17:40:53.10
あやしいカタカナ表記やめれ 「禿」が統一見解
>>554 そうなんだろうけどこの頃は自重すべきだと思うの……
某メタ変数に噛み付くキ……暇人もいるし
if(){
ごめんなさい、↑のはミスです......... 質問です。 下のような感じで、変数の値が変わったら一瞬だけtrueが返ってくるような関数ってありませんか。 if(changed(Var)){ }
特定の変数向けの関数? それに合わせたフラグを変数毎にグローバル変数で宣言して、 変化を検知したらtrueを返す……てな感じでいいんじゃね
>>557 class C {
private:
int x;
bool isChanged;
public:
C(): isChanged(false) {}
int get() { return x; }
void set(int x_) { x = x_; Changed = true; }
bool changed() { bool t = isChanged; isChanged = false; return t; }
};
C X;
X.set(1);
if(X.changed()){ ... }
とかでどうよ。
バグってるわ… < void set(int x_) { x = x_; Changed = true; } > void set(int x_) { x = x_; isChanged = true; }
>>558 フラグ用に一々変数を設けるのが面倒だし、その分ソースコードの量が多くなって大変なんで、良い感じの関数が標準で無いのかな〜と思ったんですけど
残念ながら標準のライブラリでは無いみたいですね。
数日前にC++を始めたばかりでまともな関数を作る事が中々できないミジンコなんです・・・・
>>559 こんなミジンコな私の為にわざわざ作って頂いてありがとうございます!!
私にとってはかなり重宝なので今後ありがたく使わせて頂きます。
これを機にクラス定義のノウハウの方も勉強します。
お二方ありがとうございました。
メモリポインタは・・・・あれは難しいなw
563 :
デフォルトの名無しさん :2012/09/23(日) 21:31:44.13
初学者にストロストラップは挫折の道しかないだろ
びゃーねすっぽすっぽ
565 :
デフォルトの名無しさん :2012/09/23(日) 22:21:41.97
すっぽんぽん すっぽんぽんわーいわーいしたい
とりあえず、オライリー片っ端から読んどけば良くね?
fwriteでファイルにDWORDを書き込むと、書き込んだバイナリがバイト単位で逆順になるんですがなんでしょうかコレ 他の構造体などは問題なく書き込めるんですが DWORD magic='DDS '; //0x44445320 FILE* fp; fp = fopen(filename, "wb" ); fclose(fp); 出来上がったバイナリを覗くと中身は' SDD'(0x20534444)
htonl
MAGIC は通常 ASCII 文字列なんだから char array で扱うよ 例えば WinMerge における unicode の BOM の取り扱いは if (m_unicoding == ucr::UCS2LE) { unsigned char bom[] = "\xFF\xFE"; fseek(m_fp, 0, SEEK_SET); fwrite(bom, 1, 2, m_fp); m_data = 2; } else if (m_unicoding == ucr::UCS2BE) { unsigned char bom[] = "\xFE\xFF"; fseek(m_fp, 0, SEEK_SET); fwrite(bom, 1, 2, m_fp); m_data = 2; } else if (m_unicoding == ucr::UTF8 && m_bom) { unsigned char bom[] = "\xEF\xBB\xBF"; fseek(m_fp, 0, SEEK_SET); fwrite(bom, 1, 3, m_fp); m_data = 3; }
コンパイラによっては、バージョンによって'ABCD'の値が違ってくるしな。
DWORDってVCのマクロだよね、確か。
A B C D C B D E A E のように「同じ文字列が2つずつ存在しそれぞれ組みを作ってる」ようなファイルを A B C D E となるように整理するプログラムを作りしたいのですが、どなたか助言いただけないでしょうか
>>571 抽出ミスです…
普通に作るにあたって、文字列はちゃんと文字列として扱えば、
数値データなどはリトルエンディアンで書きだしてあっても普通に読めるってことでいいんですよね
>>575 std::vector<std::string>に読み込んで
std::sort()→std::unique()じゃだめなん
メモリに収まり切らないなら他の方法もあるけど
>>576 移植性がないことに注意。同じ端末で同じ環境で処理するなら、大抵問題ない。
>>578 WindowsPCならおkってことですかね?
ゲームのセーブデータなんかも気になるんですが
どうせ移植なんてしないだろ
例えばlongで読み書きするコードを実装したとして、 longが32ビットのバージョンで書いたデータを、 longが64ビットのバージョンで読んだらおかしくなるね。 その場合は、int32_tで書いておけって話にはなる。
エンディアンのこと気にするくらいなら、構造体にまとめて一気に書き出し・読み出しした方がいいのかな
バイナリの読み書きは基本的に同じアーキテクチャのPC間に限るだろ 異なる場合はテキストやCSV形式でやり取りするのが常識
限らないだろ JpegやPNGのフォーマット、TCP/IPヘッダなどは ネットワークバイトオーダーであるビッグエンディアン
ビッグエイリアン
データ量が小さいならテキストの方が楽ではある 手で書き換えたり出来るし
ちゃんとした規格ならBEかLEかも規定されてる。
で、移植性を重視したいなら、
>>583 の言うとおりテキストベースで。
達人プログラマにも書いてあったよね。バイナリはうんこって。
したがって、画像データならば、pnm 兄弟が最強
したがって、zipファイルはうんこ
そしてこのShift_JISである
>>588 処がどっこい、pnmもバイナリバージョンもあるし、depthが8ビットを越えたときの
エンディアンの規定がないな。
>>584 TIFFはBEもLEもあるな。
utf-8は素晴らしいでFA?
UTF-8は、英語でかくひとたちのわがまま
JIS第4水準が、8バイトとかになったんだっけ?>UTF-8
なるほど、 「11 22 33 44」を64ビットで表す時、 リトルエンディアンだと 44 33 22 11 00 00 00 00 でいいから、11 22 33 44 + 予備領域00 00 00 00 を確保すれば読むとき一緒になるのか そういうことか
>>595 UTF-8の解釈が全くの間違い。スレ違いだから詳細は省略するが、Wikipediaででも調べてみなよ。
>>596 いやそれとは関係なく、ただリトルエンディアンの有用性に関する個人的解釈
>>582 x86で書き出してarmで読み出したときマズイ
まあXMLでシリアライズすれば済むんだけどな C/C++には標準でXMLを扱うライブラリが付属してないので いろいろフリーのパーサーがある
どの環境でも使えるソースコード公開されてるXMLパーサ教えてください
RapidXMLとか
C♯のXDocument的なやつはないの?
C#は標準でライブラリに入ってるな Javaも
doxygen
doxygenは最初使った時は感動したが、しばらく使うとOOP構造を視覚化して くれる機能に物足りなさを感じて消してしまった
>>596 だから、LEの有用性とUTF-8は全く関係ないんだってば。データ値をみないとサイズが判らないんだから。
609 :
デフォルトの名無しさん :2012/09/25(火) 11:08:52.63
printf("%s\n",NULL); C++だと正常に動作するのですが、Cだと例外が出てしまいます。 どうしたらよいでしょうか。
printf("%s\n", ""); にしろ
>>609 >C++だと正常に動作するのですが、
この根拠が分からない
C++でもまずいだろ
ヌルポインタの位置にどんなデータが入っているかは分からないのだから
しかもヌルポインタを差すポインタはどこも指してない事になっている
Cの規格書に%sに対する実引数は「文字列配列の先頭要素へのポインタで なければならない」とあるのでナルポインタを渡してはいけない 文字列の先頭要素を指しているポインタを渡してください
>>611 これはprintfの仕様です。あまり知られてませんが。
%sにNULLが渡されたときは(null)に変換されるんです。
あと%pにNULL渡すと(nil)になります。
614 :
609 :2012/09/25(火) 14:34:26.56
原因がわかりました。 gcc固有の問題でした。 gccが最適化によりprintfをputsに置き換えているのが原因でした。 なので、たとえば printf("a=%s\n",NULL); などであれば最適化されず a=(null) と出力されることが確認できました。 とりあえず、ビルトイン関数のうちprintfだけを抑止できればいいので -fno-builtin-printf を指定してなんとかなりました。
最初はC++とCの違いの問題かと思ってここにしたけど 結局Cのそれもアーキテクチャ固有の現象だったので ごめんなさい
618 :
デフォルトの名無しさん :2012/09/25(火) 15:37:35.97
規格でも仕様でも何ページのどこかくらい言え
64ページのレベル5です
620 :
デフォルトの名無しさん :2012/09/25(火) 19:04:24.30
出典の挙げ方はスレチなので教えてやらない # どこの馬の骨か知らんが勝手に恥かいてろ
漠然と質問しますが newされたものはnewされた物によってdeleteされるべきって設計思想はアリですかね? そうでない場合が要求される場合か利点て何かありますか?
というか生成方法を隠蔽しているクラスでは常套手段 逆に生成破棄をクラス側で制限するとアロケーターが使えないので不便なときもある
スレチいわれそうだけどCOMなんてまさにそれだね
そこでスマポですよ
そしてデリータですよ
フリーター馬鹿にしてんのかオイ
template<class T> class myclass{...} みたいなテンプレートクラスがあったとして、std::map<int,T>とすることは出来ますか?
myclassはどこいった myclassの中でって事ならyesだがそのくらい試せばいいだろう
まずは日本語で説明して
VisualStudioをUpdateすると動かなくなるプログラムってありますか? boostとOpenCVに依存したプログラムが多いのですが
>>630 ライブラリ側と開発環境のバージョンを合わせないとだめとかないか
オブジェクトの参照関係まで含めてシリアライズしてファイルに保存したいのだけどどうすればいいのかな
無理じゃないかな
636 :
634 :2012/09/29(土) 11:09:04.85
すいません自己解決しました なんの困難もなかったです
あるインスタンスが持つインスタンスを別のインスタンス内でも使いたいのですが スコープの外で使う方法ってありますか? class A { public: class B hoge; } class C { public Cのメンバ関数内で hogeのメンバ変数の値を変えたり、メンバ関数を実行したいです }
ポインタ
639 :
デフォルトの名無しさん :2012/09/29(土) 12:34:36.36
class A { public: static B hoge; }
>>637 はhogeを覚える暇はあってもコーディングについてる暇はない池沼。
そんな奴がプログラムやってんの?w
精神構造がマジで腐ってんじゃねーのw
遊ぶ暇はあっても働く暇はないとか言って借金しまくった挙げ句に吊る奴と同じ。
社会に必要ないね。
吊ってくれりゃいーけどこういうゴミは人として最低限の尊厳もないからへーきで生ポ貰って生きていくよ
template <class X> class Bob { friend class X; private: void Fuck(); }; class Alice { Bob<Alice> bob; public: void DoSomething() { bob.Fuck(); } }; こういうふうにfriendに出来る対象をテンプレートで指定したいんですができません どうすればうまくいきますか?
>>637 AのインスタンスかhogeをCのメンバ関数の引数で受け取ればいいだけだろ
645 :
デフォルトの名無しさん :2012/09/29(土) 12:58:04.30
hoge自体も問題だけど
そもそもhoge使ってる奴の質問って糞みたいな内容ばっかなんだよな
全く調べてないのが丸分かりの糞質問
>>641 hoge厨は無自覚だから吊るなんてことはない
>>637 お前はプログラム組むより回線切って引き込もってたほうが社会のため。
>>637 「hogeを覚えたり書いたりする暇はあってもプログラムについて調べる暇なんてないんです><タダで教えてください><」
DQN「パチンコや競馬に行く暇はあっても働く暇なんてないんです><生活保護ください><」
同じwwwwwwwwwwwwwwwwwwwwwww
根性腐ってるwwwwwwwwwwwwwwwwwwwwwwww
ID出ない板はこれだから
ID出たところでHogeとか書き込むゴミクズは減らないと思うが・・・
面白いと思ってんだろ
652 :
デフォルトの名無しさん :2012/09/29(土) 13:23:30.52
とうとう親まで叩き始めたw
>>639 ,640
ポインタとか、staticってやつを使えばいいんですねサンクス
656 :
uy :2012/09/29(土) 14:55:58.07
糞ニートは黙ってろよ
糞ニートはお前
hoge
てst
共依存するようなケースを除いて全てヘッダーファイルに実装を書いてきたのですが、 マルチコアCPUに買い換えたのを機にこれを見直そうと思いました。 が、面倒で身につきません。 明確に指針を立ててヘッダーファイルと実装ファイルに分けている、 もしくは分けていないという人はいますか? いたらその理由を教えてください。
別に直さなくていいだろ
な、なんでそんなことしてきたのん?
663 :
デフォルトの名無しさん :2012/09/29(土) 20:02:38.67
マルチセッションにサーバー OS が必要とか思ってる手合いか?
664 :
デフォルトの名無しさん :2012/09/29(土) 21:32:11.47
てすと
また荒らしが湧いてたのか
>>637 愚図がキメェんだよ
hogeとか意味不明
落書きはブログにでも書いてろ
int main(void) { hoge(); return 0; } コンパイルできませんなにがおかしいんでしょうか?
667 :
─☆─ [ X | I.I.T. ] COURANT DE CONSOLE ◆TXFAX7cidQpG :2012/09/29(土) 21:52:38.79
hogeの何が悪いん?
669 :
─☆─ [ X | I.I.T. ] COURANT DE CONSOLE ◆TXFAX7cidQpG :2012/09/29(土) 21:54:20.54
Cってバカがやるモンだって思ってたけど、やっぱそうだったなw
>>661 並列コンパイルさせるため
>>662 ・クラステンプレートなどヘッダーファイルに書かざるを得ないケースがある
・分けるとファイル数と記述が増えてめんどくさい
これらの理由でhppファイルに全てまとめていました
並列コンパイルと何の関係が?
問題なく動いているものを修正しようとするのは初心者
リファクタリング全否定かよ。
>>673 一般論としてはそんなのは保守フェーズに入るときにやればいいんジャネ
外部インターフェースがきっちり決まっていて、きちんと動くならそれでおk
ただ>670は目的と手段がちぐはぐに見受けられ、理解してやってるのか不安になるというのはある
プログラマごと取り替えたほうが良いのではないか
>>660 インターフェースと実装は分離するのが基本
そうすると、実装の取り替えがオブジェクトモジュール単位で実施できて、
当のオブジェクトモジュールのビルドとリンクし直しだけで済むので
C++の場合もちろんインターフェースをヘッダファイルに、実装を.cppの方に書く
そうしておいて、とりあえず普通に書いて動作するレベルにした後、
プロファイラで調べて、何と何の実装をヘッダファイルに移すか白黒つければいいんジャネ
ただでさえコンパイルの遅いC++で、修正時のコンパイル量が無駄に多くなるような設計は避けたいところ
>>674 >一般論としてはそんなのは保守フェーズに入るときにやればいいんジャネ
お前の変な考えを、 一般論と言うなよ。
アホが起床してきたか
クラスでnewを使って 動的にインスタンス生成することの メリットが分かりません 教えて下さい
Javaとか.NETで参照型クラスが流行りなんだよ
スコープを超えても消滅しない
生成されて破棄される順番が固定されるより動的にいつでも生成破棄できるほうが柔軟性が高いのは当然 然るに動的な生成破棄を使いこなせばより柔軟性の高い便利なアプリケーションが作れることももはや自明の論理だろう
ヒープ!
685 :
デフォルトの名無しさん :2012/09/30(日) 10:10:36.29
>>679 ネタじゃなく、こういう馬鹿がリアルでいるから困る
必要なメモリは最初から配列で静的に確保しておけとか言うんだぜ
>>686 実行環境がわかってるコンシューマゲームとかなら普通に有効な選択肢だが?
もちろんアロケーター通して使うから、そのままstaticなオブジェクト配列ってことにはならんが
>>687 違うよ。staticなオブジェクト配列ってことを言ってるんだよ
>>687 文脈読めよ
アロケータとか言いたいだけの厨房か?
690 :
デフォルトの名無しさん :2012/09/30(日) 13:08:40.85
>>689 きみアロケーターをなにか高尚なものと勘違いしてないか?
>>690 もういいって
そういう話じゃないってわかれよ
>>691 あ、お逃げになられるわけですね
わかりました
695 :
デフォルトの名無しさん :2012/09/30(日) 13:24:15.97
>>686 >必要なメモリは最初から配列で静的に確保しておけとか言うんだぜ
ここではstaticにメモリを何らかの型の配列で確保すると言っている
つまりstaticに必要な型のオブジェクト配列としてそのままとれと言っているのではなく
なんらかの管理手段を通じてそのメモリ領域を利用することを示唆している
もしオブジェクト配列をそのまま使うという意図で言うなら「必要なオブジェクトは最初から配列で〜」と書くはずだ
したがってアロケーターの話が浮上しても流れとしてなんらおかしくはない
>>695 >つまりstaticに必要な型のオブジェクト配列としてそのままとれと言っているのではなく
>なんらかの管理手段を通じてそのメモリ領域を利用することを示唆している
その解釈の可能性は否定しないが、その解釈であると断定するのは無理がありすぎ。
697 :
デフォルトの名無しさん :2012/09/30(日) 13:38:51.36
698 :
686 :2012/09/30(日) 13:39:46.16
>>695 すみません、僕の書き方が悪かったです
必要なオブジェクトは最初から配列で〜です
領域を確保しておいてそこからアロケートするなんて当たり前のことすぎて それをアホ扱いするのは無理がある
拗らせて喧嘩するほどの話か?
次の話題どうぞ
702 :
デフォルトの名無しさん :2012/09/30(日) 15:12:22.43
void Pussy::Pussy(); あばばばばばばばばばばばばばばばばばばばばばばばばばばばばばばばばwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
またhogeの話しようぜ
704 :
デフォルトの名無しさん :2012/09/30(日) 16:22:27.67
#include <windows.h> #include <mmsystem.h> とtimeBeginPeriod(1) を使わずに1msのタイマ分解能を得たいのですが、 他にどういった方法がありますでしょうか。 C++のSTL等では不可能でしょうか。 timeBeginePeriodを使いたくない理由は、 windowsにしか対応できないからです。 できれば同じコードでマルチプラットフォーム対応できればと考えています。 教えていただけますと嬉しいです。
#ifdef でプラットフォームごとに分ければ
std::chronoかboostで
708 :
デフォルトの名無しさん :2012/09/30(日) 16:34:55.68
>>640 おい、static使っても出来なかったぞカス
アロケーター厨が去ったと思ったらHoge厨様の降臨か 日曜日だな
相談とか質問する場として機能して無いんだから 余所で聞けよ
Java脳向けのC++解説サイトってないですか? これからはRubyだと学校で言われて超簡単言語Rubyを覚え、社会じゃ役に立たないと知り、 業務は生産性の高いJavaだと言われてちょっと簡単言語Javaを覚えて仕事し続け、 結局世の中C/C++で動いてると知って 簡単な言語ばかり覚えてきた自分に落胆してるような人間向けの解説を探してます。 C言語は業務で使っているので扱えます。
RubyはともかくJavaはまだ使う方だろ……AndroidとかはJavaで動いてるんだぜ 普通にC++の参考書じゃダメなん?
すみません。できれば早く覚えてたいという願望がありまして…。 JavaでいうこれはC++ではこうやるんだよ!っていう比較ありきの解説ないかなと思いまして。
715 :
デフォルトの名無しさん :2012/09/30(日) 22:36:33.14
>>712 腐るほどあるのに
おまえの探し方が甘すぎるだけ
要するに Java わかる人が C++ 教えりゃいいんだろ
神からご託宣をいただけるのか、
等身大の傭兵から何か盗めればいいのか
そこにナーバス過ぎちゃ無理だよ無理すぎ
ひ、ひどい…相談と書いてあったから相談っぽく相談したのに…。あんまりだ…。 まあMSDNでも漁りますノシ
>>717 >C言語は業務で使っているので扱えます
この時点で「初心者じゃないから自分で調べることぐらい出来るよね?」
って思われてるんじゃね
ベトナムでも“嫌韓”ブーム!?
李明博大統領の竹島上陸から勃発した韓国のすさまじい反日行為。対する日本も“嫌韓”感情に火がついている。
“韓流”ブームも息を潜め、韓国ドラマや韓流スターにうつつを抜かしていた女性たちの中にも、韓国と距離を置く人が増えている。
だが、“嫌韓”感情は隣国・日本だけではない。アジア各地にも広がっている。
中でも根深いのはベトナム。ベトナムは昨年、「満50歳以上、または年齢差が16歳以上」の韓国人男性とベトナム人女性との
国際結婚を禁止する厳しい規定を設けた。
ベトナム戦争時 韓国人兵士のレイプで産まれた混血児
グローバル化の時代に国際結婚を法律で禁止するという強行策。背景には「ライダイハン」問題がある。
ベトナム戦争時、ベトナムに派兵した一部の韓国人兵士が現地の女性を強姦したり、暴行を振るっていた。
その結果「ライダイハン」と呼ばれる混血児が多数産まれたのだ。韓国人兵士はそのまま帰国し、母子が残され差別に苦しみながら生きてきた。
さらに、最近は韓国人夫のDV(家庭内暴力)などの事例も増えているという。
従軍慰安婦問題といいライダイハン問題といい、その傷跡は深い。“反日”や“嫌韓”の背景にある歴史問題にも目を向けるべきである。
http://www.kon-katsu-news.com/news_a4sj0mIlnO.html
class A{ }; class B:A{ }; class C:A{ }; main{ int size; cin>>size; A* a= new A[size]; C c; a[2]=c; } と基底クラスAに派生クラスであるCを代入しようとすると、 アクセスできない基本クラスAへの変換は許されていませんとでてきます。 なにが原因なのでしょう?
>>720 A::operator=(A const&) は書いてるの?
public忘れてる
QはC++が理解できてない老害なんだから無理すんなよ スラッシングも知らないのか
a[2]=static_cast<A*>(&c); とかは?
スライシング
>>728 すまん、盛大に勘違いした
半年ROMるわ・・・
a[]に代入したcをダウンキャストしてcのメンバ関数を呼び出すと見事にあぼ〜んするな 当たり前だが
>>732 あのさあクラスCで拡張された部分がスライシングでなくなってるから
ダウンキャストするとあぼ〜んするんだけど
意味わかってる?
ちゃんと伝わる日本語を使おうな しょせんカタカナ英語だけど「〜ingで」はこの場合おかしいだろ
名詞にすべきだから〜ingで正しいだろ
正しくはCのメンバ関数を呼ぶと、だな
スライシングの場合はあぼーんじゃないな class A { public: virtual void print() const { std::cout << "A!!" << std::endl; } }; class B : public A { public: void print() const { std::cout << "B!!" << std::endl; } }; int main() { A a[1]; a[0] = B(); B* bp = dynamic_cast<B*>(&a[0]); std::cout << bp << std::endl; // スライシングされているのでダウンキャスト出来ない B* bp2 = reinterpret_cast<B*>(&a[0]); bp2->print(); // vtableまで削られているので A の関数が実行される }
仮想関数無しだとそもそもdynamic_cast出来ないぞ 無理矢理reinterpret_castするのかな
vtableは削られてるのではなくて、 代入や初期化の際にコピーされないだけ
>>740 そもそもdynamic_castするという話ではないぞ
スライシングなんて言い回しをするからわかりにくいが、 単にBのA部分をAにコピーしてるだけと言えばすぐ解るだろうに。
初期化の場合はコピーコンストラクタ A(const A&) が、 代入の場合は代入演算子 operator=(const A&) が動いてるだけだな
int a[N] Nの最大値を教えてください。
Nの最大値は環境によりますが実質無限大です
∞ ただし物理的・環境依存限界はある auto variable ならスタックサイズ global/static ならヒープサイズ dynamic ならOSのメモリ割り当て限界
748 :
デフォルトの名無しさん :2012/10/02(火) 10:01:28.28
std::size_t から導ける範囲内の処理系限界
class A{ int b[20*20*20*20*20] int a[11] public: A(){ for{int i=0;i<11;++i} std::cout<<a[i]<<std':endl; } }; がTDM-GCC 4.7.1 64bit でこのクラスを実行するとエラーになるのは なぜですか?
750 :
デフォルトの名無しさん :2012/10/02(火) 10:16:15.10
へー、実行できたのか そんなわけなさそうに見えるが
揚げ足取りはスルー
752 :
デフォルトの名無しさん :2012/10/02(火) 10:23:35.34
まじめに相手してらんねーやつ
int b[20*20*20*20*20]でスタックオーバーフロー
abc* Func(); と abc& Func(); ってどう違うの?
ポインタを返すか参照を返すかの違い
iiがスライシングでなくなっているからさすがにこれはundefinedだな class A { int i; public: A(int j = 0) : i(j) {} void print() const { std::cout << i << std::endl; } }; class B : public A { int ii; public: B(int j = 0, int jj = 0) : A(j), ii(jj) {} void print2() const { std::cout << ii << std::endl; } }; int main() { A a[1]; a[0] = B(1, 2); B* bp2 = reinterpret_cast<B*>(&a[0]); bp2->print(); bp2->print2(); // さすがに未定義 }
そもそもスライシングなどと名前付ける必要はあったんだろうか 代入まで1セットにするから妙なことになる 見るのはこれだけでいいだろう A a[1]; B* bp2 = reinterpret_cast<B*>(&a[0]);
でも参照先でポインタに代入したら同じ?
>>753 クラスのデータはスタックに保存されるんですか?
スタックを大きくするあるいは動的に作成すれば解決ですか?
スタックを大きくすること出来ますか?
標準出力からアスキーアートで表を作りたいんですけど、 綺麗な表を作る方法とか載ってるホームページとかないですか?
761 :
デフォルトの名無しさん :2012/10/02(火) 11:54:49.02
さあ 3.2MB を 64bit でどうするか見物です
>>760 AA関連のサイトには特定の環境の特定のフォントの幅についての言及はあるが、
標準出力だとフォントは指定できないから表示される環境に依存する。
まぁ、等幅フォント前提なら難しくないだろ。
プロポーショナルフォントで憑依される可能性があるなら、諦めろ。
つーか、環境に依存する話はスレ違い。
int a; template<int *pa> struct AA{}; template<int *pa> struct BB{ enum{ bb = (int)pa }; //B }; AA<&a> aaa; //@ BB<&a> bbb; //A @でaのアドレスをテンプレート引数に渡せたので aのアドレスはコンパイル時定数かと思っていたのですが Aをインスタンス化するときにBで「定数式が必用です」と なりました。 グローバル変数のアドレスはコンパイル時定数ではないのですか? Visual C++ 2010です。
当たり前だろ…
constexprが頭に浮かんだがだめか
constexprならポインタ型も定数式に出来るがVC++にはねーな
宇宙最強のC++11対応XMLライブラリはどれですか?
宇宙最強を紹介できる自信がない
772 :
デフォルトの名無しさん :2012/10/02(火) 20:29:03.13
#include <unordered_map> #include <algorithm> #include <vector> template <class C, typename T = typename C::value_type> std::vector<T> copy_to_vec(const C& from) { std::vector<T> res(from.begin(),from.end()); std::sort(res.begin(),res.end()); return res; } int main() { std::unordered_map<int,int> from; from.insert(std::make_pair(1,2)); auto to = copy_to_vec(from); } このコードなんですが、unordered_map::value_typeはpair<const key_type,mapped_type> と勝手にconstが入ってしまうので、sort(...)が使えません。-fpermissibleを入れろと言ってきます。 テンプレート引数でT=...となっている部分を変えて何とかなりませんか?
日本語へんだったかもですが、このままだとコンパイルエラーで止まるので、 テンプレート引数で何とか処理したいという質問です。
>>760 等幅フォントならそんなに難しくない。自分でCSVを表に直すソフト自作したことあるから分かる
1. 表の縦横のセル数、横一つ一つのセルの横幅最大値を取得
2. セルの横幅最大値を偶数にして(半角3つ分なら4つになるように修正)
3. 「┌と─と┬と┐でできた行」「├と─と┼と┤でできた行」「└と─と┴と┘でできた行」
「│とセル内容でできた行」の4種類を生成して、前3つと後1つを交互にくっつけて表を作成
こんなんでおk
>>771 こんなにカオスな言語を宇宙最強と誇れないんだが
>>772 中のconstを外したpairを返すtraitsを作って使え
template<class T>
struct pair_remove_const
{
typedef typename std::remove_const<T>::type type;
};
template<class T1, class T2>
struct pair_remove_const<std::pair<T1, T2>>
{
typedef std::pair<typename std::remove_const<T1>::type, typename std::remove_const<T2>::type> type;
};
template <class C, typename T = typename pair_remove_const<typename C::value_type>::type>
何か良く分からないなあ unordered_mapだと勝手にKeyでソートされるでしょ それをvectorに入れてソート? 目的が分からない 初めからvectorに入れてからsort()を呼び出せばいいような
どんなコンテナにも適用可能な関数にしたいけどunordered_mapを渡したらエラーになったって話だろう
なるほど std::remove_constを使うと簡単に変換出来ますね 逆はどうなるのかな やはり一個一個insertするしかないかな そうすれば勝手にまたconstになるから
unordered_map<k, v> m1; map<k, v> m2(m1.begin(), m1.end()); vector<pair<k, v>> v(m2.begin(), m2.end());
780 :
デフォルトの名無しさん :2012/10/03(水) 04:36:14.09
772ですが、みなさんどうも。 やっぱ力技でconst外すしかないですか。 >unordered_mapだと勝手にKeyでソートされるでしょ されないのが特徴ですが、mapに一回突っ込むのが妥当な感じですね。 にしてもvector<P<const T>>的なものがソートできないって・・・ 中身を書き換えるわけじゃないのにな。
ソースは短くなるけど、処理時間もメモリー使用量も大きくなる。 STLはそういうことが日常だな。
hoge
文字列を char [] で確保するとき、文字数+1 を確保しないといかんですよね?
http://www.c-tipsref.com/reference/stdio/snprintf.html で
#define N 256
としつつ
char s[N] = {'\0'};
と割り当てて
snprintf(s, N, "%sさんは%d歳の%sです.", name, age, sex);
ってやってますけど、snprintf の3項目目が256文字ちょうどだったとき、もれなくヤバいことおきませんか?
snprintf(s, N-1, "%sさんは%d歳の%sです.", name, age, sex);
な機がするんですけど、いかがでしょ?
snprintf(s, N-1, "%sさんは%d歳の%sです.", name, age, sex); にするか char s[N+1] = {'\0'}; にするかってことで
>n-1 番目より後の出力文字は文字配列に書き込まずに破棄されます って書いてるじゃない
\0 を含めたサイズを snprintf の2つめに指定したらいいんですか?
C++でインターフェース(純粋仮想関数だけのクラス)を継承する理由がいまいちわかりません 特定のメンバ関数を持っているといった制約はテンプレートで十分ですよね
interfaceを再利用性の高いクラスに使うとそれを使わない時にコストを払わなくてよいという原則に背くので敬虔なC++信者ならばinterfaceはむしろ使っては「いけない」
>>790 それはテンプレートで十分だと思うのですが・・・
>>791 動的な多態性を実現するには、テンプレートでは無理
テンプレートで実現できるのは、コンパイルタイムで確定する静的構造のみなので、一般的に言う自由度の高い多態性は実現できないよ
struct IBase { virtual void Method() const = 0; }; template <class X> struct Sub : IBase { X const & x; Sub(X const & x) : x(x) {} void Method() const { x.Method(); } }; void Func(IBase const & x) { x.Method(); } template <class X> void Func(X const & x) { Func(Sub<X>(x)); } このようにXが直接interfaceを継承する必要はない XをFunc以外で利用する際にオーバーヘッドとならないようにXが直接interfaceを継承することは避けるべきである
動的リンクとかしたことないのかね
避けるべきであるという表現から絶対に使わないという意図を読み取ることは不可能だ 柔軟性のある表現を勝手気ままに絶対的な法則であるかのように解釈することは愚か者によく見られる行動の1つである
>>794 アダプタパターンをどや顔で主張されてもな
>>794 完全抽象化classをinterface呼ばわりすんなよJava公
>>794 オーバーヘッドってなんだよ
クラス単位のインライン展開もしらないとか?
しゃべりかたはむかつくけど言ってることはおおむね間違ってないな 他クラスとの連携の仕方を、連携するクラスに押し付けるのではなく 連携を管理するクラスを一つつくり分離できる機能を分離するほうがきれい
低年齢化
>>793 Rootを始めとするC++ interpreterを使えば実行時にtemplateが動くけど。
C++はCompile方式じゃないとダメって制限はない。
ワロタ お前本当にそれ使ってるのか? 皆が皆使うと思ってるのか?
高エネ研究じゃ一般的ってか必需品だよな
GEANT4やらClingやらRootやら医療やら科学者向けに使われることが多いな
template<class Type> int Value( const Type &value ) { return value.Echo(); } Value( argv > 0 ? A(): B() ); Interpreterだとこれが動くんだから便利なもんだよ。 だからプログラミングはどうでもよくて、とりあえず手っ取り早く、 速いプログラムが欲しい研究屋に重宝される
その程度ってどのコンパイラでもだいたいとおるんじゃないの? まあなに使うにしてもshared_ptrないと話にならんわ。
>>807 それは多態性と関係ない。
しかも、普通にコンパイルできる。
テンプレート以前に三項演算子で引っかかってるだろそれ
>>812 その変え方なら三項演算子のままでいいじゃないか
エラーでない書き方おしえてくれよw
>>804 で、一般論を否定するレベルで皆が常用してるの?ってところがポイントなんだと思うが
>>812 main()は別にテンプレートとは関係ないからコンパイル通ったんだろ
コンパイル時に変数の値を定数化したいならC++11のcontexprが必要だろ
○constexpr
>>807 便利すぎてわろた次期C++に採用しよう
よっぽどC++が嫌いなんだな
821 :
デフォルトの名無しさん :2012/10/05(金) 13:00:42.10
iPhone、iPadでアプリ開発をするならCとC++どっちを勉強すれば良い?
Object-C
テンプレートな仮想関数を作りたいのだけれど代替手段はありますか? struct IHello { virtual ~IHello(void) {} template <class Allocator> virtual std::shared_ptr<IWorld> CreateWorld(Allocator allocator) const = 0; // ジーザス!コンパイルデキナイ };
template <class Allocator> struct IHello { virtual ~IHello(void) {} virtual std::shared_ptr<IWorld> CreateWorld(Allocator allocator) const = 0; };
struct A{}; A*operator new(size_t)=delete; みないな事出来ますか?
>>825 仮にそれが出来たとしても↓は止められないけどいいの?
struct B{
A a;
};
new B();
うん、いいよ
class A{}; class B{ void create(int val){ 【あ】 }; private: A *a; }; int main(void){ B b; b.create(10); } 【あ】の箇所でAのインスタンスをval個作成するにはどうすれば良いですか?
どこでdeleteする気なんだその宿題
>>829 class A{};
class B{
void create(int val){
a.resize(val);
};
private:
std::vector<A> a;
};
ブール型ってBOOLとBoolを使い分けるのが普通なんですか?
いいえ
>>833 どっちもC++関係無いな。
その定義次第としか答えられない。
実際の話 charが2バイトとか1バイトが8ビットじゃないみたいな環境のこと考えて普段からプログラム書いてますか
charは1byteだと規格で決まっています 1byteが何bitかは決まってませんが
char って文字を表す値を格納する型だから、 本来は最低でも32ビットくらいないとおかしいよな
アルファベット以外は文字じゃねーよ黄猿死ねってことだろ
840 :
デフォルトの名無しさん :2012/10/06(土) 18:41:54.62
printfやfprintfに自前クラスを渡したい。 class I { int n; public: I(int n=0): n(n) {} operator int() const { return n+1; } }; I i(10); printf("%d",int(i)); //OK printf("%d",i); //コンパイルエラー どうすればいいですか?
明示的に変換するほかない
842 :
デフォルトの名無しさん :2012/10/06(土) 18:46:58.92
Dのステマw
844 :
デフォルトの名無しさん :2012/10/06(土) 19:58:41.24
>>840 そもそも、C++で型保証ができない可変個数引数を使うのがわるい。
つまり、お前は死ぬべきだ。
>>840 素直にstd::cout使うか、printf風に書きたかったらboost::format使うべき。
846 :
デフォルトの名無しさん :2012/10/06(土) 20:21:55.03
>>844 C++11を知らないお前が死ぬべきだ()
printfは型安全に実装できるはずだろ。
まぁ、みんなありがとう。 printfではできないことは分かった。
>>846 実装と型保証の区別ぐらいできるようになろうよ…
hoge
キャスト
空クラスつくって(メンバなし) そのクラスの変数宣言したとき メモリに領域確保されるらしい どれくらい、そしてなにが確保されるの?
1byteって決まってるらしい
空かもしれないし1byteかも知れないしもっと大きいかもしれない
理解した。 あと データメンバ、メンバ関数のあるクラス作って その変数宣言したとき それ用にメモリに領域確保されるはず。 データ用の確保はわかるけど(intなら4バイトとか) メンバ関数用の確保は何? 関数コードのあるアドレスが確保されるの?
メモリポインタが確保される
>>855 指定の関数命令コードの
先頭のアドレスへのポインタってこと?
非仮想なら確保されないし仮想ならVTableへのポインタが確保されたりほかの何かが確保されたりする
仮想関数じゃなきゃ関数ポインタなんか確保されねーよ
仮想関数じゃなきゃ確保されないって おかしくない? じゃあどうやってオブジェクトのメンバ関数を 認識できてるの?
メンバポインタで関数を指定できるから なにかが確保されてるはずなんだけど
>>861 されない
隠しthisを受けとるだけの、普通の関数だよ
クラス自体には何の情報も持ってないよ
静的に解決してるんだよ
クラス内関数がthisポインタを暗黙に取る関数である、という記述を入門書には書いて欲しい時も多い
書いてあるよ っていうか少し考えればわかることだし
>>865 書いていない入門書が存在することに驚いた
>>866 それ分かる奴は入門者ではないだろう
boost::bindやら使わんと、そも明示的にthis渡す機会とかないし
静的に解決できるとは思えないけど? 静的ならば静的メンバ関数と同じになるじゃないか
>>869 だから基本的に同じなの
暗黙にthisを受けとる事だけが違うの
センスあるやつは一言説明するとあっなるほどっ!てなるところなんだけどねぇ
わからない class Hoge0{ void func(){;}; }; class Hoge1{ void func(){;}; }; int main(){ Hoge0 m; m.func(); } こんなとき静的には解決できないはず(どちらかわからないから) mになんらかの情報(例えば関数コードがあるアドレス) が格納されていなければならないはず
>>872 めんどくせーなー
自分で型を宣言してるだろーが
あと、そのクラス名を使うとヤツが来るぞ
>>872 m.func()と言う呼び出しは、mに対して何らかの処理を加えるということなので、
例えばvoid sfunc(Hoge0* p)という静的関数で
sfunc(&m);
と書くやり方でも実現できる
コンパイラ的には m.func() に行き当たったら、
機械的に sfunc(&m)に置き換えれば良いから静的関数だけで事足りる
sfunc()の中身は、もちろんHoge0::func()の定義から、これまた機械的に生成できる
何も問題は生じない
>>872 その場合、
Hoge0_func()
Hoge1_func()
と言う二つの関数が定義される
で回答になるかな?
>>876 オット失礼
Hoge0_func(Hoge0* this)
Hoge1_func(Hoge1* this)
だな
Hoge0::func() Hoge1::func() そもそもこう記述できる意味を考えろよ
int main(){ class Hoge0 m; void (Hoge0::* fp)() ; fp = &Hoge0::func; (m.(*fp))() } 上記コードで 上のfpはメンバポインタでこれはアドレスではなくオフセット値だと本ではあった 要するに(m.(*fp))のアドレスは (&m)+fpとなるんだろう これはつまりmの中に関数に関するなにかの情報があるということでは ないでしょうか? そうするとmの中には何も情報がなく静的に解決されるという 話はおかしくなると思うんだけど。
int main(){ class Hoge0 m; void (Hoge0::* fp)() ; fp = &Hoge0::func; (m.(*fp))() } 上記コードで 上のfpはメンバポインタでこれはアドレスではなくオフセット値だと本ではあった 要するに(m.(*fp))のアドレスは (&m)+fpとなるんだろう これはつまりmの中に関数に関するなにかの情報があるということでは ないでしょうか? そうするとmの中には何も情報がなく静的に解決されるという 話はおかしくなると思うんだけど。
>>881 どの本読んだ?
完全に間違いなので、参考までに教えてくれ
>>881 再度確認するが、仮想関数ではないんだよな?
C++明快入門って本だけど 間違ってはないと思うけど あと仮想関数のことじゃないですよ
>>881 thisポインタを暗黙に引数に取るただの関数だと何度(ry
クラス内関数内でthis->って出来るのは、thisが引数として渡ってきてるからだよ
アセンブリまで学ぶと、この辺りもっと明確に実感できるんだけどな VC++のコンパイラだと this ポインタは ecx レジスタで渡されてくる
>>884 情報ありがとう
話は元に戻るけど、間違ってるものは間違っているんだよ
君も言っているように、説明がつかないだろ?
でも、静的解決理論に何の矛盾もないんだよ?
>>881 関数の情報はどこかにはあるが仮想関数でないならmの中にはない
class Hoge0{
void func(){};
};
struct memfunc_info
{
int signature_id;
void (*pointer)(void);
};
memfunc_info *memfunc_table[NUM_OF_CLASS];
int main(){
Hoge0 m;
void (Hoge0::* fp)();
fp = &Hoge0::func;
//(m.*fp)();
memfunc_info info = memfunc_table[get_classid(m)][(int)fp];
switch (info.signature_id) {
case VOID_VOID:
((void(*)(Hoge0 *))info.pointer)(&m);
}
}
890 :
889 :2012/10/07(日) 07:24:05.60
>>884 間違ってると言われて間違ってないと思える根拠は何なの
全知全能の神ですか
using namespace std; 質問なんですが C標準ライブラリのstdin, stdout, stderrと、C++標準ライブラリのcin, cout, cerrってどんな関係にあるの? 例えば、coutなら、それは中でstdoutを使っているの? それとも共通のシステムコールを使っているだけで、coutとstdoutの間に平には依存関係は無いの? coutのstreambufを自作のに差し替えて、cout << "Hello World!" << endl; と書かれたときに全部大文字に変換して標準出力に出す、 (つまり標準出力→加工→標準出力という処理)をやるとき、streambufの中でstdoutを使っていいのかどうか迷い中
>>892 std::syncwithstdio()なんてメンバ関数がわざわざあるんだから内部的には
異なるバッファを持っていると考えた方が正しいと思う
それにC++のストリームは継承が効いてるからね
いろいろと内部が違うぞ
あ、ごめん std::ios::sync_with_stdio()だわ 試してもらうとわかるけどこれをfalseにすると読み書き速度は上がるが stdxx系と一緒に使用した場合順番通りに行われる保証が無くなる デフォルト引数はtrueなんで読み書き速度は下がるが順番通りが保証される
896 :
892 :2012/10/07(日) 10:59:36.46
dクスつまりstdoutとcoutでは ・バッファは別 ・std::ios::sync_with_stdio(true)のとき、endl毎にまずfflush(stdout)してからC++側のflush()する(多分) という関係であるっぽい了解 つまりcoutから使う前提の自作streambuf内では、std::ios::sync_with_stdio()は無関係で かつstdoutを使いまくって無問題、 みたいな
>>896 std::coutが実際はどこに向けられているか分からないんだぞ
stdoutは常に標準出力だろ
やってみおかしくなるから
>>897 ?むしろcoutがどこに向かっているかは結びついているstreambufが決めるのでは
streambufの差し替えでcoutに書かれた内容をファイルに落とすことはできているわけだが
(ちなみにこのときはstreambufからfstreamに落とす形がとれたのでC++の世界だけで話が済んだ
fstreamがstdoutに置き換わるだけなんジャネーノ
説明がおかしかった std::coutも標準出力だね 次のような場合がおかしくなる int main() { std::ofstream fs("test.txt"); std::streambuf* osbuf = fs.rdbuf(); std::ostreambuf_iterator<char> oic(osbuf); oic = 'a'; std::putchar('b'); }
糞みたいな質問する前にISOでもJISでも読んでこいよ それで理解できないならC++なんか使うな ゴミクズプログラマが糞みたいなコードを世に出すな
>>899 んーまあ参考にします
cout経由とそれ以外経由の出力先相違(といっても>892はどっちも標準出力だが)は問題視しませんので
(主眼はcoutに対するマニピュレータ使用を捨てずにリダイレクトとか文字列内容の加工を実現することにある
皆実際仕事でiostream使ってんの? ログ出力位ならいいけど実際使えなくね?
operator <<がダサいってところとわずかに遅いってとこ以外は*streamのが便利と思うが
置き換えが必要になったとき修正必要箇所の検出に漏れが出そう
ある意味iostreamメチャ便利ですが 自作クラスFooに対して std::ostream& operator<<(std::ostream& stream, const Foo& obj) を定義するだけで、どんなクラスも統一的にダンプできてマニピュレータも効く (上記関数内で複数要素をstream <<するとき、setw()系マニピュレータの効きを正しくするには一工夫要るが さらにその際ストリームに出力するフォーマットをうまく考えておけばシリアライザも兼用できる つまり std::istream& operator>>(std::istream& stream, Foo& obj) を定義してデシリアライズすると良い
3つのクラス Nasubi Letasu Qri があったとして、
ひとつの Nasubi へのポインタを Retasu と Qri が共有して持ってる場合、
>>905 のような方法でちゃんとシリアライズ、デシリアライズできるの?
ダンプはできるだろうけど
907 :
906 :2012/10/07(日) 16:07:54.86
>>905 すまん
よく考えたら、不可能ではない事に気づいた
(お行儀は悪いだろうけど)
908 :
デフォルトの名無しさん :2012/10/07(日) 16:16:49.36
A y=xでA y(x)と同じ振る舞いをさせたい(コピーコンストラクタを起動したい)のですが、 xをintに変換したものが呼び出されているようです。 この初期化の仕方を禁止する(明示的なものだけ残す)か、正しい定義をするか・・・ C++11でも可能です。よろしくお願いします。 #include <iostream> struct A { int n; A(int i): n(i+1) { std::cout << "value init" << std::endl; } explicit A(const A& rhs): n(rhs.n) { std::cout << "copy init" << std::endl; } operator int() const { return n; } }; int main() { A x(0); A y=x; A z(x); std::cout << x.n << std::endl; std::cout << y.n << std::endl; std::cout << z.n << std::endl; }
A(int i)=delete;
>>909 いや、それは必要なんです・・・
それを生かしておく方法はありませんか?
operator=( const A& )を追加
何ともならんのだけど・・・ A& operator=(const A& rhs) { std::cout << "operator= called" << std::endl; n = rhs.n; return *this; }
operator=(int)を追加
>>913 ちょっと意図が分からないので説明してもらえませんか?
近いところまでは行ってると思うんだけど・・・
#include <iostream>
struct A {
int n;
explicit A(int i): n(i+1) {
std::cout << "value init" << std::endl;
}
explicit A(const A& rhs): n(rhs.n) {
std::cout << "const copy init" << std::endl;
}
explicit A(A& rhs): n(rhs.n) {
std::cout << "copy init" << std::endl;
}
operator int() const { return n; }
};
int main()
{
A x(0);
A y=x;
A z(x);
std::cout << x.n << std::endl;
std::cout << y.n << std::endl;
std::cout << z.n << std::endl;
}
とりあえず結果はよさそうです。 A(const A&)が呼ばれなくなりましたね。 explicitをつけると失敗するというのは気持ち悪い・・・何が起こっているのか?
やっぱダメよ! const A x(0); で破綻する・・・。
>>915 のままだとconst A x(0);もOKなんですね。
わけが分からなくなってきた。
namespace Example { #define USE_SPACE_VIDEOS Extender::Multimedia::Videos struct FirstOuterDependent { int Something( USE_SPACE_VIDEOS::Fillter &filter ); }; struct SecondOuterDependent { int Something( USE_SPACE_VIDEOS::Fillter &filter ); }; #undef USE_SPACE_VIDEOS } namespace Videos = Extender::Multimedia::Videos;で定義したVideos消せないから 結局プリプロセッサ使うしか無い。エイリアス系の名前ってどうにか消せないのか?
消せないってなんだよ 意味わからん
#undefみたいにする事だよ
消せないだから逆か。 #undefのような事ができないって事。
1つの同じ名前空間内で、別々の名前空間に対し、同じ名前を付けたいんだ。 1つの名前空間を複数に別けるってのはちょっとねぇ。
class Dependent { namespace Videos = Extender::Multimedia::Videos; public: int Something( Video::Fillter &filter ); }; こうできりゃ最高なんだけどねぇ。
できないの?
>>926 ナショナリズムは小児病
リベラルは厨二病
社会に出れば人間誰しもコンサバティブ(真の保守)な考え方を持つに至るものだ
もっともそれはその者が人間であるに足る知能を持つ場合に限られるのではあるが
>>928 大規模開発してるとマクロでもいいから既存のシンボル名を消したいってのが解るようになるよ。
マルチメディア向け仮想層を構築すると、依存するライブラリに同じような名前がかなり登場する。
.cppに関してはどうでもいいけど、.hだと安易な名前空間の省略ができない。なんとか、
名前空間の汚染を少なくしようとすると汚い方法しか思いつかない。
読みづらくなるから嫌だけどusing namespaceもありっちゃありかなぁ。
こいつなら上書き可能だし。
どう見ても自分はバカだ、と言ってるようにしか見えない。
じゃお利口な方法教えてよ。
あと、もうひとつ。defineなんて多用すべきじゃないけど、 こんかいの場合でdefineが問題になる点は何? まさかgotoは絶対悪。gotoを書かなければ似たような事をしていいとかそんな思考?
>>928 ・無名名前空間はヘッダーで書いても意味がない
・N1とN2をNにまとめてるが、N1とN2が干渉したら完全名じゃないとアクセスできない
・NN内でNと同じ名前を定義したい場合衝突する
> 安易な名前空間の省略 なんてしなきゃいいだけだろ。 本当に大規模開発してるのか? 大規模開発で安易な名前の省略とかしてたら、マジで死ねるぞ。
>>935 楽に出来ることは楽にできたほうがいいだろうに。
あと、これはどういうケース?
>マジで死ねるぞ。
defineとundefで狭い範囲だけ有効な名前つける場合問題になったことはないけど。
ただ個人的にはキモいんで完全に同等機能をもった代替案がほしい。
>>936 > 楽に出来ることは楽にできたほうがいいだろうに。
小規模なら小手先テクニックでいいかもしれないが、大規模 (=多人数) だとみんなが
ちゃんと理解できる方法でやらないとダメだろ。
> defineとundefで狭い範囲だけ有効な名前つける場合問題になったことはないけど。
たとえば関連する修正箇所探すだけでも、小手先でそんな変なことしてるとえらく面倒
になるぞ。
まあ、最近のツールは結構賢いからあまり気にすることはないのかもしれないが。
>>937 つかうっていってもヘッダーの限られた範囲だけで、ヘッダーまたいだりすることは無いからねぇ。
まぁ、オムニ補完に頼りっきりの開発者だと辛いだろうね。
で、いい代替案は無いかねぇ。
939 :
デフォルトの名無しさん :2012/10/08(月) 16:57:23.54
外部結合を持つ識別子に「取り消し」って、そもそもどんな要求なんだろう
エイリアスだから実体と結合してる訳じゃない
いい加減、「そんな要求はアホだろ」と言われてることに気づけよ
>>939 名前の衝突を防ぐための要求。undefが存在するのと同じ理由だよ。
944 :
939 :2012/10/08(月) 17:30:08.15
あ、あれ?
>>940 でいちおー納得したつもりでいたけど
やっぱビンゴだったの??
>>944 何が?実体じゃなくエイリアスを前提に言ってることは変わらないけど?
> お利行さんはどうすんの?
>>920 のケースなら
> 1つの同じ名前空間内で、別々の名前空間に対し、同じ名前を付けたいんだ。
> 1つの名前空間を複数に別けるってのはちょっとねぇ。
に対して
> そんな個人の感覚を優先してマクロ使うほうがいいなんてC++使うのは向いてなさそうだな
のとおりでC++的でない設計を要求するような感覚は無視して素直に
namespace Extender { namespace Multimedia { namespace Videos {
struct FirstOuterDependent
{
int Something( Fillter &filter );
};
struct SecondOuterDependent
{
int Something( Fillter &filter );
};
}}}
namespace Example {
using Extender::Multimedia::Videos::FirstOuterDependent;
using Extender::Multimedia::Videos::SecondOuterDependent;
}
管理下に無い名前空間に割りこむなんて最悪じゃん。 外部ライブラリに似たような名前のクラスや関数できたらどうすんの?
マクロ嫌いが原理主義化して手段にこだわり結果を見失うとは・・・ これが取り憑かれたって事か
>>946 そもそもマクロは何がダメなのか分かってるのか?
マクロなんか使った事ないが困った事一度もないな タイプ減らす以外にマクロならではってのあんの?
メッセージクラッカ
952 :
デフォルトの名無しさん :2012/10/08(月) 19:55:06.09
>>947 割り込まれるようになってるのが名前空間で
それがいやならクラスを使うべき
>>950 __cplusplus や assert も否定されますか?
>>950 マクロに限らず演算子や型定義、関数定義を覗いたら言語機能の殆どがタイプ量減らすための構文だろ。
タイプ量気にしないならC使ってりゃいい。
>>950 俺も困ったことは全くないが、一応
処理速度を落とさずにコピペを防ぐというメリットがあることは知ってる。
あと、ライブラリなんか作ってると、一つのソースで、
マクロで VC++用、GCC用(いわば Win用、Linux用)と分けることはよくある。
デバッグ用、リリース用をマクロで分けることもよくある。
>>952 できると、していいじゃ違うでしょ。
そもそも理想論は置いといて実質の話だし。
>>952 VectorとかListとかありきたりな名前つけたらすぐ衝突するじゃねぇか。
マクロなんてデバッグ目的でしか使わないな
>>954 vlcやmplayerの様にアーキティクチャー依存部は、win32とかlinuxとか
ソース単位でディレクトリーに切り分けりゃいいものを、混在ソースを書きたがる奴は
何がしたいんだろうね。
マクロはいいんで、エイリアス衝突を回避するお利行さんな方法を教えていただけませんかね。 それも目的を見失った欠点だらけの方法以外で。
961 :
デフォルトの名無しさん :2012/10/08(月) 20:31:46.57
衝突回避は } なんでたったこれだけのことがわからないかね
もともと別物であった名前空間を単一のエイリアスを通じてまとめて扱おうとするから衝突を回避する必要が出ただけだろ? 別々のまま扱えば問題がなかったところにわざわざ問題を発生させる方法こそが目的を見失った欠点だらけの方法じゃないか
>>962 ローカル変数と同じ話で一時的に省略名が欲しいだけ。
undefで実現できるようなことなんだから大した話じゃないでしょ。
あと、いちいち個別に名前つけたって結局ぶつかるんだから意味無いでしょ。
いずれにせよ一時的につけた名前は不要になったら消さないと衝突を起こす。
尤も、ヘッダーに書くなら完全名を常につけるって手もあるが、冗長な上に読みづらすぎる。
while(1){
同じ名前空間で同じ名前を別の物につけたいとかいう時点で もうマクロでいいだろって気になる
>>946 >>962 そもそも、大規模開発した事なくて困った経験無いだろ。
複数の外部ライブラリを使い、複数の兄弟関係のヘッダーファイルが現れる状態だと
兄弟関係のヘッダーで名前がぶつかるってのは遅かれ早かれ必ずぶち当たる問題だぞ。
>>962 エイリアスを使った上で衝突を回避したいのが目的。
エイリアスを使わないんなら、問題回避の目的すら存在してないんで、
そもそも目的からずれてる。というか目的から逃げてる。
ネバーエンディングすとぉ〜おりぃ〜♪
>>966 現在のプロジェクトで 600Ks × 4 システム程度の開発してるけど、
そんなことで困ったことはない。
>>967 そもそも楽するためか何か知らないけど、エイリアス使うと問題が
発生するんだから、使わないと言う選択しろよと思う。
どうせ名前空間すら使わずMFCみたいな命名規則なんだろ
>>969 少なくともundefを使った場合見た目が悪いだけで問題は起きてない。
代替手段があるなら変えたいけど、現状で問題はない。
問題がないなら楽してもいいでしょ。
もし問題があるというならどういう問題がある?
マクロ使ってることが問題だなんて話はいいから、名前空間を汚染するとか
実際に困る具体的な問題点を指摘して。
>>969 あなたのプロジェクトじゃどういうふうに名前管理してらっしゃるんですか?
>>971 問題ないと思ってるなら、そのまま使ってりゃいいじゃん。
自分から
>>920 書いといて、
> もし問題があるというならどういう問題がある?
って、頭沸いてるとかしか思えない。
>>972 普通に、モジュールごとに名前空間分けて管理しているだけですよ。
>>973 >自分から
>>920 書いといて、
>> もし問題があるというならどういう問題がある?
>って、頭沸いてるとかしか思えない。
文脈がつながってなくて意味がわからない
975 :
デフォルトの名無しさん :2012/10/08(月) 22:36:22.26
GetExitCodeProcessで取得する値が負の値の場合、結果をうまく取得できないんですけど、どうしたら良いですか?
こんな調子じゃc++じゃなくても困ってそうね
>>973 名前空間を作る場合の話じゃなくて参照する場合の話なんですが・・・
A::B::E X(A::B::C::D n, N::L::O k); こういう書き方してるとか
元の話題が >エイリアス系の名前ってどうにか消せないのか? なんだから、「C++じゃ無理じゃね」 で解決なんでないの…
>>973 なんとなく
>>973 の意図を読み取って答えると、
問題ないって言ったのは一時的なエイリアスを使った事に対して。
当初の問題になってるのは、マクロを代替する手段がないかという話で問題点が違う。
また誤解を生みそうなので訂正 ×当初の問題になってるのは、マクロを代替する手段がないかという話で問題点が違う。 ○当初の問題になってるのは、エイリアスを削除するのにマクロを代替する手段がないかという話で問題点が違う。
C#とかだとnamespaceのエイリアス作れるんだっけか
>>974 ごめん、俺には君に (君のバカさを) 説明する能力がないみたいだ。
まあ、一行目だけ理解してくれればいいよ。
>>977 > A::B::E X(A::B::C::D n, N::L::O k); こういう書き方してるとか
他のモジュールを参照する場合は基本その形。
共有ライブラリと自モジュールは適宜省略するけど。
馬鹿だアホだ罵倒し始めて説明できないのは甘え
>>984 >まあ、一行目だけ理解してくれればいいよ。
その一行目で言ってる問題ないことと問題点が違うんだよ。
>>987 ないよ。
あるとすれば、
>>984 がズレた話題振った挙句、有用な答えもなしにバカ呼ばわりして逃げていったことぐらい。
> ズレた話題振った
>>920 のこと?
いじめたら、かわいそうだよ (w
あ
C++でweak_ptrをintrusiveに実装したいときはどう書けばできますか?
intの配列をnewしたとき初期化して無いのに中身が0になっていて バグが発見しにくいのですけど なんで0になっているんですか? どうしたらランダムっぽくなるんでしょうか?
>>992 そもそもそんなデバッグに頼るのが間違い。
どうしてもランダムにしたいなら、そういう処理つきのnewを作ってそれを使え。
パフォーマンス以外に理由があるかよ
いつも0でも、いつも0とは限らないんですよね。 0のものを0で初期化することは なんか無駄なことしてるようにしかおもえないんですが・・・
malloc使え 確保した中身がどうなってるかは知らんがな
大方 new int[10]() とかやって「初期化してないのに!」って騒いでるんだろ
これって、初期化をし忘れしてないかどうかを検査するために、 ゼロになっているか、それとも適当な数値が入ってるかで調べてるのに、 勝手にゼロが入ってて俺のデバッグ法が使えないじゃん、どうしてよ。 という質問?
次スレー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。