C#もよろしく
TwitterでC++ユーザを自称する奴らは何故総じてキモいのか? ああいうニワカはマジで消えて欲しい 彼らはもっと批判的な態度を取るべきだ
9 :
デフォルトの名無しさん :2011/05/03(火) 21:25:04.74
C++超初心者なんですけど コードの中に時々出てくる『:』(コロン)『::』(コロン2つ) ってなんなんですか?
>>9 コロン 2 個は名前空間
コロン 1 個は三項演算子とか switch 文の区切りとか
同じ記号を使っていますが、意味的には全く関係ありません
分かり辛いですよね・・・
>>9 コロン1つは
>>10 コロン2つは「○○::△△」で○○の△△を表す。
「北海道::山田太郎」で北海道の山田太郎さんをあらわす記法
12 :
デフォルトの名無しさん :2011/05/03(火) 21:49:05.27
>>10-11 なるほどー、たしかに似てるのに全然違う意味なんですね。
分かりやすく教えて頂き、ありがとうございます。
おっとclass Hoge : public Fuga 継承の:も忘れてはならんぜ
for(;;)ってfor(::)じゃダメだったの?
それおkにすると三項演算を使うとすごい見にくくなりそうだな
16 :
デフォルトの名無しさん :2011/05/03(火) 23:44:44.19
while では充分ありうるし
C++って多くの記号を使うように見えて、意外に @ とか $ とか ` とかは使ってないですよね。 * とか & に複数の意味を持たせるくらいなら、@ とか使えば良かったと思うのですが、 自称C++上級者の皆様はどうお考えですか。
どうでもいい
>> とかなあ・・・
@Hoge pHoge -> hoge; // Hoge *pHoge = &hoge; pHoge.func(); // pHoge->func(); pHoge -> hoge2; // pHoge = &hoge2; pHoge.func(); // pHoge->func(); pHoge = @hoge; // pHoge = &hoge; 僕の考えた最強のポインタ構文
@とか$とかはバックスラッシュみたいに別の文字であることがある トライグラフを増やすのはいやだったんだろう
22 :
デフォルトの名無しさん :2011/05/04(水) 01:00:51.36
基本的に B に準じる方針で @ と $ はアセンブラ絡みでなんとなくいや ` は絶対いらん!と男塾ばりの意地で死亡確認
左矢印演算子はなぜないのか
アロー演算子は面倒だと思うんだ C#みたいに . で済ませればハッピーだったのに
25 :
デフォルトの名無しさん :2011/05/04(水) 01:24:50.58
参照とポインタをちゃんと意味あって残してるのにそれは無理
>>24 昔はアロー演算子なんかなかったから全部 . だった。
ポインタ型がメンバを持たなければ . だけで -> も兼ねれば良い
->* ってやらしいな
->(i)
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
C# みたいに明示的にオーバーライドする方法ってありますか? または「この関数はこの関数をオーバーライドしたもの」であることをチェック(例えば boost::static_assert 的なもので)する方法はありますか?
>>31 基底クラスの関数にvirtualを付けなければ継承クラスの同名関数は無条件にオーバーライドされる
しかしそれをチェックする方法はない
これがC++の一つの問題点だ
実際に関数を呼び出してどちらが呼び出されるかは、クラスの定義を読まなければ分からない
>>31 クラスの継承関係と調べたい関数名がわかってればできるんじゃね?
static_assert(
is_super_sub<sup, sub>::value &&
has_XXX<sup>::value &&
has_XXX<sub>::value);
こんな感じで
継承関係にあって同じメソッド名前を持ってればオーバーライド=trueだよね
Doxygen+Graphvizで作図させてみれば一目瞭然だけどな
>>32 それだとオーバーロードになりませんか?
>>33 シグネチャが一致していることを調べる関数は無いんじゃないかな
クラス内に構造体を定義し、 その型をメンバ関数の引数の型にしたいのですが、 コンパイルできません。 その関数は、privateで内部からのみ呼ぶつもりです。 どうすればよいでしょうか? 雰囲気はこういう感じです。 ヘッダーファイル template<typename T> class Tree { private: struct treeFormat{}; treeFormat & searchParent(const T &parent, const treeFormat ¤t); }; ソースファイル template<typename T> Tree::treeData & Tree<T>::searchParent(const T &parent, const Tree::treeFormat ¤t) {}
37 :
36 :2011/05/05(木) 09:29:45.73
ソースが間違えていました。 どちらにしても、コンパイルは通りませんが… template<typename T> treeFormat & Tree<T>::searchParent(const T &parent, const treeFormat ¤t) {}
template <typename T> typename Tree<T>::treeFormat & searchParent(const T &parent, const typename Tree<T>::treeFormat ¤t);
39 :
36 :2011/05/05(木) 09:42:23.91
>>38 structの前にtypedefを付けると、コンパイル出来ました。
ありがとうございます。
40 :
36 :2011/05/05(木) 10:05:18.77
>>38 typedefは関係なかったです。
戻り値に「typename Tree<T>::」を付けると、コンパイルされました。
仮引数には付けなくてもコンパイルされたので、勘違いしました。
ありがとうございます。
templateはめんどくさいからクラス定義の中に関数定義まで全部書いたほうがいいと思う
42 :
デフォルトの名無しさん :2011/05/05(木) 10:19:05.66
ある本に配列要素の個数を調べる関数 template<int N> int number(double (&a)[N]) { return N; } int main() { double b[]={1,2,3,4,5,6,7,8}; std::cout << number(b) << std::endl; return 0; } が載っていたのですが、関数numberの引数 (&a)[N]の意味が わかりません。これってどう解釈したらいいですか?
「要素数Nのdouble配列型」への参照
44 :
デフォルトの名無しさん :2011/05/05(木) 10:36:13.89
>>43 ありがとうございます。
うーん、参照ですか。 ()がないと double& a[N]となって
a[N]に対する参照になってしまうから、それを防ぐために()を
つけたと...
なんか、2次元配列を受け取る関数の引数
f(double (*x)[N]) {・・・}
で、*xに()をつけるのと似ていますね。
45 :
デフォルトの名無しさん :2011/05/05(木) 10:50:09.65
>double& a[N]となってa[N]に対する参照になってしまう VC++では「参照」の配列(サイズN)と解釈されて、エラーになってしまいますね。
さあ次は配列の参照を返す関数をtypedefを使わずに書くんだ
template <class T> T f(void); f<int (&)[5]>();
48 :
デフォルトの名無しさん :2011/05/05(木) 13:51:18.87
templateを使ったクラスのコンストラクタ、デストラクタについてです。 ヘッダーファイル(sample.h)は次の通りです。 template<typename T> class sample{ sample(); virtual ~sample(); }; cppファイルは次の通りです。 template<typename T>Tree<T>::Tree(){} template<typename T>Tree<T>::~Tree() {} 他のソースでsample.hをインクルードし、「sample<int> foo;」と記述すると、以下のようなエラーが出ます。 undefined reference to `sample<int>::sample() テンプレートを使う場合、どのようにコンストラクタ・デストラクタを定義すればよいでしょうか。
間違いました。 ソースは以下の通りです。 template<typename T>sample<T>::sample(){} template<typename T>sample<T>::~sample() {} よろしくお願いします。
テンプレートの場合cppに実体は無理 全部へっだにかきなはれ
>>48 コンストラクタもデストラクタもprivateになっているけどいいのか
>>35 >それだとオーバーロードになりませんか?
なんでだよ
オーバーロードってのは引数の型や数が違う関数を定義する事だろうが
混乱してない?
53 :
デフォルトの名無しさん :2011/05/05(木) 14:30:11.81
単なる名前の隠蔽
>>50 どうしてもcppに書きたい場合、以下のような宣言が必要なのですね。
template class sample<int>;
>>51 あ、間違えていました。
55 :
デフォルトの名無しさん :2011/05/05(木) 15:57:57.31
>>52 確かに、オーバーロードじゃなくて
>>53 が正解だ。失礼しました
結局のところ、明示的なオーバーライド関連の話は無理っぽいな・・・
暗黙的なオーバーライドってどうやるの?
class Base { virtual void Hoge() { ... } }; class Derived : public Base { void Hoge() { ... } }
明示的なオーバーライドは?
class Derived : public Base { virtual void Hoge() { ... } }
基底が非virtualだったら破綻するよね
class Derived : public Base { virtual void Hoge() override; } C++0xにご期待ください
何故virtualなのかはわからないけど overrideキーワードは不毛なやり取りに終止符が打たれていいですね
>>60 からコピペしたからvirtual消すの忘れてた
何で前付けにならなかったんだろう void Hoge() override; override void Hoge();
overrideって型名の返り値使ってる人が死ぬからじゃないか
int hoge() const; const int hoge(); 戻り値に対する装飾じゃなく関数に対するものだから構文の一貫性取れてるでしょ
template <class T> class Hoge { public: template <class U> Hoge(Hoge<U> const & other) { ・・・ } // A Hoge(Hoge const & other) { ・・・ } // B }; ↑のようなケースでAがあればBがなくてもコピーするのに特に問題ないんだけど そういう場合ってBをわざわざ書く意味あるかな? というかHoge<T>::Hoge<T>とHoge<T>::Hogeの違いがわからん
テンプレートコンストラクタはコピーコンストラクタにならないんじゃなかったっけ
あーなるほど暗黙さんが仕事しちゃうのね
>>67 int hoge() virtual;
virtual int hoge();
shared_from_this ってコンストラクタ内じゃ使えないよね? 初期化時にインスタンス自身の shared_ptr を使いたいばあい、 class Hoge { private: typedef Hoge this_class; public: typedef boost::shared_ptr<this_class> shared_ptr; shared_ptr Create() { shared_ptr p(new this_class); ... // ここで shared_ptr を使った初期化をする。 return p; } protected: Hoge() {} }; こんな感じで、Create() の中で初期化するしか無いんですか?
typeofじゃダメなの?
std::exception を継承してるなら what() をオーバーライドすればいいよ
>>74 俺ならこう書くかなあ…うう腹痛い…
#include <stdexcept>
#include <iostream>
class foo_exception : public std::runtime_error {
public: explicit foo_exception( const std::string& what_arg ) : std::runtime_error( what_arg ) {};
};
void f1( void ) { throw std::runtime_error( "ehh" ); }
void f2( void ) { throw foo_exception( "gee" ); }
void check( void (*f)(void) ) {
try {
f();
} catch( foo_exception& e ) {
std::cout << "foo_exception" << std::endl;
std::cout << e.what() << std::endl;
} catch( std::runtime_error& e ) {
std::cout << "std::runtime_error" << std::endl;
std::cout << e.what() << std::endl;
}
}
int main( void )
{
check(f1);
check(f2);
return 0;
}
Output:
std::runtime_error
ehh
foo_exception
gee
78 :
77 :2011/05/10(火) 07:04:35.63
これもありでしょうか…? class foo_exception : public std::runtime_error { public: explicit foo_exception( const std::string& what_arg ) : std::runtime_error( "foo_exception: " + what_arg ) {}; }; void f1( void ) { throw std::runtime_error( "ehh" ); } void f2( void ) { throw foo_exception( "gee" ); } void check( void (*f)(void) ) { try { f(); } catch( exception& e ) { std::cout << e.what() << std::endl; } } int main( void ) { check(f1); check(f2); return 0; } Output: ehh foo_exception: gee
例外クラスを弄ることが出来なければ const library::exception&でcatchして、typeidで分けるしか無いんじゃないの?
ごめんね(´・ω・`)
コールバックかRTTIかマクロぐらいかなぁ
コールバックラムダがあればいいけど03じゃ書くのがめんどい
RTTIはコストがいやだから俺だったらマクロ選ぶかな
http://ideone.com/7cMUd 幸いにもtry-catchはブロックだから副作用も少ない
コンテナの指定した位置の要素を削除する方法ってどのようにしていますか? 今自分はitr=hoge.begin()してforループでitrを1つずつ増やして指定の位置に来たらerase・・・としてるんですがなんだか効率が悪そうで
そういうのはコンテナの種類によって変わるので一概には言えません アルゴリズムとデータ構造を勉強して、それぞれのコンテナの特性を把握しましょう
典型的なアホ回答 何も答えないよりたちがわるい
> コンテナの指定した位置の要素を削除する方法ってどのようにしていますか? 1. 削除処理の対象になるコンテナはどれ?例えば std::list とか、汎用とか 2. 指定する「位置」はどういう形で保持しているの?
>>86 1.主にdequeを使っています
2 今のところintです。指定位置のitrを返すとかあれば苦労しないんですが
hoge.erase( hoge.begin() + 2 ); // 先頭から数えて3番目の要素を削除 dequeならできるとおもうお
it = q.begin(); advance(it, index); q.erase(it);
>>89 おお!これはいいですね。ぜひ活用したいと思います
>>90 ほうほう、advanceなんてものがあったのですね
今回は削除だけなので89さんのが1行でよさそうですがこれも活用できそうです。
ありがとうございました
92 :
デフォルトの名無しさん :2011/05/10(火) 22:52:24.85
VC++初心者スレと迷ったがこちらでひとまず。
#pragma setlocale("en-us")
このコードをWin7の32bit、VC++6.0 SP6 + SDK環境でビルドすると、「地域が無効です」とエラーが出てビルドできない
「Win7でVC++6.0はサポートしてませんYO!」というのは承知しているのだが、Win7+VC6環境がある人、
ビルドできるかどうか試してもらえないか?
当方LenovoのPCで、下記修正パッチも出ているので機種の問題かとも思っている。
(ちなみにこのパッチあてても変化なし)
ttp://www-06.ibm.com/jp/domino05/pc/download/download.nsf/jtechinfo/MIGR-75198 Win7だからロケールIDが変わっているのかと思いきや、レジストリ上は0409のところにen-usが入っている
コンパイラが何をもって「無効」と判断するのか、そういった情報でもあると嬉しい
c++で入力からeofを受け取ったらループを抜けるようにしたいんですけど cinでは出来ないんですか #include <iostream> using namespace std; int main(){ int n; while(cin >> n){ cout << "n:" << n << endl; } return 0; } とやると、一回目にeofを受け取ると抜けてくれるんですが 二回目以降だと、なぜか二回連続でeofを入力しないと止まりません > ./eof.exe ^Z > ./eof.exe 1 n:1 ^Z ^Z > 他にwhile(!cin.eof())とかもやってみたけど上手く動きません
>>94 ちゃんと一回で抜けるけど? (Visual Studio C++ 2010 Express)
あと、どんな処理系使ってるのか知らんけど、ステップ実行とかできないのか?
確かに処理系によるかも知れないです
さっきLinuxとgccでやったら抜けました
>>94 はwindowsとborlandです
>>97 それはちゃんと止まると思います
プログラミングコンテストで書いたそういうCのコードをC++ですっきり書きなおそうと思いまして。
さっきsubmitしたらwhile(cin >> n)でちゃんと抜けてるみたいです。有難うございます
ただCの書き方のほうが実行速度は速そうですね、気のせいかな?
ところで、当方学生なのでVisual Studio 2010 Professionalを持ってますが
その機能の100分の1も使わないのに起動するのがやたら遅いので
コンパイラだけコマンドプロンプトから使おうと思ったんですが
C:\Program Files\Microsoft Visual Studio 10.0\VC\binのパスを通して
>cl test.cpp
みたいに使おうとしたら「MicrosoftR C/C++ Compiler Driverは動作を停止しました」
というメッセージが表示されてコンパイル出来ないんですが…
あ、powershellでは言われなかったけどコマンドプロンプトだとmspdb100.dllが無いというエラーが出た で、追加するとインクルードパスが云々。最後はイクルードするようにディレクトリを指示してるのに そんなファイルはないとか…諦めますた
VCのフォルダにvcvarsall.batがあったらそれを実行 それと処理系依存はそれぞれの処理系のスレへ
>>99 一回目の起動は確かにもっさりしているが二回目以降はキャッシュが効いて速いだろ
それにちゃんと.NET Runtime Optimization Service動かしてngen一度動かしてる?
ネイティブイメージを作っておくとかなり速くなる
maxとかminのマクロがあってstd::min,std::maxが使えないんですけど どうすればいいですか。
undef
#define NOMINMAX
windows.hをインクルードしているヘッダがかなり多いから もう直前で#undefしてる…
108 :
uy :2011/05/15(日) 01:10:47.88
ようするにゴミってことですね
んなもんコンパイラオプションでDだろ普通
VC++のコンパイルボタンを押してるだけのここの住人には何を言ってるのか理解できなかった
わからないやつなんていないだろjk
コンパイルボタンは10年押してようやく半人前だろ
おまえらコンパイルは Ctrl+(Shift+)B派? F7派? 右クリック「ビルド」派? メニュー「ビルド」派? make派?
>>107 でかいヘッダなんだから
コンパイル防壁かまさないと
>>115 プリコンパイルヘッダの頭に
#define NOMINMAX
#include <windows.h>
とやってる
農民マックスか
一揆
INT_MIN 殷と民 殷、周、秦、漢、三国、晋、南北朝、隋、唐、五代、宋、元、明、清、中華民国、中華人民共和国
いいからネタをやれ
VS2010 (Win7(x64))での XmlLite 開発に関する 参考サイトを教えてください。 そもそもVS2010で開発は可能でしょうか?
VS2010です。コンソールアプリでUnicode文字列を楽に表示しようとして locale::global(locale("japanese")); としたら、なぜかostringstreamを経由した数値出力がカンマ付きになります。 wcout << 1234567890 << endl; ではそのようなことは起きません。 wostringstreamのカンマ付加をどうやったらやめさせられますでしょうか…
127 :
125 :2011/05/15(日) 16:39:33.11
>>126 まことにdクス
byplayer様発言の方法で解決できました
(当方ostringstreamでなくてwostringstream使用)
しかしロケール訳解らん、、
TCHARより難しいことを日雇いプログラマに要求しないでホスイ、、
>>127 ロケールってのは簡単に言うとC++と出力の関係
つまり内部エンコーディングと外部エンコーディングの橋渡し
tcharは内部エンコーディング
横レスで申し訳ないが、 つまり例えばロケールがCロケールなら、 内部エンコーディングがwchar_tでも、 マルチバイトでOSに渡されちゃうって話? ちょっと不正確な言い方なのかもしれないけど
>>129 関数によるけど標準のものに関しては大体それで合ってるはず
ただしシングルバイトな
ロケール設定しない(=Cロケール)で
wchar_tをwfstreamで書き出すと分かるよ
できたファイルはANSI
ロケールを日本にすると
できるファイルはShift_JIS
>>130 なるほど〜そういうカラクリだったのか
ありがとう。
C++初心者です 質問なのですがMicrosoft Visual C++ 2010を使って ファイル名と文字列を入力して文字列が何回出てくるか 表示させるプログラムを作成しました そこでMicrosoft Visual C++ 2010のデバッグから実行するのではなく アイコンから起動しブラウザで入力して実行、出力するようにしたいのですが どうすればいいでしょうか 詳しく載っているサイトも教えてくれると助かります よろしくお願いします
>ブラウザで入力 GUIウィンドゥでファイル名等を入力 C++のCLR Windows Formアプリ でプロジェクト作成
>>132 *.EXE のアイコンをダブルクリックして起動すると表示して終わってしまう?
const int a[] = {111,222,333,444,555,666,777,888}; const int b[] = {333,444,555}; aの中からbの並びが全て一致する位置を返すようなSTLのアルゴリズム教えてください
>>136 const int * result = search(a, a + sizeof(a) / sizeof(* a), b, b + sizeof(b) / sizeof(* b));
0ー1ナップサック問題を動的計画法で解くんだが それをプログラミングして解ける人いたら教えて。
仮想関数を仮想関数のポインタ経由で実行した時に何か問題起こったりしますか。
無いよ
staticなファクトリ関数の有用性がわからないんですが クラススコープでアクセスできる便利なインスタンス生成用関数って感じなのでしょうか?
テンプレートで使ったり スタックに置くの禁止したり 生成の実態を隠蔽したり
145 :
92 :2011/05/17(火) 21:48:47.40
>>93 亀レスになったがサンクス
そのURLのロケールIDでビルドは通った
WinXPで「言語識別子」でビルドできたのは何かの間違いだったということにしよう
std::reverse_iterator<int>::base の戻り値がint型だって保証されてますか。
>>147 std::reverse_iteratorのテンプレート引数にintは入らないと思うぞ
int *のtypo?
int* です
std::ostringstream単体だとsprintfで可能な"%02d"とは 不可能ですよね?
> std::ostringstream単体 定義よろ
>>150 単体ってのが何をさすのか分からんが
マニピュレータ使えばいいやん
あこれです。 あったんですねどうも
>>150 こんなのでは?
int main()
{
std::ostringstream os;
int x[] = {3, 5, 7, 9, 11, 13, 15};
const int N = sizeof(x) / sizeof(x[0]);
for (int i = 0; i < N; i++)
os << std::setw(2) << std::setfill('0') << std::right << x[i] << ' ';
std::cout << os.str() << std::endl;
}
浮動小数点数出力する際に 小数点以下8桁まで表示したいけど、 123.45000000 みたいな後続のゼロは消したい。 マニピュレータで設定できる?
>>157 8桁未満を切り捨てるか四捨五入するかによっても変わるんだし、自前で丸め処理したらどう?
>>157 こんなのでは?
// 012345678901234
static char *constant = "123.12345670";
//static char constant[] = "123.45000000";
main(){
int i, len;
len = strlen(constant);
if(len < 10 || constant[len-9] != '.') return 0;
for(i=len-1; i>len-8; i--){
printf("%d<%c>", i, constant[i]);
if(constant[i] == '0') constant[i] = '\0';
else break;
}
printf("\n%s\n", constant);
}
>>160 マニピュレータ使いたいみたいだしこっちんほうがよくね?
#include <cmath>
#include <iomanip>
#include <iostream>
int main(void)
{
double val = 123.4567890;
int iLen = (int)std::log10(val) + 1;
std::cout << std::setprecision(iLen + 8) << std::noshowpoint << val << std::endl;
return 0;
}
整数部の桁数はsprintfなりlexcial_castしてlengthなりでも
テストして早い方を採ればいいんじゃない
162 :
160 :2011/05/21(土) 11:45:16.16
小数点以上の桁数求めて、どうする?不安
C++の入出力書式は確かに面倒臭いな いちいち本を読むかヘルプを参照しないと覚えてらんない でもCと同じ事が出来るし自分で定義したクラスにもマニピュレータや operator<<やoperator>>が定義出来るのがありがてえ
namespaceとか使って補完が働くようにして欲しい
ちょっと質問です。 CFoo foo[5]; CBar bar[5]; このように、同じ要素数の CFoo と CBar の配列があります。また、CFoo には比較演算子が定義されています。 今、std::stable_sort を使って foo を並び替えつつ、同じ並びに bar も並び替えたいのですが、なかなかいい方法が見つかりません。 例えば foo[5] に A,B,C,D,E、bar[5] に a,b,c,d,e が入っていたとして、 ソートによって foo が C,E,B,A,D と並び変わったなら同時に bar も c,e,b,a,d と並び代わっていれば成功です。 CFoo と CBar を含む新しいクラス CFooBar を作って、値をコピーして、ソートして、値を戻す、などとすればできなくはないですが、 いくらなんでも無駄が大きすぎると思いまして…。 自前でソートを書けば簡単なのですが、できれば標準アルゴリズムを使って解決したいです。 何かいい方法はないものでしょうか。
pair<CFoo,CBar> foobar[2000]; を使う
167 :
165 :2011/05/21(土) 20:45:58.59
>>166 pair は思いつきませんでした。
ですがこれだと、やはり全ての値をコピーして、ソートしてからもとに戻す、と言った作業が必要でしょうか?
確かにこれなら、first のみを比較する比較関数を作っておけば使いまわせそうですし、
結果としてはやりたいことが出来ているので、代案が思いつくまではこれで行きたいと思います。
ありがとうございました。
std::vector<std::pair<CFoo, CBar *> > foobarsでどうよ。つーか、実際にCBarだけの並びが必要ならダメだけど。
mapが使えるならmapを使った方が手軽。
速度はstd::sortが一番だな
>>167 pair<T1,T2>の比較演算子はT1から比較するから、お望みの条件なら比較関数いらないよ。
>165 添字の配列作ってそれを sort、アクセスする時はそれを経由すれば? int idx[5] = { 0,1,2,3,4 }; struct Comp { bool operartor()(int n1, int n2) { return foo[n1] < foo[n2]; } }; sort(idx, idx + 5, Comp()); で、アクセスは foo[idx[i]] と bar[idx[i]] を使う。 >171 T1 が等価の時、T2 も比較しちゃうから stable 性を破壊する可能性がある。
CFoo foo[5]; CBar bar[5]; なら CFooBar foobar[5]; vector<CFooBar*> foobar; vector<CFooBarPtr> foobar; とかでいいじゃん
2つのイテレーターをバインドするイテレーターを作るとC++の使い手っぽく見える
暇だから実体をソートするプログラムを作ってみた
http://codepad.org/DHcpe0Ta なんでこんなにrandom_shuffle()に時間がかかるんだ?
と言うより、sort()はvector用に最適化されているのかと言いたい
内部ポインタの付け替えやってるとか?
std::vector<int> a; std::vector<int>::iterator i = a.begin(); std::vector<int>::const_iterator ci = a.begin(); これが出来て struct Foo { struct iterator{}; struct const_iterator{}; iterator begin(){ return iterator(); } const_iterator begin() const { return const_iterator(); } }; Foo f; Foo::iterator i = f.begin(); Foo::const_iterator ci = f.begin();//ここ これが出来ないのは何故ですか。
型が違うから
vectorは何故出来るんですか
>>180 返り値の型が違ってもオーバーロード出来ないぞ
type traitsをよく読め
例えばこうすればコンパイルが通る 明らかに関数のオーバーロードに失敗している証拠 というか正確な関数のlookupに失敗していると言った方がいいな struct Foo { struct iterator{}; struct const_iterator{}; iterator begin() { return iterator(); } const_iterator begun() const { return const_iterator(); } }; int main() { Foo f; Foo::iterator i = f.begin(); Foo::const_iterator ci = f.begun(); //ここ }
operator const_iterator() { return const_iterator(); } これで行けました。
エラー E2034 const_iterator2.cpp 30: 'Foo::iterator' 型は 'Foo::const_iterator' 型に変換できない (関数 main() ) BCCは糞だな
配列、繰返しの数を大きくしていくと「動作を停止しました」と出て止まるのですが原因が分かりません
具体的には
http://codepad.org/Nkh1TwRl のコードでおよそCNTS > 530000で落ちます。
この関数自体はモンテカルロ法で自然対数の底eを返す、
「n個の玉をn個の箱にランダムに入れるという試行で、ある箱に玉が一つも入らない確率は (1-1/n)^n。
したがって、その試行をシミュレーションして、空の箱の相対個数を求めれば、その逆数がネピア数の推定値になる。」
というアルゴリズムです。
genrand_res53()は、0以上1未満の乱数を返します。
CNTS=520000まではメモリの使用量が大きく上がることもなく瞬時に正しい結果を出します。
コンパイラはg++4.5.2、OSはWin7(64bit)です。
なにか分かる方よろしくお願いします。
>>186 スタックが怪しい
static int box[CNTS]; にしてはどうか
>>187 ありがとうございます
正しく動きました
>>188 如何せん初学者なものでクラスについて正しい理解が追いついていません
とりあえずコードは保存させて頂きましたので今後の勉強材料にします
ありがとうございました
C++でexturnってどんな場合に使いますか? 部活の先輩のコード見てたら書いてあったんですが よく見るexturn "C"ではなくグローバル変数のexturnです
>C++でexturnってどんな場合に使いますか? 全く使いません。つーか、エラーになりますな。
const変数を外部結合にするとき
exturnって何?
externのことだろ・・・常識的に考えて
class Buffer { private: size_t size; void * pBuffer }; こんな感じで取得したメモリへのポインタとサイズを保持しておくような汎用クラスって、boostライブラリにある?
std::vector じゃダメなのか?
std::vector だと素のポインタを使えない
>>198 >int Get(){ return num; }
int Get() const{ return num; }
>bool Compare( const Data &left, const Data &right );
static bool Compare( const Data &left, const Data &right );
>>200 コンパイル出来ました
ありがとうございます
>>198 これ確かbindとthisを組み合わせて出来なかったっけ?
叙述関数がメンバ関数の場合
>199 ちくしょう、ありがとう
>>191 >>193 すみませんexternです……
>>192 ありがとうございます
const変数以外は使いませんか?
先輩のコードを読みなおしたら、グローバル変数にexternを付けていました
あまり意味が無い上に良くない気がするんですが、こういう用途での使用のメリットとかあるのでしょうか?
グローバル変数使うなって先輩をぶっ叩いておけ。
>>202 std::sort(vec.begin(), vec.end(), boost::bind(&Test::Compare, this, _1, _2))
だな
>>204 externはずしてビルドしてみたら?
>>206 うんboost使うと簡単なんだけど、これC++標準のbind1stとbind2ndだけ使っても
書けないかな?binary_functionの場合無理か?
>>204 なんでextern付けてんすかって先輩に聞け
てんかす に見えた
>>208 無理だろうな
C++03のbindはbinaryまでしか対応してない
もし可能だとすれば、まずmem_funを使ってmem_fun2_tとかを作ることになると思うがこいつはternaryだ
int b; int a = 0 ? 0 : ( b = 111, b = 222, b = 333 ); これaの値が333になるんですけど、どの環境でも同じですか?
aに333代入してるんだから当然じゃね?
>>212 カンマ演算子の優先順位と、operator=の戻り値がどうなるか考えれ。
それと a の初期化で0 ?ってしているから常に偽で 0 : は代入されない。
>>211 了解ありがとう
thisをbindしなければいけないのが内部にbinary_functionを作った場合の
問題だね
そうなるとternary、つまり引数を3つbindしなければいけなくなり、これはboost
もしくはtr1のbindでないと無理だ
staticにすればthisを持たない単なる関数になるので可能なわけだ
テンプレートクラスのメンバ関数をインライン化しないようにするにはどうすればいいですか。
template<type T> class ClassName { test(); } template<type T> void ClassName<T>::test() { }
コンテナで指定の位置が存在するかどうかを調べるにはどうしてますか? hogeで5個何かが入っているとして 6以上を指定したら-1を返す・・・みたいな 今はdequeを使ってるのですがいちいちサイズと比べているのがなんか効率悪いような気がして
サイズと比較するのが普通だと思うよ ちなみに、atメンバを使うと、範囲外のときはout_of_range例外が投げられる
>>219 dequeでsizeは問題ないでしょう
あえて改良したいなら、数を問い合わせるのではなくemptyで判断するように工夫すればスッキリする
うーん、そうですか。それではサイズのままにしておきます。 ありがとうございました
const std::string hoge("HOGE"); 的な事をしたいんですが、 クラスのコンストラクタで使うと当然問題が出てしまうんですが、 何か良い方法は無いでしょうか?
問題?何が?
何の問題が?
一大事や・・・
-- namespace hoge { const std::string hoge("HOGE"); } class Fuga { std::string mHoge; Fuga():mHoge(hoge::hoge){} }; const Fuga fuga; -- この場合、 実行するまで hogeとfugaのどちらが先に初期化されるかが未定なので、 仮にfugaが先になった場合、hoge="HOGE"を期待できないきがしました。
あれ?でも、 hogeのオペレータ演算子が使えてる時点で、 hogeのコンストラクタは通ってるのか…。うーむ。 お騒がせしました。
単一翻訳単位内なら上からって規格で決まってるよ
test.h std::string s; void say(); test.cpp void say() { s = "say"; std::cout << s << std::cout; } なぜ、これは怒られるのですか?
わざわざこんなところで聞かずとも、コンパイラが教えてくれてるだろうに 無視かよコンパイラが泣いてるぞ
test.hを複数のcppからincludeしてて sの定義が複数あります的なエラーが出てるのだと予想
236 :
230 :2011/06/04(土) 15:29:56.03
>>234 #include "hellow.h"
int main(int argc, char *argv[]) { say(); return 0; }
--------------------------------------------------------------------
#ifndef HELLOW_H
#define HELLOW_H
#include <string>
std::string s;
void say();
#endif // HELLOW_H
-------------------------------------------------------------------------
#include "hellow.h"
#include <iostream>
void say(){
s = "hellow";
std::cout << s << std::endl;}
こんな、コードを書いたのですが...
>>235 だったな
test.hの
std::string s;
を
extern std::string s;
に書き換えて
cppファイルのどれか一つに
std::string s;って書いとけ
238 :
230 :2011/06/04(土) 17:40:49.35
>>237 動きました thx
*.hに変数を定義するということは、グローバル変数を宣言するということですか?
240 :
230 :2011/06/04(土) 19:42:19.81
>>239 他のプログラムから参照されるものだけを、*hに書けってことですね
thx
つーか、C++でグローバル変数なんか使うなよ。
俺がバカなだけかもしれないが
C++では#defineの代わりにconstつけたグローバル変数を使うのが普通じゃないのか?
グローバル変数使うのはだめなの?教えて
>>241 さん
・どこか適当な名前空間の大域変数にする ・どこかのクラスの静的変数にする あたりが落しどころかなあ。。
>>242 それは変数じゃなくて定数じゃないのか?
>>244 気になって調べてみたら
const~を「定数変数」って呼ぶのはあまり一般的じゃないみたいだった
さーせん
グローバルクラスにしておけばいいのだろうか
グローバル変数は1個も使わないな。 しかたなくシングルトンにすることはある
248 :
デフォルトの名無しさん :2011/06/05(日) 16:29:22.26
グローバル変数に反対する人は、まずハゲを攻め落としてこい std つけたからって本質は変わっていない
C++でグローバル変数もどきを使う時はクラスのstatic変数を使うよな 他のクラスから見られるとまずい場合な
namespace hoge { const int BanpeiID = 0; } class Hoge { public: static const int BanpeiID = 0; } 名前空間に所属する変数と、クラスに所属する変数 どっちの方がいいんだ?
適切に分割したときどちらかに自然におさまるんじゃない? どっちかが良くてどっちかが悪いというものじゃないと思うぞ
すみません、質問です。 「*.lib : error LNK2001: 外部シンボル "__imp__wfopen" は未解決です。」 このようなエラーが出ます。 msvcrt.libをリンクすると出なくなるのですが今度はfreeやnewが競合します。 __imp__無しのものは既にあると思うので、これとリンクさせることは可能ですが。
253 :
252 :2011/06/07(火) 17:22:16.13
LIBファイルのエクスポート名を変える方法はありますか?
ない LoadLibraryとGetProcAdress使いなされ
255 :
252 :2011/06/07(火) 20:08:35.74
配布されているビルド済libファイルが、__imp__関数を要求するのですが。 なので、ソースの書き換えは無理なんです。
wrapperdll作れ
自分のソースを動的リンクでコンパイルしろよ
258 :
252 :2011/06/07(火) 20:43:40.12
MDビルドに統一します。ありがとう。
259 :
デフォルトの名無しさん :2011/06/07(火) 22:12:33.58
260 :
252 :2011/06/08(水) 00:17:07.19
いろいろと試したのですが。MT(静的ビルド)にしないとエラーできます。 MT設定のままnew、deleteをMSVCRT.LIBのものを使うことは可能ですか?
261 :
252 :2011/06/08(水) 00:26:45.15
すみません。ヘッダファイルの読み込み順序を変更したらMDビルドできました。
<regex>をつかった方が一文字ずつ調べるやり方よりかは 早かったりしますか?
この質問にどう答えるかでそいつの力量がわかるというもの
だまれカス
あるVisual C++で書かれたライブラリをg++に移植したらメモリが漏れまくってます。 調べたらデストラクタが全て空っぽでこうコメントに書かれてます。 - Nothing to do, really. All lists, array-type fields, etc, are - handled by the compiler generated destructor. All we have to do - is make an empty function. Visual C++ではメンバーに他のクラスへのポインタが有る場合に自動的に そのデストラクタが呼ばれるのですか?
ンなわけないだろ
どこのクソライブラリだよ
268 :
265 :2011/06/08(水) 23:27:31.00
>>266 そうですよねえ。 変だな〜と思いながらひょっとしたらそういう拡張がされてるのかな
と思って探してみたのですが見つかりません。
C++/CLIだったりして
c++プログラマ予備軍の脱糞太郎という者で御座います。 ここはC++相談室との事で是非とも相談をさせて頂きたいので御座いますが お腹が空きました。 如何すれば宜しいのでしょうか。
死ね。
右手でも食ってろ
273 :
デフォルトの名無しさん :2011/06/09(木) 19:11:05.47
どんな型でも受け取って、表示可能な関数の作り方をおしえてください。 PHPのprint_rのようなのがあると便利です。 自作変数すべては大変とおもうのでSTLまで変数でいいのですが。
274 :
273 :2011/06/09(木) 19:18:20.03
boostのanyで受け取って、そのあとどうしたらいいですか?
boost::shared_ptrはなぜ0の代入が定義されていないんですか
>>273 そいうのは、テンプレートの方がいいんじゃ無いかな?
277 :
273 :2011/06/09(木) 20:34:29.13
お世話になります 線形代数の、例えばベクトル演算のようなことを構造体(クラスでも良いのでしょうが)と 演算子のオーバーロードで簡易に表記できるようなシステムを作りたいです。 演算子のオーバーロードについて勉強中なのですが、例えば Vector v; int x://or double, float,... などと適当に定義して x*v を線形代数のようなベクトルをx倍にさせるような演算子*を定義することは出来ますか? v*xなら*をVectorのオーバーロード関数として定義すればよいですが 逆は*をintのオーバーロード関数とせねばならず不可能・・・?
>>278 忘れ去られたSTLであるValarrayを使うと簡単に出来るんじゃねーの
まず発想からおかしい
>>278 Vector operator*(int, const Vector&);
をクラス外で定義
>>279 似たようなことが出来るSTLがあるのですね
STL自体使ったことがありませんが使えそうになったときのために記憶にとどめておきます。
>>280 演算子のオーバーロードを知ったときこれだ!と思って飛びついたのですが、おかしかったですかね?
>>281 それでよいのですか
わかりました。
すばやいご返答ありがとうございました。
VC++のフォームアプリケーションでメニューバーをつけたいのですが MenuStripを配置したところ通常のメニューとは違うデザインになりました 普通のデザインにするにはどうしたらいいの?
1. #include "Hoge.h" 2. #include <stdio.h> 「"」形式と「<>」形式のインクルードはどっちを先に記述するべき?
285 :
デフォルトの名無しさん :2011/06/09(木) 22:47:48.55
どっちでもいいだろ。 自作ヘッダが先のほうがエラーが見つけやすいと思うが。
>>285 やっぱりそうなのか?
今まで何も考えずに標準ヘッダを先に書いていたんだけど、自作を先に書かないとインクルードのミスが見つけられないんだよね
メンバ関数のメモリ消費ってインスタンスの数に依存しますか?
>>278 線形代数のライブラリって、boostの中にもあったような気がするから、
確認してみるといいかも。
>>286 一方私はより標準的なものから並べている。例えば、
<stdio.h>
<unistd.h>
<fftw3.h>
"product.h"
"MyApp.h"
の順。
290 :
デフォルトの名無しさん :2011/06/09(木) 23:51:07.41
それだと、"product.h"が不完全でも、エラー無しで通ってしまうことがある。
>dir/foo.cc の主たる目的が dir2/foo2.h にあるものを実装もしくはテストすることであれば、dir/foo.cc では次の順序でヘッダをインクルードする。 >1 dir2/foo2.h (適切なところ ? 詳しくは下を参照)。 >2 Cシステムファイル >3 C++システムファイル >4 その他ライブラリの .h ファイル >5 プロジェクトの .h ファイル googleさんはこうしてるみたい
現状、こんな感じでインクルードしてる google のガイドラインと同じなんだよね <stdio.h> ←C <string> ←C++ <boost/shared_ptr.hpp> ←その他ライブラリ "Hoge.h" ←このプロジェクトのもの ただこの方法も前述の問題があるんだよね・・・
別にエラー出たらその時点で直せばいいから問題とは思わないな。
俺は
>>291 の 2 と 3 が逆だな。特に意識してなかったが C 先の方がいいのかな?
ローカルなほど下にインクルードかな std 3rdlib mylib app
Foo.hを実装するFoo.cppの場合
"Foo.h" を1行目に書いて後は
>>295 と同じ
忘れてくれ
プレイスメントニューを使うと初期化しなくて良いと聞きました。 詳しく教えてください。
struct A{ struct B{ int x;} moo; } foo; とある場合,メンバのメンバのポインタの取得はできますか? &A::B::xでも&A::moo::xでもおかしいですよね... あまりやりたくないですがreinterpret_castして足すしかないのでしょうか.
&foo.moo.xじゃないの?
int *p1 = &foo.moo.x; A::B *p2 = &foo.moo; こういうこと?
>> 302 メンバポインタ的なオフセットが知りたいのです. イメージ的には &foo.moo.x - &fooなんですが... &foo.moo.xだと,xのアドレスになりますよね?
>> 303 そうなんですが, A::moo::x *p = &foo.moo.x; みたいに,メンバのメンバへのポインタが取りたいのです…型安全に. タプルみたいなものを使わないと無理でしょうか?
306 :
301 :2011/06/10(金) 16:27:06.18
305の最後は忘れてください. 構造体のネストだと無理かなーと思っただけです. やはり整数にreinterpret_castして引き算…でしょうか… そもそもこんなことが必要なのも問題なんですよね…
普通こんな使い方するんじゃね? struct A { struct B { int x; } moo; } foo; int main() { A::B *b = new A::B; int A::B::*xx = &A::B::x; b->*xx = 2; std::cout << b->*xx << std::endl; delete b; }
>>301 int A::B::*p = &A::B::x;
>>301 int A::B::*p = &A::B::x;
でいい。foo.mooのメンバにアクセスしたいなら
foo.moo.*p
とすればいい
こういうのは叱られるな どうすればいいのかな struct A { struct B { int x; } moo; } foo; int main() { A f; int A::B::*xx = &A::B::x; f.B::*xx = 3; std::cout << f.B::*xx << std::endl; }
これなら動くわ どうなってるんだ #include <iostream> struct A { struct B { int x; } moo; } foo; int main() { A f; int A::B::*xx = &A::B::x; f.moo.*xx = 3; std::cout << f.moo.*xx << std::endl; }
>>311 どうなってるも何もそれで正しいよ。オブジェクトの模式図を紙に書いて確認してみなよ
しかしこれでreinterpret_castしてオフセット計算しようとかマジ恐ろしい野郎だな
>>312 いや、もしmooが宣言されてなかったらどう書くかって話
314 :
301 :2011/06/10(金) 18:19:02.65
>>307 >>308 >>309 なるほど,理解できました.なるほど納得です.勉強になりました.
そして私は大きな間違いをしていました.やりたかったのは,
struct B{ int x; };
struct A{ B foo; };
のときですね...
&A::fooは取得できるんですが,A::B::xではとれません…
計算はできても良さそうなのですが…
ひょっとしてこの場合も同じようになるのでしょうか?
315 :
301 :2011/06/10(金) 18:21:10.40
>> 312 まったくもって…ですね reinterpret_castは基本的に使うなってのはわかっているのですが, 他に解決策もわからず,お尋ねしています…
>>314 もしかしてやりたいのはこういうことか?
struct B{ int x; };
struct A{ B foo; };
A::B A::*p = &A::foo;
int B::*q = &B::x;
A a;
a.*p.*q = 42;
317 :
301 :2011/06/10(金) 18:36:31.11
しまった…混乱してますね.先ほどと名前を一致させると st. B{int x;}; st. A{ B moo; }; A foo; のときに,foo.moo.xへのメンバポインタがほしいわけです. やりたいイメージとしては,同じく, int <何かしらの型>* p = &A::moo::x; ...みたいなのですが... 右辺が明らかにおかしいです...
318 :
301 :2011/06/10(金) 18:39:04.30
>> 316 そうそう!そういうことなんです. それを,一発でできないのかなぁと… 静的に決まるので,計算できるんなら取れてもいいのに,と思いまして…
>>318 そりゃムリだと思うなー
B A::*とint B::*を持つ、Aをとってintを返す関数オブジェクトを作るってのがやりたいことに近そう
320 :
301 :2011/06/10(金) 19:05:01.75
>> 319 なるほど.了解です.簡単にできるように ちょっと頑張ってみます.ありがとうございました.
namespace hoge { namespace fuga { namespace piyo { namespace impl { template <class t> struct x { /* ... */ } ; }}}} template <class t> struct x { typedef hoge::fuga::piyo::impl::x<t> type ; } ; template <class t> void f(typename x<t>::type const & ) { /* ... */ } int main(void) { x<char>::type c; x<short>::type s; x<long>::type l; f(c); f(s); f(l); return 0 ; } 上のように〜::typeを引数にするとlookupが働かないみたいなんですが これをうまく動かせる簡単な方法はありますか?
322 :
デフォルトの名無しさん :2011/06/11(土) 14:52:23.45
istringstream str("20 31 345 -50 109 8"); istream_iterator<int> first(str), second, last; while (first != last){ cout<< *first <<endl; ++first; } で一応、正常に整数が出力されているようですが、 while (first != last)の条件でどうしてうまくいくのか わかりません。Iterator last にはstrの終了情報は渡って いないように思うのですが。
>>322 ++firstでもう何もないend的なところに移動したイテレータと、デフォルトコンストラクタで初期化されたイテレータがイコールになるようにoperator==が定義されてる
324 :
デフォルトの名無しさん :2011/06/11(土) 17:03:49.39
ありがとうございます。 strから取り出すものがなくてfirstが0 (あるいは、end()に相当するもの) を返すのと、最初から何もstrみたいな文字列をもってなくて0を返すものが 等しくなって終了しているのではないかと、質問した後で思いついたのです が、そう間違っていないようですね。 しかし、なかなか凝ってますよね。
その動作って保証されてたっけ
されてる
327 :
デフォルトの名無しさん :2011/06/11(土) 19:10:06.60
>>321 f<char>(c);
f<short>(s);
f<long>(l);
仕様書 14.8.2.4 段落 4
導出の対象外
修飾付き識別子に指定された、型を示す入れ子名前指定子
に該当して、型実引数が導出できないのでは?
std::setから条件に一致するすべての要素を巡回するイテレータみたいなものを取得することは出来ますか?
find_ifで
>>328 boost::filter_iterator
331 :
デフォルトの名無しさん :2011/06/12(日) 10:55:55.89
複素数と整数の演算は定義されていません。例えば、 complex<double> z(1.0,1.0); cout<< 2 * z << endl; はエラーになります。double型との演算は定義されているため cout<< 2.0 * z <<endl; としなければなりません。しかし、2*zとかz/3のような演算もやりたいです。 整数と複素数の演算をオーバーロードすればいいのですが、暗黙の型変換 演算子(これってクラスの時しか使えない?)やtrait(typedefテンプレート) を使って対応できないものでしょうか?
>>331 std::floor()とかstd::ceilを使って小数点以下を切り捨てるか切り上げたらだめなん?
それかstatic_cast<double>を使うとか
だいたいstd::complex<type>なんだから、整数の複素数でいいならstd::complex<int>とすればいいし
要するに小数点以下の扱いをどうしたいかによって変わって来る
もっともstd::complex<int>じゃあ除算は正確に定義出来ないだろうね
double(2) * z
335 :
デフォルトの名無しさん :2011/06/12(日) 17:07:14.21
やっぱり、素直に整数と複素数の演算子をオーバーロードした 方が簡単だと思いました。
演算子のオーバーロードなんてしなくていいよ
>>335 intが先に来る場合はintは基本型だからメンバ関数を持てないだろ
int.operator(complex)ってのは無理だからね
operator*(int, complex) を定義するにしてもcomplexを改変しなければならないし
まあfriendにしなくてもintを内部でdoubleにキャストするだけなら必要無いよこんなの
>>337 >必要無いよこんなの
※ 個人の感想です。
339 :
デフォルトの名無しさん :2011/06/12(日) 18:24:29.62
いや、intが先だとか。後だとかというレベルの問題じゃないんだけどね。 まぁ、データメンバかメンバ関数でそういうのがあった気がするけど、 忘れたw。
340 :
デフォルトの名無しさん :2011/06/12(日) 18:40:05.31
>>337 確かに、メンバ関数が先か、どうかの話もないではあいが。。。
残念ながら、完全にピントがずれてる。
stdに勝手にへんなオペレーター追加とか犯罪レベルの愚行ですよ
const int size = 5; template <class X> class art{ X a[size]; public: X &operator[](int i); }; template <class X> X &art<X>::operator[](int i){ try{ if(i < 0 || i > size - 1) throw 1; }catch(int i){ cout << "エラー\n"; return 0; } return a[i]; //エラー } 汎用安全配列を作っているのですが、戻り値の型が違うと怒られます テンプレートでなければこれで通ると思うのですが、なにか違いがあるのでしょうか?
なんでエラーメッセージを貼らないの?
すみません、これです 1>d:\project\演習用\main.cpp(17): error C2440: 'return' : 'int' から 'int &' に変換できません。 1> d:\project\演習用\main.cpp(12): クラス テンプレート のメンバー関数 'int &art<X>::operator [](int)' のコンパイル中 1> with 1> [ 1> X=int 1> ] 1> d:\project\演習用\main.cpp(23) : コンパイルされたクラスの テンプレート のインスタンス化 'art<X>' の参照を確認してください 1> with 1> [ 1> X=int 1> ]
345 :
デフォルトの名無しさん :2011/06/12(日) 19:55:17.60
エラー箇所はそこじゃなく return 0; じゃね?
参照なのに0を返すのはおかしい
347 :
デフォルトの名無しさん :2011/06/12(日) 20:13:45.33
return 0;を消して、正常動作を確認しました エラーメッセージの雰囲気で早とちりして、行をちゃんと数えなかったのが原因と思われます ありがとうございました
>return 0;を消して、正常動作を確認しました おまw
350 :
348 :2011/06/12(日) 20:43:53.61
>>349 ですよね…
サンプルとか説明で積んだ知識だと「exit(1);」で逃げられそうなんですけど、
returnで上手く収める方法ってありますか?
assertで止めろ
例外握りつぶさずに、ちゃんと上に投げろよ
throw std::out_of_range
domain_error out_of_range invalid_argument range_error length_error 使い分けがいまいちわからない
std::vectorはoperator[]で例外なんて投げないけどな
atは投げるけど二つ作るのがいいんかね
用途によるけど自分で使うだけなら、 atなんてどうせめんどくさがって使わないと思うがな
358 :
348 :2011/06/12(日) 21:07:54.39
全く分からないので、もっと勉強してきます… 初めてのプログラミングにc++を選んだドM野郎なので 地道にやれば…いつか必ず…!
C++なんて優しい方だろ perlとかコードに目を通すだけでも目痛くなるぞ
そういうコードばっか選んで見てるからだろ
>>359 言語仕様が難しいことととコードリーダビリティが悪いことを一緒にしてどうするよ。
>>348 つーか、行番号が表示されるエディタを使えよ。
カーソルのある行番号が表示されるだけでいいから。
メモ帳ですら行が分かるというのに
VC++ってなんでデフォで行番号表示されてないんだろうな
表示されてなくてもあんまり困らないからじゃないの
C++0xの本ってないのかね?
>>366 まだ規格も固まってないのに版起こしたら後からの修正が面倒だろ
今はPDFで印刷屋に持って行けばいいので楽にはなったけどな
そのくせ、エラーには行番号表示するんだよな。
>>367 いやそういう問題ではない
規格改訂がある度に出版社は不良在庫と返品の山を抱えるリスクがある
そのため規格がはっきり決定するまで危なくて出版出来ないのだ
損するだけだからね
0xの本書くのでお金くださいって乞食とかいたよねぇ
372 :
デフォルトの名無しさん :2011/06/13(月) 20:48:55.33
ヘッダファイルで、OBJが生成されていなかったら生成する分岐をさせることは可能ですか?
コンパイルしたことないの?
typedef int& RefInt; int i; RefInt& ri = i; riは参照の参照になってコンパイルエラーになると思ったのですがなりませんでした。 なぜでしょうか?
>>375 コンパイラは何よ
&&になって右辺値参照になってるんじゃないか?
ある公開されているソースコードをVisual stidioでなんとか見よう見まねで改変してビルドしたはいいんだが、 exeファイルとobjやマニフェストがまとまらずに単一のexeにならないんだが・・・
>>375 C++0xだと通るみたいだな
下のプログラムで、rの型がint &になるのと同じ感じなのかな?
template <typename T>
void hoge(int x)
{
T &r = x;
}
int main()
{
hoge<int &>(23);
}
C++0xではtypedef、テンプレート引数、decltypeで参照型が現れたとき その型への参照はただの参照つまり元の型のままになる
template< T& > F; F< int& > f; たまらんちん
おはようございます お世話になります。 struct A{ double x; double f(); } struct B:A{ } double A::f(){ return x; } このような構造体の継承を行い、main関数内で A* a; a->f(); とするとエラー番号C2662が出てきてコンパイルができません 少し調べてみるとconst関数がどうのこうの出てきましたがconstなど使っていないので なぜconst関数の話題になるのか謎です エラーの原理と解消方法を解説いただけないでしょうか よろしくお願いいたします。
382 :
381 :2011/06/14(火) 07:16:59.11
>>381 です。大失態をしていたようです。
とりあえず
>>381 は無視してください
スレ汚し大変失礼いたしました
383 :
381 :2011/06/14(火) 07:42:07.62
たびたび申し訳ありません
やはり
>>381 でもエラーが出るようです(一時他の場所でエラーが出ていたものと思いました)
とりあえず関数f()の後ろにconstをつければ回避できることは分かりましたが、未だに原理が理解できません。
どなたかお手すきの方で解説、あるいは解説があるサイトなどご紹介していただけるとありがたいです。
Bの存在理由が分からないw
お前やさしい上にエスパーなんだなw
申し訳ありません、原因が判明いたしました
まず訂正です
>>381 中、
A* a;
とあるのは
B* b;
でした
で、実は
>>381 のmain関数内で、とありますが、実はさらに関数の中で呼び出しており、
その関数の引数が const B*だった、ということでした
ここのconstをはずせばコンパイルできました。
お付き合いいただいたのにこんなオチで申し訳ありません
質問するときは正確に言え というかconst外せばコンパイル通ったとか、const付けてる意味考えろ
はい、お手数をかけさせて申し訳ありません・・・
迷惑ついでにお付き合いください
以下、サンプルコードを貼り付けました
http://ideone.com/peJ2E struct Vの中でoperator+を定義し、
さらに関数fの引数がconst V* aであり、
fのなかで(*a)+という形を使っております。
すると上と似たようにconst の有るなしでコンパイルが通りません。
f内部でconstなしV型変数に置き換えるか、Vの外でconst V& + const V&のようなoperator+を定義すると
回避できますが、
struct Vの中でさらにoperator+をオーバーロードし回避するような方法はありますか?
意味は理解しているつもりです。 文法的な部分での理解が足りないかもしれません。 (いまだ関数の後ろにconstと書かれると?と思ってしまいます) ありがとうございました。 勉強・精進致してまいります。
>>392 メンバ関数後のconstはオブジェクト内部を変更しないという表明
これをしてないとconstなオブジェクトからはメンバ関数を呼び出せない
内部を変更してしまう可能性があるから
>>393 なるほど
すると関数の後にconstがくる場合はclass(struct)内での関数のみということでしょうか
理解できてきた気がします
理解できてね〜w
>>394 理解できてないよ・・・ class内のみのメンバ関数はprivateだろ
オブジェクト指向そのものの理解が足りてなさそうだから基礎から勉強しな
ここでいろいろ尋ねる前に自分で学ぶべきことがあったようです。 痛感いたしました。。。 失礼いたします。ここまでご指摘ありがとうございました。
式の中のインクリメントは最適化にもよって何時実行されるか保障されてないって本当ですか?
>>400 それは違う
演算子の評価順序に従う
しかし副作用完了点までのいつインクリメントされるかまでは保証されていない
例外は関数の呼び出し
カンマ演算子ではないので評価順序が規定されていない
結果は保証されるけど、タイミングまでは保証されないだろ。
ありがとうございます。 じゃあ副作用完了点というやつのまでにインクリメントしたやつを2回使わなければ良いということですか? 副作用完了点とは何時ですか?
>>403 たとえば
a[i] = i++;
このような式の場合副作用完了点はセミコロンの直前にある
つまりセミコロンの直前まで実行が終了して始めてiがインクリメント
されている事が保証されているだけで、iがいつどのタイミングで
インクリメントされるかまでは規定されていない
したがってa[i]に入るのは何か、はたまたa[i]のiはインクリメントされる
前のiなのかインクリメントされた後のiなのか、全然予測出来ない
このような場合C89以降のCでは単項演算子が付いた評価されるべき
iのような同一のオブジェクトが2回以上現れた時の動作は未定義としている
つまり鼻から悪魔だ
406 :
デフォルトの名無しさん :2011/06/14(火) 19:54:15.33
くだらん
406 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん NGワードにいれたからすっきり
408 :
デフォルトの名無しさん :2011/06/14(火) 21:50:04.58
407=403
◆QZaw55cn4cって糞だよなぁ
>>407 >NGワードにいれたからすっきり
そいつはよかった。実にくだらんがな。
410 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
412 :
デフォルトの名無しさん :2011/06/15(水) 00:53:55.72
C/C++言語のファイルコピーのソースコードで linuxとwindowsで動きタイムスタンプもコピーできるものはありますか。
つboost
>>411 みたいな
「おれはお前をNGにした証拠」的なレスって
惨めだよね
415 :
デフォルトの名無しさん :2011/06/15(水) 10:10:16.31
「おれはお前をNGにした証拠」
C++の質問には、難癖つける癖に 安易な突っ込み所にはすぐレスるのなwww
>>414 サイヤ人の仲間が殺されたのが悔しいんじゃねえんだろ
フリーザにいいようにされちまったのが悔しくてしょうがねえんだよな
ここまでC++の自演
とりあえず、「惨めだよね」とか書き込んだり 「悔しそう」とか書きこむのは 平 日 の 昼 間 はやめたほうがいいよ…ほんと、マジで。
その無駄スペースもやめたほうがいいよ、マジで
携帯持ってないおっさんが
>>421 書いてると思うと…
「平日の昼間」という文字列に反応するニートども
昼休みが存在する事もしらないニート
昼休みに2chやってるニート
427 :
デフォルトの名無しさん :2011/06/16(木) 13:13:53.56
C++ 6.0 のADOを使用した処理で質問があります。 現在SQL SERVERに接続し、データを取得しています。 この時 _variant_t varValue; varValue = rs->Fields->GetItem(_variant_t("TargetDate"))->Value; このようにデータを取得してきているのですが DB側がIntegerの値を返すとvarValue はVT_I4となりvarValue.intValで値が取得できるのですが、 DateTime型の場合varValue はVT_BSTRになります。 この時、何かの型の変数に格納する場合、どのような型が適切でどのようにキャストしてやればいいのでしょうか? ウォッチしたときに varValueは"2011-01-01" BSTR と表示されます。この値を取得して使用したいのです。 よろしくお願いします。
>>428 誘導ありがとうございます。
そちらできいてみます。
この場合Lをつけてもつけなくてもどっちでもいけるけども どっちでもいいもの? wchar_t a=L'a'; wchar_t a='a';
単に型変換が起こるだけだが、 統一するためにLはつけるべきでは
int a; new( &a ) int; これは変数aに対して何か動作をしてるんですか?
一般的にはplacement newだけどな。 intのしかも自動変数で何をしたいかは自分には想像出来ないが。
動作を知るためのコードで、する理由は無いです
ggrks
なんもしとらんね。 初期化値のない場合、POD型はデフォルト値、 つまりなにもしない。
new( &a ) int; は何もしないけど new( &a ) int(); だと0になるんだよな
placement new関係ねえ
あのー c++ってコンパイラー必要じゃないっすか んで、プログラミングしてはコンパイルを繰り返してたら ふと、思ったんすけどォー c++でアプリ作っても他のPCで動作させる時に そのPCにもc++のコンパイラーって必要じゃないですか? アァアアアアン? そこんとこどうなんだよコラ
>>442 何のためにコンパイルしてると思ってんだ禿
>>442 >c++でアプリ作っても他のPCで動作させる時に
>そのPCにもc++のコンパイラーって必要じゃないですか?
いいえ
プラットホームの話だとおもわれ
実行ファイルの存在を知らない低能だと思った
作ってる側は煮たり焼いたり揚げたりしてるけれど食う側は関係ないってこった
喰うのに道具が要る場合もあるが。
素人に向かって低脳とは酷い奴だな
素人以前に礼儀もなってないので低能でおk
テンプレート関数で構造体をテンプレートに置き換えたら外部参照エラーがでた どういうことなの?
454 :
デフォルトの名無しさん :2011/06/20(月) 21:40:03.86
>>442 おめーさ、デバッグビルドした exe を「他のPC」に持って行ってない?
//構造体定義ファイル struct.h typedef st{ ... } //関数宣言ヘッダファイル func.h template<typename T> void fucntion(T* inout); //関数定義 func.cpp #include "func.h" template<typename T> void fucntion(T* inout) { ... } //main関数ファイル #include "struct.h" #include "func.h" void main(){ st* inout; function<st>(inout);//LNK error return; } //どういうことなの?
func.cppコンパイルしたのか?
こうじゃね? //関数定義 func.cpp #include "struct.h" #include "func.h" template<typename T> void fucntion(T* inout) { ... } template<> void function<st>(st* inout) { ... }
げっ includeしたらマジで通った でもテンプレートする前はfunc.cppインクルードしなくても通ったんだよ?
func.hにfucntionの定義を書かないとダメ
>>457 後出しで申し訳ないがstは数種類あって特殊化はしたくないのぜ
>>459 それってどういうココロなの?
宣言さえしておけば勝手に探してくれるんだと・・・
テンプレートはcppに定義分けて書いたりできないよ
>>462 ふーん
じゃあ全部ヘッダにまとめるか
サンクス
実体化してないからだろ
コンテナのqueueって何のためにあるんだ?全部dequeでよくね?
>>455 非常に長々と書くと
func.h,func.cpp どちらにも function<st>が存在しないので function<st>は作られない
main に function<st> が出てきたので、このときに作ろうとする(実体化しようとする)けれど
この main がインクルードしている func.h には関数の宣言しか書かれていないので実体化できない
リンカは func.obj にも main.obj にも function<st> が存在しないのでリンカがエラーを吐く
という感じではないかと思う...
>>465 listやdeque等のコンテナを選べる。
さらに言えば、push_back等のいくつかのメンバ関数を満たしていれば自作コンテナも使える。
>>465 dequeだと反対側に突っ込んじゃうかもしれないだろ
queueってdequeと比べてなんかえらく不便だった気がする
queueってただのコンテナアダプタだろ bidirectional_iteratorなら何でも上に被せられるってだけのもの
じゃあ、c++で作ったプログラムをコンパイラ無しに 動作させるにはどうすればいいんですか?
一体どこからじゃあに繋がるんだ
製作者と環境を一致させる
>>470 std::queue はコンテナ要件満たしていないはず
begin() や end() も定義されていない
まず何とC++を比べているのだろうか・・・
予言しよう・・・ 近いうちに、俺は結婚を申し込まれるだろう・・
どうして学校でC++やらせんだろうね しかも基本Vijuaru Stajioで Vijyuar Stugioのゴミさは、この程度も設定できないようなksは 技術さわんなってっていういかれた頭の持ち主の示す意思表示に見えなくもなくもない いかれてやがる そしてC++しか知らないままC++をやり続ける奴がきっと多い すげーレベルで時間の無駄 これはソフトウェア面で完全に世界から送れちまってる日本のみの現状か・・・ 日本効率も悪いんだな・・・・・・ つうか学校のカリキュラムが変わりすぎじゃないのか? 10年前はC、C++ 5年前はJAVA 今はRubyなんだろ? 同じ学校でも、その学校に在籍していた時代によって教わってる内容が違いすぎるw 右往左往しすぎだわ ゴミみたいな分野だしな・・・ さっさと何らかの形で統一されないと
rubyタグ使うサイトは許せない
>>481 主張は結構
だがこのスレで扱う話題ではないな
HaskellスレのPerl忍者と同一人物?
>Vijyuar Stugio ってなんですか?
なんでおばかさんすぐ釣られてしまうん?
意図的なスペリングミスをやっている奴はそんなに多くない。 逆に考えれば……まぁ、言うまでもないな。
488 :
デフォルトの名無しさん :2011/06/22(水) 21:07:18.96
敗因を言語のせいにしてんじゃねえよ そーゆー根性こそ問題の核心だ
489 :
デフォルトの名無しさん :2011/06/22(水) 21:21:36.80
てs
3項演算の優先順位にはいつも悩まされる・・・ someBool?a:b + c; って someBool?a:(b+c); なんだな、心では (someBool?a:b)+c; なんだが・・・ 皆もう慣れてるん?
>>490 個人的に3項演算子はそれだけで1行使うようにしてるから、あんまり悩んだ事ない。
x = someBool?a:b;
x += c;
括弧使うのってカンマ演算子くらいかも。
x = someBool?a:(some,b);
馴れなきゃかっこつけろ。
3項演算子って簡単な奴だったらif文わないで済むからコードの短縮になるので ついつい連発しちゃうんだよな〜 カッコ付けるようにすればいいんだろうけど、忘れた頃に同じようにやっちまうからなぁ まあここに書き込んだことが心に残って防止になればそれでいいや
>>492 んで、かっこ悪いっていわれるわけですね。
要らないとこまで括弧つけまくる病気にかかったことがある p=&(obj); みたいに 関数みたいで読みやすくなるかと思ったがいまいちだったな
クラスにテンプレートな型のメンバ変数を持たせる事は可能でしょうか?
template<type T> class c { T type; }; ということなら可能
>>498 ありがとうございます。
では、それを使って具体的にクラスをコンストラクトするにはどうしたらいいのでしょうか?
>>499 498の例なら
c::c(T t) : type(t) {}
するだけじゃ?
template <class T> class Hoge { T t; public: Hoge(){} template <class U>Hoge(U const & u): t(u){} template <class U1, class U2>Hoge(U1 const & u1, U2 const & u2): t(u1, u2){} /* 以下飽きるまで繰り返す */ }; これでほとんど行けるよ
>>500 >>501 なんかつかめて来た気がします!ありがとうございます
最近CからC++始めたんですけど、C++ぱねぇっすね、やりたい放題というか、すごく充実してるというか
ぱねぇ
クラスの設計の仕方がわかりませんorz コンパイラを作っているのですが、1つのクラスに50個くらい関数があります。 字句解析、構文解析、意味解析、コード生成などなど・・・ それぞれクラスにした方がいいのかもしれませんが、分けたところで何を得するのかわかりません。 結局インスタンス化も1つしかしないし、意味あるんでしょうか? いっそのことクラスを取っ払ってC言語として書いたほうがいいのでしょうか? オブジェクト指向って難しい。
その状態でコンパイラを作ろうってのが凄いな。
>>505 C++がわからないとコンパイラ書いちゃいけないんですか?
boost::spiritあたり使えばいいんじゃないかな
クラスにしておけば C++構文解析、C構文解析 ARMコード生成、x86コード生成 みたいに分けられて 後からObjective-C構文解析だとかx64コード生成とか 簡単に追加できる
別にクラスじゃなくても簡単に追加できるけどな
どうしても納得いかないところが。 複数の翻訳単位でインクルードされているヘッダファイルがあって、const char* はextern をつけているから問題ない。 しかし、extern をつけていないenumは多重定義エラーが出ないのはなぜでしょうか?
コンストラクタとして、例えば、メンバ変数aに1を代入するのと、変数bに1を代入するのがあったとして、 その二つのコンストラクタを使って、同時にaとbを初期化するコンストラクタとか作れますかね? つまりコンストラクタの中でコンストラクタを呼び出す的な
virtualじゃなきゃメンバ関数読んでいいんだからそういうメンバ関数作れば? でも普通初期化は初期化子でやるよ
>>513 委譲コンストラクタはC++0xから
現行だと一時オブジェクトが生まれるだけになる
C++とDxLibで、配列を使ってウィンドウの管理をしようとしています。下記のコードでウィンドウA(赤い四角)を表示しようとしたのですが、親クラスのウィンドウ(白い四角)が表示されてしまいます。 ウィンドウAを表示するための解決方法はありますでしょうか?(ウィンドウは他にも、ウィンドウBやウィンドウCなどに継承していく予定です) 改行対策のため読みづらいとは思いますが、よろしくおねがいします。 class Window{ //全てのウィンドウの親クラス Window(){} void draw_window(){ DrawRect(0,0,100,100,GetColor(255,255,255),true); //白い四角形を表示する関数 }}; class WindowA : public Window{ //ウィンドウAクラス WindowA(){} void draw_window(){ DrawString(0,0,100,100,GetColor(255,0,0),true); //赤い四角形を表示する関数 }}; class Windows{ //ウィンドウ管理クラス std::vector<Window> windows; Windows(){} void add_window(Window window){ windows.push_back(window); } void draw_windows(){ //全てのウィンドウをdraw_window()する int num = windows.size(); for(int i=0;i<num;i++){ windows[i].draw_window(); }}}; //プログラムのメイン部分 Windows windows = Windows(); WindowA window_a() = WindowA(); windows.add_window(window_a); windows.draw_windows();
継承で多態するならvirtual付けなはれ class Window { virtual draw_window() {...}
void add_window(Window window) これじゃ毎回コピーされるがいいのか?
windows.add_window(window_a); スライシングが起きるよね
>std::vector<Window> windows; std::vector<Window*> 手を抜きたいなら std::vector<std::shared_ptr<Window>> boost::ptr_vector<Window>
>>std::vector<Window> windows; std::vector<Window *> windows; >>void add_window(Window window) void add_window(Window& window) >>windows.push_back(window); windows.push_back(&window); >>windows[i].draw_window(); windows[i]->draw_window(); で無事動きました。ありがとうございました! かなり大きな前進になると思います。
std::vector<Window>はあくまでWindowクラスを入れるためのベクタなので 派生であるWindowAクラスをそのまま入れることはできないのです 基底クラスとその派生クラスを管理したい場合は、ポインタなら基底クラスから 派生クラスまで指し示せるのでポインタで管理するのがセオリー std::vector<Window*> ただそうするとオブジェクトの解放処理(delete)が面倒なのでスマートポインタ shared_ptr<Window>を使うと管理が楽になりましゅ vector< shared_ptr<Window> >
boost::ptr_vectorでもいいよ
std::vector<std::unique_ptr<Window> >でもいいのよ
うちのコンパイラはまだstd::unique_ptr対応してないから vector<autoptr<Window> >使うお
皆さんありがとうございます。
>>523 ,
>>525 に書いてあるようにスマートポインタでやってみたのですが、
'void std::vector<_Ty>::push_back(_Ty &&)' : 1 番目の引数を 'Window' から 'std::unique_ptr<_Ty> &&' に変換できません。
となってコンパイル出来ませんでした。
>>524 のboost::ptr_vectorでコンパイル・実行しても、終了時に
Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
というダイアログが出るので、このまま使ってもいいものかどうか…。
スマートポインタは素人が使っても大丈夫なモノなんでしょうか
>>528 のboostを使ったときのエラーは、どうやら別の原因のようです。
設定をいじったせいかは分かりませんが、お騒がせしました。
エラー吐かないように直して、改めてboostを試してみます。
530 :
デフォルトの名無しさん :2011/06/24(金) 16:05:54.62
ううむ、エラーが出ないようにしてからboost::ptr_vectorを試したのですが、 また同じエラーが発生してしまいました。 まだdeleteの必要性も理解出来ていないので、 勉強も兼ねてstd::vector<Window*>を使ってみますね。 こんな話題でスレ汚ししちゃって申し訳ないです(;´Д`)
まあ、いいってことよ。 わからない事があったらいつでも俺に聞け。 俺も知らんけど。
無いとは思うんだがテンプレートでの指定が<Window>だからってWindow型を突っ込もうとはしてないよねぇ
hito.csv 1,山田,28,165,60,100,20,30, 2,鈴木,40,178,80,100,20,30, 3,佐藤,31,170,70,100,20,30, カンマ区切りされたファイルをifstreamでファイルを選択して getlineでカンマ区切りで摘出までは理解してます 全データを選ばず、特定の行だけを抜き出すにはどうすればいいでしょうか?
>>533 行のバイト数が固定ならfseekで飛べるけどそうじゃないだろうから
読み捨ててくしか無い
何行目なのかを知る方法が改行文字を認識するしか無いからな
カンマ区切りで抽出できるのに 特定の行だけ抜き出すのは無理なの?
536 :
533 :2011/06/24(金) 17:11:26.16
>>535 先頭から順番に全部抜き出して配列にぶち込む
↓
その配列から特定の行分抜き出す
なら可能だけど、この方法では毎回全データを読み取ってから
その中から1つ取り出すという手法になってしまって・・・
>>532 え?じゃあ何型を突っ込めば…?というレベルなので、
多分それが原因だと思います…。
前に使ってた言語がPHPなので、型に厳しい言語に戸惑ってます。
もうちょっとC++に慣れてから挑戦してみますね。
>>537 3人程度ならそれで良さそうだけど数千人で、しかも要素が10や20になると数万だからな
iostream::ignore
#include <iostream> #include <fstream> #include <string> bool satisfies_some_condition(const std::string &line) { return line.find("山田") != std::string::npos; } int main() { std::ifstream ifs("hito.csv"); std::string line; while (std::getline(ifs, line)) { if (satisfies_some_condition(line)) { std::cout << line << std::endl; } } }
>>543 クラス内でtypedef出来るんだ!とか、->と.の違いを今知ったりとか、ふがいないばかりでございますorz
大変参考になるソースをありがとうございました。
SIMD命令を使ってデータ並列処理を高速化したいです。 ターゲットCPU : Intel Core2シリーズ以上 テーゲットOS : WindowsXP 言語 : C++ コンパイラ : VC++2005付属 インラインアセンブラではなく、できればイントリンシックで記述して使いたいです。 イントリンシック記述を勉強できる本やWebサイト(IntelのPDF以外)で オススメがあれば教えてください。
英語おk?
547 :
545 :2011/06/25(土) 09:30:39.26
できれば日本語がよいですが、 オブジェクト指向設計の学習では、洋書の訳書がとても勉強になったので、 あちらの書籍、Webに質の良い情報があるだろうことは理解できます。 解読する努力はしますので、是非、ご教示ください。
VSでプリコンパイル済みヘッダー無しでやってるんだけど、それでヘッダー作ってるんだけど、 hoge.hで宣言 hoge.cppで定義で、 main.cとかで#include"hoge.h"してるんだけど、 それでビルドしたら、定義されてないって文句言われる どうしたらいいですか?
hoge.cppにインクルードしてない void hoge::○○(){}みたいにしてない
mainがc
C++でPerlのハッシュと同じものを作りたいのですが やり方どこかにないっすか
554 :
デフォルトの名無しさん :2011/06/25(土) 22:12:37.20
拡張子がcのファイルをC++強制にするオプションを知らんようだな
>>555 ソースどっかに上げて聞いた方が早いと思うぞ。
558 :
デフォルトの名無しさん :2011/06/26(日) 00:27:00.41
このコードを書き換えるとどうなりますか。 int n; char *p,*q; do *p++ = *q++; while (--n > 0);
どう書き換えたいのですか
>>558 int n;
char *p,*q;
do {
*p = *q;
p++;
q++;
n--;
} while (n > 0);
VSでやってます hoge.hで、クラスの定義をして、hoge.cppでクラスのメンバ関数の定義をしてます。 つぎに、そこで作ったクラスを、メンバとして含むようなクラスや、そのクラスのサブクラスを別のファイル(ヘッダーとリソースファイルに)作りたいと思います その場合、#include等はどうしたらいいですか? 色々やってるんだけど、クラスが再定義されてるって言われたり、定義がされてないって言われたりして困ってます
ちなみにさっきは、#include "stdafx.h" だけをインクルード(ヘッダーとリソース両方に全部)したんですけど、 今度は定義がないって言われました
ちょっとstdafx.hとstdafx.cppのコードを乗せてみろ 一部でいいから
>>561 インクルードガードはちゃんとやってる?
/*stdafx.h*/ #pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h> // TODO: プログラムに必要な追加ヘッダーをここで参照してください。 #include"ising.h" #include"metropolis.h" #include"rand.h" #include<math.h> #include <vector> /*stdafx.cpp*/ // stdafx.cpp : 標準インクルード kadai4_mf.pch のみを // 含むソース ファイルは、プリコンパイル済みヘッダーになります。 // stdafx.obj にはプリコンパイル済み型情報が含まれます。 #include "stdafx.h" // TODO: このファイルではなく、STDAFX.H で必要な // 追加ヘッダーを参照してください。 //こっちは特に弄ってません、そのままです
#include <iostream> using namespace std; int myabs(int n); long myabs(long n); double myabs(double n); int main(){ cout <<"-10の絶対値:"<<myabs(-10)<<"\n"; cout <<"-10Lの絶対値:"<<myabs(-10L)<<"\n"; cout <<"-10.01の絶対値:"<<myabs(-10.01)<<"\n"; char a='u'; while(a!='o') cin>>a; return 0; } int myabs(int n) { cout <<"整数用のmyabs()\n"; return n<0?-n:n; } long myabs(long n) { cout <<"長整数用のmyabs()\n"; return n<0?-n:n; } double myabs(double n) { cout <<"浮動小数点用のmyabs()\n"; return n<0?-n:n; } 実行結果 整数用のmyabs() -10の絶対値:10 長整数用のmyabs() -10Lの絶対値:10 浮動小数点用のmyabs() -10.01の絶対値:10.01
>>564 やっぱりインクルードガードしないと駄目ですかね・・・
VSで自動的にビルドでうまくやってくれたりはしないのかな・・・
それで今やりたいことは stdafx.hをインクルードしたhoge.hかhoge.cppでmyabs(10);とかmyabs(10.01);とか使いたい ということでいいのか?
>>568 いえ、566は自分ではないです
rand.hで宣言、定義されたクラスを内部に含むクラスをmetropolis.hを宣言、定義して、
ising.hでそのクラスを継承したいんです。
メンバ関数は、同名のcppで定義してます。
というか、クラスの宣言だけ、ヘッダーでやるってのは可能でしょうか
class metropolis;
みたいな感じで
>>566 は単レスです
>>565 とは無関係です
混乱させてすいません
>>566 の質問を忘れてました
>>566 の質問はcoutの使い方についてです
coutの出力順が意図していないものでしたのでそこんとこ教えてください
>>570 どういう出力順を意図していたのか説明してみ
>>569 ああ、別だったの
クラスを内部に含むクラスっていうのがよくわからんな
class metropolis
{
class rand hoge;
}
みたいなことがしたいのか
>>566 たとえば、f(g(x))という関数を考えた時に、
これを計算するときどうする?
まずg(x)を計算して、それをfに代入するでしょう?
だから、
>cout <<"-10の絶対値:"<<myabs(-10)<<"\n";
では、最初にmyabsが評価(計算)され、
cout <<"整数用のmyabs()\n"
が実行され、”整数用のmyabs()”が出力される
その意図なら、関数にstringを返させるようにするべき
>>574 それなら定義されてないってことは無い気はするけれど・・・
rand.h metropolis.h ising.hを見てみないとわからんな
576 :
デフォルトの名無しさん :2011/06/26(日) 02:07:53.53
>>571 参考書のコードなんですが
こんなところを予想してました
実行結果
整数用のmyabs()
10-10の絶対値:
長整数用のmyabs()
10-10Lの絶対値:
浮動小数点用のmyabs()
10.01-10.01の絶対値:
/*rand.h*/ //#include<isostream> #include "stdafx.h" /*ex*/ unsigned int mod_mul(int a,int x); /*ex*/ int one(int x); /*ex*/ double to_p(unsigned int x); /*ex*/ double to_gau(double a1,double a2); class RRAND { int a; unsigned int x; unsigned int size; void step(); public: RRAND(void); RRAND(unsigned int n); double rand(void); unsigned int rand(unsigned n); bool rand(double p); unsigned int dist(); double gauss(); void ini(); void ini(int s); };
/*metropolis.h*/ //#include"rand.h" #include "stdafx.h" //template <class state,class sstate> class state { friend class sstate; protected: // friend class metropolis; double h; RRAND& r; public: double t; virtual double comp_h(); virtual state& operator=(const sstate& ss); RRAND& get_r(){return r;} }; //template <class state,class sstate> class sstate { protected: // friend class metropolis; RRAND& r; state& s; double h; public: virtual double comp_h(); };
template <class state,class sstate> class metropolis { protected: state s; sstate ss; //double h; RRAND r; virtual void chose_ss(); virtual double p_s(); virtual double p_ss(); virtual double pt_s(); virtual double pt_ss(); metropolis(state& c1,sstate& c2) : s(c1),ss(c2){}; void step(); void step(int n); public: }; /*ising.h*/ #include "stdafx.h" typedef signed char s_c; using namespace std class i_state : public state { private: friend class i_sstate; friend class magtropolis; int x,y;
vector<vector<signed char>> magnet; public: i_state(int x,int y); s_c n(int,int); s_c e(int,int); s_c w(int,int); s_c s(int,int); s_c h_point(int sx,int sy); double comp_h(); i_state& operator=(const i_sstate& ss); }; class i_sstate : public sstate { private: friend class magtropolis; friend class i_state; int x,y; double comp_h(); }; class magtropolis : public metropolis<i_state,i_sstate> { void chose_ss(); double p_s(); double p_ss(); double pt_s(); double pt_ss(); }; int Fb(int size,int x,int y); double boltz(double h,double t);
ising.h metropolis.h rand.h の先頭に #pragma onceを追加 rand.hは何もincludeしなくて良い metropolis.hは"rand.h"だけをinclude ising.hは"metropolis.h"と<vector>をinclude
何故標準ライブラリに単方向リストが無いのですか? 戻る気が無い時にこれではオーバースペックでしょう?
stdafx.hに詰め込んでこれだけインクルードすればわかりやすくて楽じゃねって言う発想かもしれないが 多重定義とか相互インクルードを引き起こすからやめたほうがいい
C++0xでforward_listが入るから待ってろ
今回定義されてないって出てたのは // TODO: プログラムに必要な追加ヘッダーをここで参照してください。 #include"ising.h" #include"metropolis.h" #include"rand.h" この並び順のせいだな rand>metropolis>isingの順に流れていくのに読み込みが逆になっている これだと最初にising.hが呼び出され、他の定義を読めるはずがない
>>576 関数を呼ばずにその結果を利用することは不可能だから、
関数内で出力する限り無理。
>>576 どうでもいけどコロンの使い方がおかしい
FILE *fp; fp = fopen("a.txt" "w"); fprintf(fp, "aaaa"); としたとき、fprintf関数で書き込んだ内容はクリアできますか? おそらく、 fclose(fp); fp = fopen("a.txt" "w"); とすればうまくいくのでしょうが、ファイルを閉じずに行う方法が知りたいです。
自己解決しましたすみませんでした
>>582 一応それもためしてみたんですけど、stdafx.hの作用がどうもよく分からなくて・・・
includeしてなかったら文句言われるし、してたら多重定義になっちゃうし・・・
>>584 そもそもVSがどんなふうにコンパイルしてるか良く分からないんですよね
makeファイルとかで、自分で全部管理した方が楽なのかな・・・
>>586 とりあえずそれでやってみたらできました
えっと、内部クラスの質問なんですけど、内部クラスってのは、外部クラスがコンストラクトされた時、自動的に生成されるものなのですか?
もしそうなら、特定のコンストラクタ(引数を取る)でもって、内部クラスを生成するにはどうしたらいいですか?
自動で生成されるわけないだろ お前はstruct { };って書いたら勝手にインスタンスできると思ってるのか?
stdafx.hを使わなきゃいいじゃん
俺もはじめてVC使ったとき、色々戸惑ったが、 stdafx.hにはイラついて、使わなかった覚えがある。
>>593 でも、例えば、
class Int{
int n;
};
で、
Int i;
とすると、自動的に整数用の領域が確保されるじゃないですか
同様に
class In{
int n;
};
class Out{
In in;
};
として
Out out;
とすると、自動的にクラスIn型の変数inも生成されるんじゃないんですか?
>>594 VSの使い方が分かんなくて、使わないとエラー吐かれて対処できないんです
>VSの使い方が分かんなくて、使わないとエラー吐かれて対処できないんです そのエラーみつけて対処するくらいのことができなきゃ、 靴も履けずにマラソンに出かけるような展開になるぞ。
>>596 そりゃぁ生成されるけど、質問の意図が判らん。
>>597 まあせっかくVS入れたので、ちゃんと勉強する予定ではあります
>>598 つまり、生成されるということは、Out型クラスをインスタンス化した時に、
何らかのInのコンストラクタが呼び出されているという事じゃないですか。
で、この時呼び出されるInのコンストラクタに引数を持たせたいんです
>>599 質問は「データメンバをデフォルトコンストラクタ以外で初期化する方法は?」でいいのかな?
こいつは初期化子のことを聞いてるのか?
どうも、そのようだ。
コンストラクタの初期化リストだろ。
初期化子じゃなくて、呼び出されるコンストラクタを指定したいのです、 というのは、内部クラスが参照変数のメンバを持ってるので
そんなの好きなコンストラクタ呼べばいいだろが なにいってんだこいつ
C++コードでok
{ } の初期子と勘違いしてるのか?
class Hoge { std::pari<int, char> &x; // Hoge(): x(12, 'a') {} // Error! }; ということだろうか。
class c { int& n; c() { } }; いやこうだろう
つまり、
>>596 だと、
class In{
int n;
public:
In(int m):n(m){}
};
class Out{
In in;
public:
Out(int m){
In n(m);
}
};
とすれば、Outでこのコンストラクタを使った時に、
自動的に内部にmの値を持つ、内部クラスnが生成されるって事ですか?
そもそも参照変数なのにそれのコンストラクタって時点でなに言ってんだか 突っ込む前に呼んであるだろ そのとき好きなの呼べよ
>>611 いや普通にコンパイルエラーじゃないかなw
いいからクラスについて勉強しなおせ そんな理解で難しいことやろうとするからはまるんだ
参照ってのは、つまり
class In{
int& n;//参照
public:
In(int m):n(m){}
};
class Out{
In in;
int n;
public:
Out(int m){
n = m;
In in(n);
}
};
こういう事です
>>612 ・・・つまり?
>>613 どうしたらいいと思いますか?
>>605 呼び出されるコンストラクタを指定するのにコンストラクタ初期化リスト中の初期化子を使うんだよ。
釣りだろこいつ
俺としたことが頭悪い釣りに引っかかってしまったぜハッハッハ
えっと、じゃあ In(int m):n(m){} で、n(m)ってのは、代入してるだけかと思ってたんですけど、 やってる事はコピーコンストラクタの呼び出しで、この部分で好きなコンストラクタを呼び出せたりしちゃうんでしょうか? もしそうだった場合 Out(int m):in(n(m)){} というような、入れ子には出来るでしょうか?
>>616 >>617 >>618 ごめんなさい初期化リストというのがどういうものか知りませんでした・・・
:の横って、ただ代入してるだけかと思ってました・・・
知らないキーワードが出てきた時点でググれよカス
>>619 できるわけねーだろカス
あと参照に関数のローカル変数突っ込んでるぞ
とりあえずもう一度ヘッダーファイルとインクルードとクラスについて学びなおしたほうがいいと思う これを解決できたとしても今のままじゃまたどこかで詰むようになる
なんでこの流れにヘッダファイルやらインクルードやらが関係あるの?
ちゃんと基礎を勉強してから来いよ
コンパイル時に梃子摺ったり、 エラーを理解できないようなクラス間関係は(・A・)イクナイ 使いやすいクラスを作るためには、癒着させないことが大事。
>>628 は?
エラーを理解できるかどうかはコンパイラの実装にも依存しちゃうんだから、
それが設計の良し悪しの判断基準になるわけないと思うんだけど・・・。
たとえばどんなクラス間関係のこと言ってるの?
class A { int a; ・・・ } a ってpublicじゃないよなprivateだよな? いつもアクセス修飾子書いてしまってるからわすれてしまった
privateであってる
632 :
デフォルトの名無しさん :2011/06/27(月) 15:19:29.28
633 :
デフォルトの名無しさん :2011/06/28(火) 00:37:37.55
template<int> struct Example { template<int> Example() { } }; これってどうやってコンストラクタ呼ぶの?
それだったら最初からコンパイルエラーにしろやって思うがコンパイル速度の問題なんかね。
自動変数を学び直せ
set呼んでないから
自動変数ですか 調べてみます
おそらく、インスタンスという概念を理解してない。 class Foo {public: int value = 0; void set(int v) {value = v;}} Foo a, b, c; // value = 0, 0, 0 a.set(1192); // 1192, 0, 0 c.set(296); // 1192, 0, 296
>>637 蛇足かもだが、
1.hの書きかただと、2つ以上のcppからインクルードするとリンクエラー出るぞ
void Choge_2::display()をcppに移すか、
void display(){}と宣言と定義を同時にするのがよろし
丸めの良い実装で参考になりそうなのないですか? 四捨五入と偶数丸めで、0.5足してfloorするだけだと微妙で・・・
今VC++で通信を行うプログラムを作っていて、テストとして2つ起動して送受信を行おうとしたのですが Runtime Error プログラム名.exe abnormal program termination が発生するのです。それも リリースした受信用プログラム+VC++・リリースモードで送信プログラム→受信側がエラー リリースした送信用プログラム+VC++・リリースモードで受信プログラム→送信側がエラー リリースした受信用プログラム+リリースした送信用プログラム→両方エラー ・・・と何が原因でエラーが起きているのかまるで分らないのです。 エラーメッセージにも情報らしきものは書かれてなく何をすればいいのか・・・ このようなエラーに何か心当たりはありませんか?
abortじゃないの? VC++ならpdbにシンボル書き出して コールスタック眺めりゃ一発
>>645 うーんなんか難しそうですね
勉強してみてまだわからなかったらまた来ることにします
ありがとうございます
>>643 微妙と言われても・・・それで何が不満なの?
VC++2010のOpenMPの最適化について質問です
ttp://ideone.com/sauMa 上記のコードをVC++ 2010、MinGW(gcc 4.5.2)それぞれで実行速度を測ってみました、
VC++は Relaseモード、
MinGWは -O2オプション付加、
共にOpenMPを有効化した状態です。
この時にOpenMPを使ったコードを有効化すると、
VC++の通常(直列)ループの実行速度が遅くなり、
MinGWは変化ありませんでした。
さらには、ループをインクリメントからデクリメントのループ(for (mytype i = max; i >= Min; i--))に修正して、
OpenMPを使ったコードを有効化すると、
VC++の通常(直列)ループの実行速度がさらに速くなり、
MinGWの通常(直列)ループの実行速度が遅くなる、
という、環境によってバラバラになってしまいました、
これはOpenMPの最適化がコンパイラの実装依存というのが関係しているからでしょうか、
だとしたらOpenMPを使うと環境毎のコードの修正が大変になることになってしまいます。
>>643 目的はなんだろう?
学習?
そこんとこを質問したほうが早い解決じゃないだろうか
protectedメンバーってさ、兄弟関係(親子じゃない)にあるpublicじゃない情報取り出せるよね。 あんまりそういやりかたすんのは良くないんだろうか。それともその手の手法が確立されてたりすんだろうか? class Interface { int value; protected: static int Peek(Interface &target){return target.value;} }; struct Example:struct Interface { void Parse(Interface &target) { Peek(target); //targetのvalue値が手に入る } };
あほすぎるw 1) ExampleはPeekを呼び出せる 2) Peekは内部のint valueの値を返す これだけのこと。
そうだよ。それだけのこと。 Interfaceを継承したクラス群は、packageスコープのように値を共有できる。 問題は何に使えるかだ。
状態遷移があったら使うんじゃん?
654 :
デフォルトの名無しさん :2011/06/30(木) 02:42:58.33
ヘッダでは不要なヘッダをインクルードするなって話がありますけど、 結局の所、shared_ptrなどは公開しないとダメなんですよね? vectorなどのコンテナなら前方宣言で公開せずに済みますけど。
C++は組み込み意外の用途で言うと主にどんなときに使われるんでしょうか? ゲームプログラミングには良く使われることは知っているんですがGUIとか小遣い帳とか言った一般的なアプリケーションを作る分にはC#とかの方が良いんでしょうか? モチベーションを上げて取り組みたいので出来たらご紹介ください
>>655 C#のがいいよ
圧倒的に楽に組めるからモチベーションが段違いだよ
javaがいいよ、java
>>654 ん?
class Hoge;
shared_ptr<Hoge> fuga;
みたいな話?
>>654 vector も前方宣言はできないでしょ。
テンプレート引数については逆に、 shard_ptr には渡していいけど vector には渡しちゃダメ。
661 :
デフォルトの名無しさん :2011/06/30(木) 12:22:38.04
>>655 パズルを解くとかシミュレーションするとか色々あるけど。
char* a[] = {"a","b","c"}; とあったとき、aの長さ3を得る方法はありますか? sizeof()を使ってもうまくいかなくて困ってます
sizeof(a)/sizeof(a[0])は?
>>664 sizeof(a)という書き方をすると、
error C2070: 'char *[]': sizeof オペランドが正しくありません。
と出てしまいます。むずかしいです。
>>665 なるわけねーから動かなかったコード出してみろ
多分前後の文法がおかしいだけだ
>>663 #define LENGTH_OF(a) (sizeof(hoge((a))))
template <class T, unsigned N> char (& hoge(T const (&)[N]))[N];
int main(void) {
char const * a[] = { "a", "b", "c" };
std::cout << LENGTH_OF(a) << std::endl; // -> 3
return 0;
}
よく見てみたら配列aを外部宣言してました。すみません。 aの長さを求めたい関数からは、 extern char *a[]; しか見えないため、このようなエラーが出てしまったようです。
(#^ω^)ビキビキ
670 :
デフォルトの名無しさん :2011/06/30(木) 17:52:08.50
w
>>663 std::arrayやboost::arrayを使う手段もあるぞ、参考までに
この場合の話なんですけどね。 namespace std { template < class T > class allocator; template < class T, class Allocator > class vector; }; class Hoge { private: std::vector* m_pArray; }; メンバ変数にvector保持する時、ポインタにして前方宣言すれば#include <vector>をヘッダに書かなくて住みますよね。 つまり公開せずに済む。 ところがshared_ptr系って、shared_ptrへのポインタを保持したら本末店頭なので、 結局、スマートポインタってのは公開しなくちゃならないんですよね?
そんなことするとエラー出ると思う
std::vector* m_pArray; これは冗長な書き方な気がするけどなぁ
std::vector* m_pArray; こんなこと無理じゃね?
>>672 必ずしも公開しないとだめということはないよ
やろうと思えばすべてのクラスで定義を隠蔽できる
メリットよりデメリットのほうが多いからやる価値は無いけどね
>>672 何を言ってるのか良く分からないから
他人にも通じる言語(日本語でもいいよ)で
どんな事がしたいのか説明してみたら?
自前のと外部ライブラリの operator new がバッティングした場合のうまい対処法ってありますか? 今はライブラリインクルード前に自前のをundefして後にまたdefineし直しで対処してるんですが・・・
つ名前空間
ごめん、うそついた
namespace foo { namespace {} } 名前空間の中に無名名前空間を作っても大丈夫ですか? VC2008だとなぜかIntelliSenseが効かなくなることがあります。
>>672 > メンバ変数にvector保持する時、ポインタにして前方宣言すれば#include <vector>をヘッダに書かなくて住みますよね。
ダメ。ユーザープログラムが namespace std に宣言を行った場合、未定義動作になる。
17.4.3.1 [lib.reserved.names] p1 (C++2003)
"It is undefined for a C++ program to add declarations or definitions to namespace
std or namespaces within namespace std unless otherwise specified."
17.6.4.2.1 [namespace.std] p1 (N3290)
"The behavior of a C++ program is undefined if it adds declarations or definitions to
namespace std or to a namespace within namespace std unless otherwise specified."
>>679 #undef で対処してるってことは、そのライブラリも自前のコードも両方 #define new ... してるの?
ひどい状況だね。
ライブラリのそれが迷惑だと身をもってわかったんだから、自分でもそんなことするのやめれば?
そもそも #define new ... で何がしたいの?
みなさんありがとうございました。
可読性や速度が低下するし、namespace stdだと未定義動作になるようですし(
>>683 )止めときます。
結局、ユーザに公開するクラスのヘッダだけが隠蔽されてれば問題ない話なんですね。
あー難しい。
標準だろうがなんだろうが問題なく隠蔽できるよ そんなの常識的な知識でしょ
//hpp class V ; class hoge { V * pV ; hoge(void) ; } ; //cpp #include <vector> class V : public std::vector<fuga> { } ; hoge::hoge(void) : pV( new V ) { }
>>683 > "The behavior of a C++ program is undefined if it adds declarations or definitions to
↑ハアァアアァァアァアァアアァアァァァァァァアアァアアァァアアァァァァァァァアァ??????????
ゴミって意味わかってんのかなこいつら
>>672 そこまですんならpimplにすりゃいいんじゃね?
スタックに割り当てなきゃならんのなら別だろうけど。
>>682 言語上は構わんだろ。そもそも、そうできないと
クラススコープに縛りたい変数やらクラスといったシンボルは
全て広域名前空間で宣言するかちまちまstatic書かなきゃならなくなる。
unsigned short hoge[4]; hoge[0] = 0x0123; hoge[1] = 0x4567; hoge[2] = 0x89AB; hoge[3] = 0xCDEF; リトルエンディアンの環境では [MSB] 23 01 67 45 AB 89 FE CD [LSB] になるけど、ビッグエンディアンの環境では [MSB] 01 23 45 67 89 AB CD EF [LSB] になる?
short intが2バイトの環境ならそうなるね
なるほど。ありがとう
shared_ptr intrusive_ptrの使い分けの仕方を、説明してホスイ
>>694 いやそんな使い分けに困るようなもんでもないと思うんだが
intrusive_ptrの使い方は分かってるんだよね?
>>694 shared_ptrは楽で既存のクラスにも簡単に適用できて多機能でプログラマのミスでリークすることは殆ど無い。けど生ポとの共存が面倒でその手の応用が効きにくく、さらに無駄が多い
intrusive_ptrはめんどくさいし既存のクラスには適用できないしプログラマのミスでリークするかもしれない。けど生ポと簡単に共存ができるし、無駄が少ない。
すいません。new/delete でご意見をきかせてください。
コードはこちらです。
http://www.amazon.co.jp/dp/4797327030/ の最初の Iterator パターンを C++ で書き直したものです。
http://codepad.org/hrU82H5x ここでは、new/delete 忘れを検出するべく、new/delete をオーバーロードして malloc()/free() に振りなおしています。
さらに、malloc()/free() に対しては、xmalloc()/xfree() なるラッパを間に通しており、最終的に malloc()/free() 忘れや二重解放を拾い上げられるようにしています。
ラッパの実装は双方向リストを使用しています。
#宿題スレでよく使用しておりお見かけの方がおられるかもしれません。
ここで次のような事態が発生しました。解放忘れや二重解放はなんとか排除できたのですが、
※「クラスのスタティックなメンバ関数としての new で確保した領域が、グローバル関数として定義した delete で解放されている」
処理系によってはそういうことがある、と考えていいのでしょうか?それとも書きように問題が残っているのでしょうか。
---
上のソースでは、
278行目 Iterator<Book> *itr = bookShelf->iterator(); //(a)
233行目 Iterator<T> *iterator(); //(b);
269行目 return new ConcreteIterator<T>(this); //(c)
の道筋で最終的に確保された動的領域を、
283行目 delete itr; //(d)
で解放したのですが、実行結果を見る限り、これは、
136行目の void operator delete(void *p) {
にきているようです。
こちらの環境/処理系は gcc 4.3.4 / cygwin on Windows XP です。
ご意見をお聞かせいただければ幸いです。よろしくお願いいたします。
>>695 >>696 thxです
winsockを使ってみる。(1)
http://www.kmonos.net/alang/boost/smartptr.html winsock を侵入型参照カウンタとintrusive_ptrを使って、実装しているサンプルが
掲載してあるのですが、winsok のインスタンスをつくるのに、インターフェース
クラスを作成し、間接的にnew して、winsok のインスタンスを作っています、
コンストラクタでintrusive_ptr を使ってメモリ管理をしています、
面倒そうに視えるのでshared_ptr では、ダメなのだろうかと思って質問しました。
テストプログラムを作ったんですがうまく動きません 助けて #include<iostream> using namespace std; class cord{ public: int x,y; cord operator+(cord o); cord(int i=0,int x=0){x=i,y=x;} }; cord cord::operator+(cord o) { cord tem; tem.x=x+o.x; tem.y=y+o.y; o.x=0; return tem; } int main(){ cord w(1,1),r(9,1),o; o=w+r; cout<<o.x<<','<<o.y<<"ここまでテキスト\n"; cout<<r.x; char p; while(p=getchar()!='o'); return 0; } コンパイルは通るんですが計算の実行結果が意味不明なので原因を教えてください <<実行結果>> -1717986920,10ここまでテキスト -858993460
int x,y; cord(int i=0,int x=0){x=i,y=x;} };
cord(int i=0,int x=0) { x=i, y=x; } }; ここでcord.xとcord.yに値を入れているのだろうが引数のxと文字が被っているからcord.xに入っていない
なんでiと来て次がxなのか意味不明すぎて笑ってしまった
705 :
704 :2011/07/02(土) 16:58:39.80
operator+にconstつけてなかった
#include<iostream> class Coord { public: Coord(int x = 0,int y = 0) : x(x), y(y) { // this->x = x; // this->y = y; } Coord Coord::operator +(Coord & rhs) const { Coord t(this->x + rhs.x, this->y + rhs.y); rhs.x = 0; // ? return t; } int x, y; }; int main() { Coord w(1, 1), r(9, 1), o; o = w + r; std::cout << o.x << ',' << o.y << "ここまでテキスト\n"; std::cout << r.x; while (getchar() != 'o') {} return 0; }
もっとちゃんとやるなら Coord Coord::operator +(const Coord & rhs) const { か
> cord(int i=0,int x=0){x=i,y=x;} }; 1. 引数 x に引数 i を代入する 2. メンバ変数 y に 引数 x を代入する 3. この地点でメンバ変数 x は初期化されていない
あいまいさが生じたのか コンパイラはエラーださないんですね ありがとうございます
C++で関数型言語みたいに書けますか?
boost::function boost::lambda boost::bind等などとか?
712 :
711 :2011/07/02(土) 17:33:05.72
>>699 的確なコメント感謝いたします。
g++-3 で警告※がでる理由がわかりませんでしたが、コンパイラによっては、仮想クラスから派生したクラスのデストラクタが呼ばれないことがあるのですね。
※ warning: `class Array<Book>' has virtual functions but non-virtua destructor
http://codepad.org/YIc9esVA
class Base { public: Base() { printf("Base();\n"); } ~Base() { printf("~Base();\n"); } }; class Derived : public Base { public: Derived() { printf("Derived();\n"); } ~Derived() { printf("~Derived();\n"); } }; int main() { Base * pBase = new Derived; delete pBase; } 出力: Base() Derived() ~Base() で正しい。~Derived() は呼ばれるはずがない Base クラスのデストラクタが Derived クラスでオーバーライドされていないので、pBase が delete される時に呼ばれるのは Base クラスのデストラクタになる オーバーライドするためには Base クラスのデストラクタを仮想化する必要がある
しかしこうしてみると、仮想デストラクタを持たないクラスを継承することがどれだけ危険か分かるな・・・
>>713 お前QZだろ?まあいい、C++スレでは目をつぶっててやる
CodeGuardを掛けたら次のようなエラーが出ている
Error 00001. 0x400000 (Thread 0x0DB8):
Exception 0xC0000005: Access violation at 0x14B4677.
Call Tree:
0x0CD1E0DA(=CG32.DLL:0x01:01D0DA)
0x0CD15098(=CG32.DLL:0x01:014098)
0x0CD1602E(=CG32.DLL:0x01:01502E)
0x0CD2783E(=CG32.DLL:0x01:02683E)
0x0CD011BF(=CG32.DLL:0x01:0001BF)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
0x7C81CB26(=kernel32.dll:0x01:01BB26)
0x32B9C0C8(=CC32110MT.DLL:0x01:09B0C8)
0x32B9911B(=CC32110MT.DLL:0x01:09811B)
0x32B9914C(=CC32110MT.DLL:0x01:09814C)
0x32B98DCE(=CC32110MT.DLL:0x01:097DCE)
0x32B98E4D(=CC32110MT.DLL:0x01:097E4D)
0x004017A9(=iterator1.exe:0x01:0007A9) iterator1.cpp#165
0x00403B4A(=iterator1.exe:0x01:002B4A) iterator1.cpp#190
>>714 は実際の一般的な挙動を説明してるだけだろうけど
>>713 はコンパイラによってはそうなってる見たいとか言ってるから言っとくが
規格では未定義だから, pBase にDerivedクラスを突っ込んでdeleteした時点アウトだからな
絶対にやってはいけないことだからね
別に問題ねーよ ちゃんとメモリも解放されるし 基底クラスのデストラクタにvirtual付けてないともちろんダメだけど
>>718 ?
vitrual付いてない時の話に決まってるだろ
その話をしてるんだが
>>713 のコードではvirtual付いてるから勘違いしたのか?
スマポ使うんでvirtualはいりません
>>719 virtual付いて無いときって書いて無かったから勘違いしてた
ごめん
仮想デストラクタを持たない基底クラスのポインタに派生クラスを代入して、それをdeleteした時の動作って未定義だったのか ふっ、また1つ賢くなってしまったよ
ひとつ人間に近付いたね
>>716 そのとおりです。コードみればそのまんま自明でもあります。
肝心の基底クラスのデストラクタがvirtual でなかったので訂正します。
http://codepad.org/5hxUbKLP でも、そのcodeguard って bcc のやつでしょう?bcc55 はこちらでもコンパイル結果は謎(return 0; のあとで new/delete が呼び出されてます)です。
そのコールトレースをみると、kernel32 のまだ下の dll でエラーが出ているようだし、あんまり信用できないなあ。
>>717 ありがとうございます。理由がわかるにはまだ知識が足りませんがよく覚えておきます。
>>725 俺の使ってる奴はbcc(今はecc)の最新版、ecc6.3.1だよカス
バグだらけのbcc5.5と一緒にすんな
明らかに自分のコードが間違っているのに人のせいにするなんて
やっぱりクズだよお前
>>725 それからそのコードまだこんなエラーが出るぞ
Error 00001. 0x400000 (Thread 0x0E24):
Exception 0xC0000005: Access violation at 0x14B4677.
Call Tree:
0x0CD1E0DA(=CG32.DLL:0x01:01D0DA)
0x0CD15098(=CG32.DLL:0x01:014098)
0x0CD1602E(=CG32.DLL:0x01:01502E)
0x0CD2783E(=CG32.DLL:0x01:02683E)
0x0CD011BF(=CG32.DLL:0x01:0001BF)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
0x7C81CB26(=kernel32.dll:0x01:01BB26)
0x32B9C0C8(=CC32110MT.DLL:0x01:09B0C8)
0x32B9911B(=CC32110MT.DLL:0x01:09811B)
0x32B9914C(=CC32110MT.DLL:0x01:09814C)
0x32B98DCE(=CC32110MT.DLL:0x01:097DCE)
0x32B98E4D(=CC32110MT.DLL:0x01:097E4D)
0x004017A9(=iterator2.exe:0x01:0007A9) iterator2.cpp#138
0x00403BFA(=iterator2.exe:0x01:002BFA) iterator2.cpp#163
直ってないんじゃないか?
>>697 new/delete 忘れを検出するんじゃなくて、 RAII 使って防げば良いのに。
730 :
デフォルトの名無しさん :2011/07/02(土) 21:49:10.80
メモリの解放忘れだったら、STLのstringや自作クラス使えばいいだろ。 あとページコレクションのツールと使うとか。
今だにスマートポインタ使うの渋るのがいる。なんで?
だなあ、未だにPentiumVの850MHzなんて化石ノート使ってるようじゃ コストは馬鹿にならないだろうなあ エアフェノム使ったらどう?w
スマートポインタのコストがボトルネックになってるのかよ。そんな奴はクビにしろ
new/deleteを自分で管理出来ないのが意味分からん。 スマポに頼ろうという発想が出てこない。 オブジェクトの生成期間なんぞ、明白だし、 明白で簡潔であるべきだ。
C++に来ないで一生C言語に篭ってろよ
unique_ptrでおk
>>736 そりゃ何故スマポなのか?を理解出来てないだけだろ。
C++の哲学をわかってないやつが多すぎるな 「いらないコストは払わない」 基本中の基本だろ スマポはこの哲学を完全に無視してんだよ 特にboost::shared_ptrテメーは最悪だ
743 :
デフォルトの名無しさん :2011/07/02(土) 22:03:31.17
ちがうだろ。 CPUに関係が無い。 コスト=計算量は。
スマポは消臭剤に似てる。 悪臭を消すために振り掛ける。 しかし、本当は、それに頼らず、 元の悪臭を断つべきなのだ。
>>742 ほおー
スマポを使わずにどうやってRAIIを実現すると?
GCが標準にないC++にとってスマポは必要悪である事もしらないアホがいるのか とっとと墓穴掘って埋まってくれ
>>747 ほとんどC++を使う理由がないような・・・
あっそうかわかった、こいつはメモリリークやリソースリークに鈍感な奴なのかw
リークさせないなんて出発点でしかないんだが…。
バグが出ない前提で語るアホ
752 :
デフォルトの名無しさん :2011/07/02(土) 22:14:06.17
これ、char *buf = new char [1024]; と bufを string buf(1024,'\0'); と &buf[0] で置き換えたら メモリリークしないが。
stringはSTLに近い 文字列コンテナと言ってもいい という事はお前はコンテナは使う前提で話をしているって事でいいんだな?
>>751 QZはリークさせまくっても平気な奴らしいですから
そこら辺が職業PGとアマグラマの一番の差でしょうね
必要なところで使う。必要ないところでは使わない みんなこんな根本的なところからわかってないんだなぁ
756 :
デフォルトの名無しさん :2011/07/02(土) 22:19:10.24
>>748 むしろ C++ を使う理由につながる
おまえさんの言う「C++ を使う理由」とは?
>>756 開発期間を短くしてしかも出来るだけ初めからバグの発生確率を
低くするためだと思う
そういうと「お前はJavaかC#でも使ってろ」と言われそうだが
横からだが、C++を使う理由はカプセル化と、 STLのささいなクラスライブラリを使いたいからだな。
759 :
725 :2011/07/02(土) 22:22:15.95
>>727 ,728
これは失礼。
> Exception 0xC0000005: Access violation at 0x14B4677.
> Call Tree
> 0x0CD1E0DA(=CG32.DLL:0x01:01D0DA)
> 0x0CD15098(=CG32.DLL:0x01:014098)
> 0x7C9624CA(=ntdll.dll:0x01:0214CA)
> 0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
> 0x7C81CB26(=kernel32.dll:0x01:01BB26)
> 0x32B9C0C8(=CC32110MT.DLL:0x01:09B0C8)
> 0x32B98E4D(=CC32110MT.DLL:0x01:097E4D)
> 0x004017A9(=iterator2.exe:0x01:0007A9) iterator2.cpp#138
> 0x00403BFA(=iterator2.exe:0x01:002BFA) iterator2.cpp#163
これが何を意味するのかちょっとだけ教えていただけませんか?
確かに、#163->#138 ときて、そのあといきなり(
>>725 の#75〜#123の間の、#97, #98, #109, #110 などを飛び越えて)スレッドセーフなランタイム?に入り、kernel32, nttdll まできてさらに下の得体のしれないところで例外が発生しているのでしょうか?
0x14B4677 というのはどこを指しているのでしょうか?
>>725 の #163 といえば、class BOOK { char *name; の解放になりますが、こちらの観測では二重解放もしていないようですし、いったい何が起こっているのでしょうか?
もしかして、#95- #96, #107-#108 の
for (i = 0; i < q->size; i++)
*(char *)((char *)(q->data) + i) = (char)(rand() & 0xff);
が悪いのか?
C++なんてやめてD言語やればみんな幸せになれる
>>759 Call TreeというのはDLLを呼び出した階層順の事
だからkernelで例外が起きているわけではない
0x14B4677というのは初期化されてないポインタにでも
アクセスしてるんじゃないか?
ちなみにCodeGuardはわざとエラーを発見しやすくするために、未初期化データセクションに ランダムな値を書き込む 多分0x14B4677というのはCodeGuardが書き込んだ値だろう
まあなんかスマートで新しい低レベル言語作ったほうがいいってのはあるよな C++0xなんてどこの悪質建築業者のやっつけ増改築だよって思う 過去の資産がどうのこうの言うけどそんなもんあっという間に追いつくよ
765 :
デフォルトの名無しさん :2011/07/02(土) 22:30:14.53
>>757 えっ?? C++ を使ったらバグの発生確率が下がるのか?
# どんな分野なんだろう
>>758 煽りうめえw
お前何のためにEffective C++やExceptional C++のような本が出てると 思ってるんだ? Pimplイディオムの存在理由は分かるか?
このバカがそんな本読んでるわけ無いだろ
>>763 CPUで言うとx86をARMで置き換えようっていうのに似てるな
ARMはスマートフォンなどに確実に浸透してきているし、サーバー機にも使われ始めた
Intelは焦っているに違いない
ヘッダを実装の変更から切り離すためだろ?>pimpl
しかし立場が危うくなると慌ててコテを外す当たり本当に小物だと思うわ
この流れでpimplとか何も理解してないとしか思えないな
772 :
デフォルトの名無しさん :2011/07/02(土) 22:37:37.37
>>768 AndroidはオープンアーキテクチャだしCPUを選ばないからさらに強敵だな
これがPC層まで浸透してくると怖いものがある
事実MSもARMやAndroidにシフトしてきてるし
もう Google Go しかないな
>>773 それでも開発言語はC/C++なんだよなあ
>>777 すごく大変だと思わないか?スマポなしでやると
俺は絶対にミスしないからスマポは必要無い!キリッ
開発時間や開発効率は無視するわけですね さすがプロは言う事が違うな
実行時のコスト >>>> バグのリスク/プログラマの時間・作業的負担 な環境か、C++上級者だらけの羨ましい職場かのどっちかなんでしょ? 天国と地獄だなw
ミスをするからスマポに頼る、ってのが悲しい間違い。
どうでもいいけどみんなカルシウム足り無すぎやで 次の質問をどうぞ
pimplってどう発音するんですか? RAIIとかも テクニックの略語はどう読んでいいのか・・・
1バイトの増加も許されない組み込み環境にC++を使うのは間違いやぞ 基本的にC++は富豪プログラミング思想だからな アセンブラでも使ってろくそったれ
スマポの存在意義を完全に無視してるな。どういう現場なんだよ。
>>785 俺はEmbedded C++を使わされる事になった時発狂しそうになったぞ
でもそれでおまんま食わせてもらってるから文句言えない
文句言えよ 言わないと永遠に生きてるコード生成プログラム扱いだぞ
790 :
デフォルトの名無しさん :2011/07/02(土) 23:23:23.67
boostはいらねえ。 メモリリークを無くしたいならば、PHP、Javascriptを使えばいい。 ほとんどC/C++と同じ事はできるだろ。
使えばいいで使わせてくれるような現場なのか。
設計が下手くそだからリークなんて起こすんだろうな マトモな設計してれば論理的なリークなんてすぐになくせる あとはコーディング段階でのうっかりぐらいしかリークする余地はないけど これもデバッグ段階でリークしてる箇所がズラッと一覧で出るから普通は見逃しようがない
793 :
デフォルトの名無しさん :2011/07/02(土) 23:30:02.80
PHPをC++に翻訳するツールがあるが。 翻訳部分にバグが無かったからメモリーリークもしないだろう。 あと、PHPコードをC/C++から呼び出す事もできるが。
794 :
デフォルトの名無しさん :2011/07/02(土) 23:46:06.61
なにやらLLVMが活性化してる感じがするけど、 そもそもJavaのバイトコード吐き出せるC++コンパイラーって作れないのか? わざわざ別のVM作るより速いだろうに。
スレチ
796 :
725 :2011/07/03(日) 00:00:50.06
>>729 キーワードの提供ありがとうございます。
ただ、
>>697 の URL のとおり、Java の書籍を通してやっとデザパタを理解しようとしているレベルに過ぎないところお察しくだされば。
スマートポインタの概念を理解するのも、今の段階では夢のまた夢‥‥‥。
それにしてもなんだか盛況ですね。
デザパタの原典はC++だからそっち読んだら?
>>796 みんなわざわざ空気悪くするようなカキコしなくてもいいのにな
自分も気分悪いし、相手も気分悪い、第三者も気分悪い、
百害あって一理なしだな
スマポは考え方自体はすごくシンプルよ、
より良く実装するのが難しいだけで
何で加速してるんだと思ったら宗教戦争かよwwwww 状況によって使い分ければいいだろwwwww ただし、たけのこの里が好きな奴は味覚障害でどうしようもない
きのことか舌切り取った方がいいよ
>>796 スマポを知りたければ、Modern C++ Designや
C++テンプレートメタプログラミングを読んでみれば良い。
802 :
725 :2011/07/03(日) 02:42:21.60
>>761 ,
>>762 コールツリーというからには、やっぱりスタックに積まれている戻り先(およびスタック上のローカル変数を取り除くため ebp 値)をチェックしているような気がします。
CG32.dll というのは、CodeGuard の dll で、バージョン6 ともなると、カーネルの下に潜っているのかも。
>> 0x0CD1E0DA(=CG32.DLL:0x01:01D0DA)
>> 0x0CD15098(=CG32.DLL:0x01:014098)
BCC5 くらいの手元の codeguard では、でたらめポインタのアクセスは捕らえられず、new/delete しかチェックしてくれないみたい。
また、global な new を補足してしまうと、こちらの手元の codeguard 的にはまずいようです。@
あと、
p = new char [ n ];
したものは、
delete [] p;
としないといけませんでしたね。この点は怒られてしまった。A
@Aについてだけ対応したものを残しておきます。
http://codepad.org/gMI6MnFz codepad 上でも無事コンパイルがとおり実行結果まで得られるようになってめでたしめでたし。
>>802 それが当たり前だろ
何がめでたしめでたしだ
しかし嘘もほどほどにしとけよ
フリー版のbcc5.5にはCodeGuardは付属していなかった
俺はC++Builderをバージョン4の時から買い続けているから良くこの事を知っている
どこまで信用の置けない奴なんだQZは
詐欺師か
スマートポインタのコストとか言ってるやつは具体的に何のこと言ってるの? std::auto_ptr や boost::scoped_ptr や std::unique_ptr<T, default_delete(?)> なら 空間コストも実行時間コストも生ポインタと同じだよね?
>>803 bcc5.6(C++Builder6)の製品版が手元にあります。delphi もろとも買ってはみたものの、もともと win16api で止まってしまった人なのでほとんど使わずかつ使えなかったのですが。
>それが当たり前だろ
まあそうなんですが、まだまだ C++ はよくわからないし、警告やエラーがあっても、それより別の内容をお聞きしたくて参上した次第。初学者によくあることとして容赦してくださいな。
>>805 あれ?さっきはbcc5.5と言っていましたよね?
いつからbcc5.6にすげ替わったのですか?
もう、いいですよ
あんたの言ってる事は信用が出来ない
ある一つの嘘を付いてしまうと、その嘘を隠すためにまた一つ別の嘘を付かなくてはならなくなる しかし、分かる人には分かるんですよ、ちゃあんとね 見え透いたハッタリから足を洗ったらどうですか?
>>806 当初はフリーの bcc55 を使用していましたが、いよいよ codeguard の結果を見なくては、と考え、どこぞに放置していた Borland C++Builder 6.0 Professional (Build 10.157)(1983-2002) (bcc32 は 5.6) をインストールした、という経緯ですが何か矛盾していますでしょうか?
>>728 > 0x32B98E4D(=CC32110MT.DLL:0x01:097E4D)
> 0x004017A9(=iterator2.exe:0x01:0007A9) iterator2.cpp#138
>>728 提供のデータが正しければ、これは
>>725 (
http://codepad.org/5hxUbKLP ) #138 から xfree() に入ったあと、暗黙に直接ライブラリをコールしていることを示しています。
グローバルな new をオーバーロードすること自体が悪いのか、delete [] name; と書かずに delete name と書いてしまったのが悪いのか、というところでしょうか。
>>808 じゃお前のCodeGuardの出力を貼ってみろよ
ちなみにC++Builder6はUpdate4まで出ているんだが、正規ユーザーなら もちろんダウンロード出来るはずだよな? そしてそれを当てた時のBCCのバージョンを書いてみろ?
正直どうでもいい。
>>811 普通に考えれば?妙な言い方をしますなあ
割れ厨だからダウンロードできないと素直に言えばいいのに
言う事がどんどん変わって行ってますね
5.6.4のnew/deleteには確かに問題があった
しかし今は問題がない
その頃のバグを取り上げて論じても意味がない
>>815 それは証拠にならない
アップデータを人からもらったかもしれないだろ?
ライセンスキーを晒せとは言えないが、正規のライセンスキーを持っている証拠が
示せなければ身の潔白を証明する事は無理だ
うざいから他所でやれ。
喧嘩しないでC++の話すっべ 最近のCPUがL2/L3キャッシュをどんどん大きくしているのは 大きいコードが増えて来てキャッシュミスが増えないように考慮してるんだろうね それと肝心のコア部分がどんどんシュリンクされて小さくなっていくので余ったスペースを 有効活用するという意味もあるだろう C++0xにもついにthreadが入ったし、マルチコアが言語でサポートされるのはいいな Goはスレッドを初めからサポートしてるしC#もPLINQでサポートしてるけど ありゃCPUの話になってしもたすまん
そう言うひとりごとはトイレの個室で存分につぶやいてください。ここはそういう場所じゃないんで
>>820 いやだからね、C全盛の時代は良かったけど、C++みたいにコードが肥大化すると
ハードウェアもそれに合わせて変えて行かなければならないなあって話
独り言ではなく現実に起きてる事だから
ああC++0x…早く使いたいな もう少しコンスタントに規格拡張してほしいな 次の規格が10年後とか長すぎないか
>>823 人の書いてる事にいちいちケチつけんな
嫌だったらこのスレ開くなカス
C++は機能が少なすぎる
>>827 ここで書かずにEmbarcaderoのQCに報告しろカス
それからRAD Studio XEはアクチベーションを導入しているので、
割れ厨は使えないわけですなヒッヒッヒ
>>827 > ※
http://codepad.org/pVU3fnX4 declaration of 'void* operator new(size_t)' throws different exceptions
> (これはどういう意味でしょうか?)
メッセージどおりなんだけど・・・
"defferent" ってのは、置き換え元の ::operator new(size_t) に対してってこと。
template<typename T> struct HOGE{ T val; template<typename S> operator S(){ __if_exists(T::operator S){ return val.operator S(); } __if_not_exists(T::operator S){ return S(val); } } }; Tがoperator Sを持っていて、SがS(T)コンストラクタを持っている場合、 通常、TをSにキャストするとS(T)コンストラクタが呼ばれてしまうと思うのですが、 これを上記のように定義してoperator Sを持っている場合は、 それを優先的に呼ぶようにしたいのですが、 __if_exists(T::operator S)がerror C2760となってしまいます。 変換演算子は__if_existsでは使えないのでしょうか。
>>819 >最近のCPUがL2/L3キャッシュをどんどん大きくしているのは
ということは inline は不利?
>C++0xにもついにthreadが入ったし、
posix-thread をいろいろ試していますが、自己流でかけば、すっぽ抜けが発生しそうで、しかもそのすっぽ抜けは再現性が低く発見が困難でたちが悪い。教科書に載っている書き方以外はしないようにしています。
そこらへん(つまりパターン化されている部分を自然に書けるように)、C++0x には反映されているのでしょうか?
つまりしろーとが安全にスレッドを扱えるようになっているのでしょうか?
setとmapってメモリー管理どうなってんの? 例えばeraseしてもvectorみたいにメモリー解放されなかったりすんの? あと、枝ごとにメモリー確保すんの?それっとも木全体でメモリー確保すンの? (企画にはないだろうから多数派の実装を教えて)
実装によるとしか
>>833 実装依存だがSTLの要件から普通は二分木でじっそうされているらしい
VCは赤黒木だった
>>833 少なくともgccとVCでは、
- eraseでメモリ解放する
- メモリ確保はノードごとに確保
となってる
んで メモリ確保 とか メモリ解放 とか書いたけどこれらはアロケータに確保解放を要求するだけで、実際にメモリ確保解放するかはアロケータ次第
なるほどみんなありがと。 てか移動しないのは規格なのかな。 JISのPDFでも見れば載ってんだろうけど。
便乗ですまみせぬ。 erase()って管理してるオブジェクトを開放するだけで、 コンテナが確保したメモリ自体は開放されないんでしたっけ? swap()使え云々って記憶してるのですが。
template <char * pN> class Property { ... }; テンプレート引数に Property<"hoge"> みたいに文字列へのポインタを渡したいんだけど、いい方法ある? どうしてもコンパイル時定数関係のエラーが出てしまうんだが・・・ 用は文字列(リテラル)をテンプレート引数に渡したいんだけど、やっぱり無理かな class Foo { private: Property<"hoge"> hoge; // エラー };
>>842 無理。boost::mpl::stringをお勧めする。
>>842 extern char const * const p = "hello" ;
template <char const * const & p> class T { } ;
int main(void)
{
T<p> o ; return 0 ;
}
>>843 なるほど。とりあえずmplに手を出してみるか
手持ちの1.45だとboost/mpl/string.hppが存在しないから、バージョンアップが必要っぽいな
>>845 おー、コンパイル通ったし
しかしここまで複雑になるならmpl使った方が良さそうかな・・・
何にせよちょっと試してみるよ。ありがとう
・・・で、mplを使ってみたんだけど、wstringには対応していないっぽい? こんなテンプレートの実体毎にwstringを保持できるようにしてみたんだが、評価してくれると嬉しいな template <typename S> class PrenamedNode { public: PrenamedNode() {} const std::wstring & GetName() const { return statics.name; } private: class Statics { public: Statics() { const char * pInput = boost::mpl::c_str<S>::value; const size_t inputLength = strlen(pInput); const size_t outputLength = mbstowcs(NULL, pInput, INT_MAX); if (-1 == outputLength) { assert(false); abort(); } this->name.resize(outputLength); mbstowcs(&this->name[0], pInput, outputLength); } std::wstring name; } static const statics; };
int main() { PrenamedNode<boost::mpl::string< 'The ', 'quic', 'k br', 'own ', 'fox ', 'jump', 's ov', 'er t' >> hoge; PrenamedNode<boost::mpl::string< '―ソ', 'Ы\', '噂浬', '欺圭', '構蚕', '十申', '曾箪', '貼能' >> piyo; wprintf(hoge.GetName().c_str()); wprintf(L"\n"); wprintf(piyo.GetName().c_str()); wprintf(L"\n"); return 0; }; codepadを使うべきだったと思うが、何も問題はない
例外を投げるときクラスを作ってクラスに文字列を入れて投げるじゃないですか? そんなことしなくても文字列を投げれば良いと思うのですが 文字列をクラスにいれて重くする利点を教えてください。
>>850 try内で文字列判定の処理でも入れる気か?w
>>850 エラーの分類を型に対応させて伝えられる。
try { } catch(T1 foo) { } catch(T2 foo) { } catch(T3 foo) { } try { } catch(string foo) { if(foo.compare("hoge") == 0) { } else if(foo.compare("huge") == 0) { } else if(foo.compare("huga")== 0) { } } 見るからにアホだろ 意味もなく重くする必要はないが例外処理に速さなんか求める奴がいたら設計から見なおせ
まさかだが、例外が「エラーが起こった時に文字列を投げて表示するため」だけに存在すると思ってないか?
文字列や整数でエラーコード伝えればハンドラを関数化できていいと思う typedef std::string my_error; try { ... } catch(my_error & e) { handle_my_error(e); } catch(...) { ... } handle_my_error(my_error & e) { if(e == "hoge") { ... } else if(e == "fuga") { ... } }
856 :
855 :2011/07/07(木) 14:51:28.93
と思ったけどよく考えるとそんな事しなくても関数化できるのね そうなると値より型で調べるほうがいいのかな
class my_error { virtual void process_error() { ... } }; class Hoge : public MyError {}; class Piyo : public MyError {}; class Fuga : public MyError {}; ... catch (MyError & e) { e.process_error(); }
>>856 throwとcatchの間で文字列や整数の中身のフォーマットをあれこれすりあわせるより
catchはとりあえず抽象型だけ知っとけばおkみたいなほうが気が楽
void handle(void) { try { throw ; } catch(ex1 & e) { std::cout << e.what() << std::endl ; } catch(ex2 & e) { std::cout << e.what() << std::endl ; } catch(...) { throw ; } }; int main(void) { try { throw ex1() ; } catch(...) { handle() ; } try { throw ex2() ; } catch(...) { handle() ; } } これがベスト
例外処理をエラー処理以外に使うと凄く悪いことをしている気分になる でもこの便利さ・・・抜け出せない
例えば?
大域脱出
くだらないね
goto使った方がマシだ… 大域脱出を目的として例外処理使うとかgotoという文字面見たくないだけの 超筋悪でしょ… 意図と機能の目的が違っちゃってるよ
gotoで関数の外に飛べるの?
飛べるよ!
gotoなら空も飛べるはず
>>865 まじめに回答するとできない。多分 setjump/longjump をつかうんじゃないかな?わたしはつかったことないからわからない。
>>860 一応言うけど、C++のtry-catch構文はコンパイラ(具体的にはgcc)によっちゃ
mallocとかsetjumpとか呼びだすからな。しかも(スレッドとは別の)コンテキスト情報まで保存する。
例外処理以外の用途で使うなとは言わんけど、その辺は忘れないようにしたほうがいい。
870 :
デフォルトの名無しさん :2011/07/10(日) 01:52:40.43
staticメンバー変数の用途って具体的に何? MessageRecord record; MessageSource source( istream ); //メッセージテーブル作成 record.load( &source ); // static変数にメッセージテーブル登録 Message message( MesssageRecord(), "message1" ); //メッセージ取り出し"xxxx%d xxxx%s"をmessageが持つ。 message << value << file; //メッセージに値登録 message.flush();. //メッセージ出力 こういう使い方と、メモリープールを作る用途しか思いつかん。 基本的に使ったことがない。
モノステートとか
ある程度コンパイラとの仕様を維持してこういうコードを安全にする事はできないだろうか。 class VirtualClass { static void *virtual_table[16]; void **vtable; public: VirtualClass():vtable(virtual_table){} }; void *XPortMethod(void *arg,...) { ネットワーク先のオブジェクトへ転送処理 } void *VirtualClass::virtual_table[16] = { XPortMethod, XPortMethod, XPortMethod }; VirtualClass instance; LocalClass *stab = reinterpret_cast<LocalClass*>(&instance);
こういうコードを書かなければいい
昔はいろいろC++に不満があったのだが 今ではもう何が不満だったのか思い出せない
>>874 どうしたんだ?もう燃え尽きてしまったのか?
足るを知ってからがc++の始まり
以下の関数fと、 void f(const A &obj){ ... } 副作用完了点まで生きているclass Aの一時オブジェクトを組み合わせた f(A()); で、f内において const_cast<A&>(obj) をしてobjの内容を変更しても問題ありませんか?
>>877 参照先の内容を変更するなら const A& ではなくて
A& と宣言したほうがいいと思う
const A& だと普通、参照先は変更されないと思うので
void f( A& obj ) { obj = ...; }
>>878 そんな話じゃないだろ
一時オブジェクトのA&を提案とかアホか
ちなみに
>>877 の質問の答えは分からん
>>877 f()が束縛しているのがA()の一時オブジェクトだからこの場合は問題がないが、
問題は他の所にある
いやちょっと待て、一時オブジェクトでも、値を変えない事を前提に書かれている
のだから、objの内容を変更したら一時オブジェクトが解体される時、つまりAの
デストラクタが走る時に問題が出るかも知れない
しかしAがconstとは限らなく、Aが非constの時も正しく解体されるようにデスト
ラクタは書かれているはずだからたまたま問題はないか・・・
f()が受け取るのは一時オブジェクトとは限らないというのが最大の問題で、const
を受け取るから安心だと思って呼び出したらなんと中身が書き換えられていた、
という事が起きかねず、バグの温床になるのでこういう書き方は勧められない
基本的にconst_castは必要ないはずで、これを必要とする時はロジックに誤り
があるのが普通で、全体をよく見直す事をおすすめする
一時オブジェクトが A& で束縛できないのが問題なら 適当に名前を付けたらいいんじゃないの f( A& obj ) { ... }; A a; f(a);
A&&をつかえよ
グッバイC++98 C++0xはやくきてくれ
ラムダの記法みるだけで吐き気がするんだけど。C++0x来るって事はそれも来るんだろ。
吐き気がするなら使わなくていいのよ。
嫌なものを自分から見るバカなんでしょう
記法はこんなもんかーで流すのが胃にやさしい
文字列の配列の領域を確保するようにヘッダファイルに書きたいのですが、 LPTSTR p[] = TCHAR[200][100]; f:\ctest\test.h(19) : error C2275: 'TCHAR' : この型は演算子として使用できません c:\program files\microsoft visual studio 9.0\vc\include\tchar.h(203) : 'TCHAR' の宣言を確認してください。 とエラーが出ます。どう書くべきでしょうか?
なんだそのふざけた文法 ポインタとnewにすればいいんじゃねーかな
ヘッダで宣言するだけなら TCHAR p[200][100]; C++の前にC言語をだな
>>888 c/cppに
TCHAR p[200][100];
hに
#pragma once
extern TCHAR p[200][100];
hの方の200はいるのか?
893 :
888 :2011/07/11(月) 16:59:16.52
TCHAR p[200][100]; で書きます。ありがとうございます。
>>892 VCで200省略したらエラーになった。
>>895 なるわけないだろう・・・・・
念のため確かめたが動くし
>>877 constで定義した変数をconst_castして変更するのは未定義
非constをconst&にキャストしたのをまた非constにキャストするのは合法
>>897 なんで質問の趣旨が理解出来ない奴がこんなに多いんだwwwww
具体例まであるのにw
>>898 2行目まで読んだ?ちゃんと答えてるんだけど
まあ朝鮮人に日本語2行はちょっと難しかったかな
結局、上の例は const A obj; const_cast<A&>(obj) ではなく const A& r = A(); const_cast<A&>(r) と同じ事で 非constの一時オブジェクトをconst参照で受けて それを元の非constにcastしてるだけだから大丈夫 ということかな。
・virtualコンストラクタってどんな使い方があるんでしょうか。 ・C#のインターフェイスのようなクラスを作る場合、純粋仮想デストラクタは 出来ないようなので実装を持たせることになりますが〜.hと〜.cppのどちら に書くべきでしょうか。
静的メンバ関数をthisポインタ経由で呼び出してもいいんですか?
>>903 thisポインタ経由ってどういう意味?
this->func(); ということです
そうです
>>905 static なんだから
func();
でいいんじゃないか?
そんなことは質問してません
909 :
907 :2011/07/12(火) 22:25:47.49
そいつは時間取らせて悪かったな
class Hoge { void Print() { PrintCore(); // ぱっと見どこで定義されている関数か分からない this->PrintCore(); // インスタンス関数の呼び出しに見える Hoge::PrintCore(); // クラス名を間違える可能性 } static void PrintCore(); }; 俺の場合はHogeクラス内で typedef Hoge this_class を宣言して、this_class::PrintCore() と呼び出している。
フーンデッティウ
>> ぱっと見どこで定義されている関数か分からない フリー関数ならnamespace::で判るし、 別のクラスのメソッドなら前に obj. とか付くし、 static でないメソッドの中からしたら、staticかどうかなて関係ないし。 普通にPrintCore()でいいんでないのん?
ちなみにメンバ変数を使うときは this-> を省略しない メンバ変数名には m_hoge や _hoge のようなプレフィックスを使わない hoge で十分 class Hoge { private: typedef Hoge this_class; int value; static int hogeValue; }; メンバ変数 value へのアクセスは this->value を使用し 静的メンバ変数 hogeValue へのアクセスは this_class::hogeValue を使用する という俺の宗教ですが何か
placement newは引数が2つあるのに 使うときは一つなのはなぜですか?
newが中で頑張ってるから
>>915 指定した型が必要とするサイズはコンパイラが知ってるんだし、
ユーザーが指定するとしたら間違える可能性もでてきちゃう。
あなたは this->hoge 派ですか? それとも m_hoge 派ですか? なにも修飾がない、ただの hoge は、確かに見たくないな 大域変数なのか、メンバ変数なのか、関数の仮引数なのか、 いちいち確かめるために時間が無駄になる 確かめる手間を省くことで、コードの可読性は上がり、読む人の負担は軽減されると思う 同じ理由から、修飾無しの foo() も可読性にやや劣ると思う
そんな自演してまで擁護しなくても責めないから休んでいいよ
googleスタイルとかいくつかの有名な参考書だとメンバ変数は int hoge_; としてた
非公開な情報を隠蔽するために抽象クラスやらPImplなどあるけど 全部のクラスにこんなことしてたら大変だと思うんだけど 適切な運用法をばっさり教えてくれ
一番お外のクラスだけちゃんと隠蔽すりゃいいんでない?
関数だったら、クラスメンバということを明確にするために this->func1(); もありだと思うけどな。 this->data=0; とやればデータメンバだと分かるからという理由で装飾を止めてしまうと、 ローカルメンバと衝突する可能性がでてくる。 そしてたぶん、コンパイルエラーにならないよな・・? だから辞めた方が良い。
emacsやらeclipseやらvisual studioやらの入力補助を使うので、 thisを付けずにはいられない。
void get(Struct *buf) 上みたくポインタ経由で情報を取得する系の関数の場合、一般的に必ずif (buf)するもんなの? 0ならどうせ正常に動かないんだから必要ないように感じるんだけど。もちろん場合によるけども 参照も考えたけど、const&以外はどうもしっくりこなくて
仕様書にIf this pointer is NULL, the behavior is undefined.って書いておけばおk
そうしときます
assertでデーンさせる
例外機構なんて無かったんや
>>927 メンバにはm_を頭につけるだけで衝突も区別も解決するけどな
メンバを参照するときはthisとか書かずにコード保完で一発だし
935 :
sage :2011/07/14(木) 00:35:44.83
http://codepad.org/jqAXsH1I 実行結果がテキストのものと違くなってしまいます
テキストの実行結果では
Base
Derived
こうなるんですけど書き写したものを実行すると上のリンク先の実行結果になってしまう
意味がわからないので教えてください
>>935 仮想関数を持たないクラスに対する typeid は静的な型しか返さない。
5.2.8 [expr.typeid] p3
> When typeid is applied to an expression other than an lvalue of a polymorphic
> class type, the result refers to a type_info object representing the static type of
> the expression. ...
template<typename T>struct STR{ template<typename S>void operator+(S);//A template<size_t L>void operator+(const T(&)[L]){}//B template<>void operator+(const T*){}//C }; template<typename T,typename S>void operator+(S,const STR<T>&);//D template<typename T,size_t L>void operator+(const T(&)[L],const STR<T>&){}//E template<typename T>void operator+(const T*,const STR<T>&){}//F const char a[]="a"; const char *b=a; STR<char>c; c+a;//B c+b;//C a+c;//Eを呼びたいがC2593 b+c;//F ポインタか配列かを区別したいのですが、グローバル演算子の方はそもそも特殊化になっていないようです。 EとFをDの特殊化として、曖昧さを解決する方法はありませんか?
>>937 横からだが、情報サンクス…。
まさかこのスレで勉強になることがあろうとはw
940 :
938 :2011/07/14(木) 11:21:31.48
すいません、関数の部分特殊化なんてありませんでした。 関数を部分特殊化のようにしたい場合は関数オブジェクトを使うようなのですが operator+は関数オブジェクトにはできないので、 別の関数オブジェクトを作ってそれを呼ぶようにして自己解決しました。 template<typename T,typename S>struct SUB{ void operator()(S,const STR<T>&);//D }; template<typename T>struct SUB<T,const T*>{ void operator()(const T*,const STR<T>&){}//E }; template<typename T,size_t L>struct SUB<T,const T[L]>{ void operator()(const T(&)[L],const STR<T>&){}//F }; template<typename T,typename S>void operator+(const S&s,const STR<T>&t){//(D) SUB<T,S> sub;sub(s,t); }
C2593の原因は(&)を外せばいいと思うよ あと、EとFみたいなのを作りたい場合は普通にオーバーロードさせればいい BとCも同じ template<std::size_t N> void operator+(const T[N]); // B void operator+(const T *); // C みたいな感じで
942 :
938 :2011/07/14(木) 13:37:25.44
(&)を外したらコンパイルできました。 しかしFが呼ばれてしまいました。 >普通にオーバーロード Cのtemplate<>とAを消すとBが呼ばれました。 templateでない方が優先されるようなので、左辺にクラスが来る場合でも グローバルテンプレートとして以下のようにしたところ、うまくいきました。 template<typename T>void operator+(const STR<T>&,const T*){}//C Dに関係なくEとFはオーバーロードされているらしく、Dを消しても変わりませんでした。 (&)は消せないので逆にFをconst T*const&にするとうまくいきました。 やはり、&を外すか両方につけるかがC2593の解決方法のようですね。 Cに&が必要がないのはBがクラス内部だからか…? これで余計な型へのオーバーロードを宣言することなくいけそうです。 ありがとうございました。
943 :
938 :2011/07/14(木) 14:39:36.16
struct ...{... template<size_t L>void operator+=(const T(&)[L]){}//B2 }; //template<typename T> void operator+=(const STR<T> &,const T*){}//C2 //template<typename T> void operator+=(STR<T> &,const T*){}//C3 template<typename T> void operator+=(STR<T> &,const T*const &){}//C4 +=を定義しようと、operator+と同じ型のB2とC2を追加し、コンパイルできました。 しかし、実際には+=は値を変更するのでC3のように左辺のSTR<T>からconstを取った所 C2593になってしまいました。 結局C4のように、また右辺をconst T*const &とすることで、回避しました。 以上、日記ばかりですいません。
std::cerrはバッファリングされず、std::clogはバッファリングされるとのことですが std::clog << "1"; std::cerr << "2"; std::clog << "3"; とした場合、1がバッファリングされている間に2が先に出力され、"213"となる場合があるのでしょうか?
釣られんなよ
名前解決について教えて下さい。
以下のコードは、どうしてコンパイルエラーになんですか?
ttp://ideone.com/VoAl5 dp の動的な型は E なので、
仮想関数をオーバーライドしている E::f(X) が呼ばれると思ったのですが、
名前の隠蔽が何か悪さをしているのでしょうか?
D::f によって隠された B::f は隠されてしまったので見えなくなります dp->B::f などと明示的に指定するか D 内で using B::f して見えるようにしてやってください
なぜthisは参照ではいけなかったのか
D&Eより、「thisが作られた時代に参照がなかったから。」
self参照とかキーワードにしちゃえばいいのに #define self (*this) ってやるよねみんな
無駄に可読性落とすだけじゃないか?それは
マクロは禁止
Hoge &self(){return *this;} const Hoge &self() const {return *this;} とか
それはちょっと・・・
class Hoge{ private:Hoge &This; public:Hoge(): This( *this ){ This.func(); } void func(); };
それじゃsize増えるし
class E { public: int t, e; E(int a, int b) { t = a; e = b; } bool operator<(const E &r) { return (t == r.t ? e < r.e : t < r.t); } }; int main(){ multiset<E> ms; ms.insert(E(800, 1)); } setの型を自作クラスにしたくて上のようにしたのですが,下記のエラーが出てコンパイル通りません.何が原因でしょうか. stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = E]’: stl_tree.h:1168: instantiated from ‘typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_equal(const _Val&) [with _Key = E, _Val = E, _KeyOfValue = std::_Identity, _Compare = std::less, _Alloc = std::allocator]’ stl_multiset.h:370: instantiated from ‘typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator std::multiset<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = E, _Compare = std::less, _Alloc = std::allocator]’ code.cpp:28: instantiated from here stl_function.h:230: error: passing ‘const E’ as ‘this’ argument of ‘bool E::operator<(const E&)’ discards qualifiers
operator < (hoge const &) const
可変引数の ... の左のカンマがいらないのはなぜ? そのようにした意図を禿が言っているのを読んでみたいんですが、 禿本の何ページとか禿Webのどことか誰か知りませんか? そう決めた人が禿でなければ禿以外の人でも他の禿でもいいです。
>>959 ありがとう.でも自分では理解できてない・・
>>961 ・setに入れるときはデータがconstの状態で入れられる。
(そうしないと木が崩れるから)
・constの状態で呼べるのはconstメンバ関数だけ。
つまり比較演算子が呼べなくてコンパイルエラー
>>962 >・constの状態で呼べるのはconstメンバ関数だけ。
なるほど,なんとなくわかりました.ありがとう.
template<class X> class Vector { X data_[3]; public: template <typename Y, typename Z> friend Vector<X> operator+( const Vector<Z>& x, const Vector<Y>& y){ Vector<X> z; for(int i = 0; i < 3; ++i) z.data_[i] = x.data_[i] + y.data_[i]; return z; } }; int main(){ Vector<double> x,y; Vector<float> z; Vector<long double> a = x + z + y; } のように精度が異なるVectorの足し算を行うクラスを作りたいのですがうまくいきません。 どのようにすればいいでしょうか?
>>964 ほとんどでてるであろうエラーの説明になるけど
operator+でテンプレート引数の違うVectorを呼んだ場合
返り値のVector<X>をどっちにの型にしたらいいのか曖昧になってる
std::shared_ptr について質問です。 参照カウンタを用いて管理しているそうですが、 get() メソッドで取得したポインタを使いまわした場合、 それらは管理対象外という認識でよろしいのでしょうか?
>>966 そうだよ。
getしたポインタ使いまわしていても、shared_ptrの参照カウントが0になると削除されるよ。
そして、shard_ptrから所有権を剥奪するメンバ関数もない。
>>967 即レスありがとうございます。
気をつけないとダメなんですね。
関数の引数として渡すパフォーマンスが問題ならshared_ptrをconst参照で渡すことを検討するといいゾ
>>969 つまりコピーさせないって事ですね。
ありがとうございます。
>>969 そこのパフォーマンス気にするなら、
shared_ptrなんか渡さずポインタ渡しするか、または
スマポなんて使わないか、になるとおもうがなぁ。
無駄に引数が長くなるだけじゃね?const 参照なんてしたら
973 :
964 :2011/07/16(土) 19:21:35.31
>>965 レスありがとうございます。
float + double なら返り値は double、double + long doubleなら
返り値は long double 等、精度が高いほうを返すようにしたいのですけど、
自動的に実現する方法はなく、テンプレートの特殊化で、
全ての組み合わせを明示的に羅列するしかないのでしょうか?
C++0xなら // XとYの内サイズの大きい方に合わせる template <typename X, typename Y> Vector<typename std::conditional<sizeof(X) >= sizeof(Y), X, Y>::type> operator+(const Vector<X> &lhs, const Vector<Y> &rhs) { return Vector<typename std::conditional<sizeof(X) >= sizeof(Y), X, Y>::type>(lhs) += rhs; } std::conditionalが使えないなら、boost::mpl::if_cを使うか、それ相当のものを自作する
C++0xならdecltypeがつかえるんじゃないか? template <typename Y, typename Z> friend Vector<decltype((Y)0+(Z)0)> operator+( const Vector<Z>& x, const Vector<Y>& y){
>>972 スマポの安全性もパフォーマンスも欲しいゾ
977 :
964 :2011/07/16(土) 19:41:32.14
どうもありがとうございます! これを機にC++0xを始めてみようと思います。教えて頂いた コードを理解できるよう勉強してみます。
>>972 引数でconst参照のshared_ptrは普通に使うと思うぞ
>>978 そうなのか例えば
void fuga::func(const boost::shared_ptr<const hoge>& arg)const;
とか一瞬嫌な感覚があって・・・
まあ状況にもよるとおもうが
shared_ptrのスマポはカウンタの増減がアトミックオペレーションだからな パフォーマンスがどうでもいいところ以外でshared_ptrを使うなんて恥さらし以外のなんでもないぞ 設計ちゃんとしてナマポかユニポ使うのが技術者として最低限の良心だろ 思考放棄してとりあえずshared_ptrでいいかとか言ってるうちは永遠にアマチュア
今の時代、殆どの場所が パフォーマンスがどうでもいいところじゃね?
ぬるぽ
ガッ
まぁ業務用アプリ程度なら全部shared_ptrでいいな いや、業務用アプリにC++なんぞ必要ない。C#で十分だ
void SetHoge(const boost::shared_ptr<const Hoge> & pHoge) {} ・・・は長いので、Hogeクラスにtypedefを用意しておく class Hoge { public: typedef boost::shared_ptr<Hoge> shared_ptr; typedef boost::shared_ptr<const Hoge> shared_ptr_const; }; void SetHoge(const Hoge::shared_ptr & pHoge) {}
>>975 どうせ 0x 使うなら declval か trailing return type 使おうぜ。
>>986 f○○k。ならどうやってomitするかteachしてくださいよメーン?
どーう。こてー。
クラスに含まれるメンバー関数集合でそれに含まれるメンバー関数に ユーザーが呼び出す順番にルールがある場合は どのようなデザインが望ましいですか?
日本語をもう少し丁寧に書いてください
C++によるメンバー関数の定義されたクラス全体に含まれるメンバー関数集合の属Aに含まれるメンバー関数集合に クライアントが呼び出す半順序に制限がある状態Pでは どのようなデザインが望ましいでしょうか?
カプセル化すればよろしい
こういうのはどうですか? メンバー関数に番号をつける。 クライアントはクラスから使用可能メンバー関数の番号リストを借りることが出来る。 それを見てクライアントは次に使うメンバー関数を決める。
普通に定義する。順番がまずい場合は例外出す。
呼び出す順番に制限があるクラスは出来損ないです どんな順番で呼び出してもいいように作り直しましょう
そんなあなたにFacade パターン
ume
Facade ってセミだっけ?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。