1 :
v(^・^)v :
2006/10/30(月) 22:34:08
2 :
v(^・^)v :2006/10/30(月) 22:34:41
3 :
v(^・^)v :2006/10/30(月) 22:35:03
4 :
v(^・^)v :2006/10/30(月) 22:35:30
5 :
v(^・^)v :2006/10/30(月) 22:35:50
6 :
v(^・^)v :2006/10/30(月) 22:36:12
7 :
v(^・^)v :2006/10/30(月) 22:36:32
8 :
v(^・^)v :2006/10/30(月) 22:36:53
9 :
v(^・^)v :2006/10/30(月) 22:37:13
乙
12 :
デフォルトの名無しさん :2006/10/30(月) 22:45:43
Boostつかうと一気に実行ファイルサイズが100倍に?!
>Boostつかうと一気にコンパイル時間が100倍に?! 環境によるだろ。 俺はVC++に /Yc オプションを指定して、極力 プリコンパイルヘッダを使用するようにして使っているが、例えばboost::lambdaを 使っても使わない時と比べ10秒ほどしか増えない。
STLつかうと一気に実行ファイルサイズが10倍に?!
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h> 後死ね。
言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
プリコンパイル済みヘッダ使っても 自作パーサとSpiritじゃマジでコンパイル時間100倍になるぜ。
>>14 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
template<C++相談室>は
>>50 まで続きます
〜しばらくおまちください〜
任意のタイミングでファイルオープンとファイルクローズが出来るデバックツール探してます。 CreateFileとかCopyFile等の動作チェック用です。 自分で作ってもいんですが、既に多機能な機能やグラフィカルなツールがあるかもしれないので探しています。 VisualStudioパッケージあるかもしれんがようわからん。 誰か知らないか?
>>24 スレ違い。意味が分からんからどこ行っても答えは得られないだろうが。
;゚д゚)<ここまでテンプレ Σ(゚Д゚;エーッ!!
アフロいきまーす
クラステンプレートにストリーム演算子をオーバーロードさせることは不可能なんですか?
>>29 それだけ聞くとできそうに思う。
何故不可能だと思ったのかね?
>>29 こういうやつのことか?
template <typename T>
class A { public: T v; };
template <typename T>
std::ostream& operator<<(std::ostream& os, const A<T>& v)
{ return os << v.v; }
>>32 その通りです
>>31 GCCだと単純に
>>32 のように書くとコンパイルエラーになります
Tの型が未決定なためエラーになるようです
なんかうまい方法はないでしょうか
>>33 gcc-3.3.6, gcc-3.4.6, gcc-4.0.3, gcc-4.1.1 on Linux でコンパイル通るぞ。
コードの別のところの問題だろう。
手元で通したコード全文はこれ。
#include <iostream>
#include <ostream>
(ここに
>>32 を入れる)
int main(void)
{
A<int> a;
a.v = 1;
std::cout << a << std::endl;
return 0;
}
29ができないようでは、std::basic_stringが入出力できなくなる。 逆に言うとできないわけがない。
class A{ int a int b std::string str; }; class B{ int a int b vector<double>v_fat; }; class C{ int a; int b; map<std::string, int>num; }; こんな似た様なメンバを持つクラスをJavaのArrayListみたいに 扱いたいときはどうするのですか?Objectクラスみたいなのを 作ってキャストすればOK?
>>36 共通部分を基底クラスにくくりだし、その基底クラスへのポインタの配列を作ればいい。
必要に応じて dynamic_cast する。しないでいい設計のほうが好ましいんだけど。
>>37 そこの FruitItem は
template <class T>
class FruitItem : public Fruit, T {
public:
FruitItem() {}
FruitItem(const T& y) : T(y) {}
const char* color() const { return T::color(); }
};
としたほうがよさそうだな。
template <class Target, class Source> Target lexical_castSource arg) { std::stringstream interpreter; Target result; if (!(interpreter << arg) || !(interpreter >> result) || !(interpreter >> std::ws).eof()) { throw bad_lexical_cast(); } return result; } Exceptional C++ Style で上のような記述を見かけたのですが、 >!(interpreter >> std::ws).eof() の部分は何を行っているのでしょうか? std::wsというのは初めて見ました 検索しても関係ないページがヒットしてしまい意味がつかめません・・・
>>40 C++標準ライブラリ
§13.1.5 マニピュレータ
wsはistreamに適用して、空白を読み飛ばす
本体はどこで入手できますか?買うのでしょうか?
本体とは?
Visual C++とかの書き込む奴です
スレ違い
47 :
デフォルトの名無しさん :2006/11/01(水) 22:47:11
ちょっとした質問です。 namespace A { struct X {}; void *operator new (size_t n, X&) { return 0; } void f() { X c; new (c) int; // ←ここ } } "ここ"で(size_t n, X&)に適合する呼出が見つかりませんと言われてしまいます。 ネームスペースAからグローバルスペース?に移すと難なく通ります。 operator new (...)で呼び出すとネームスペースから外さなくてもエラーになりません。 仕様でしょうか? ちなみにVS2003です。
質問です。 //敵の生成時に一時的に入れる変数と、敵をまとめて管理する変数 EnemyObj* enemy; vector<EnemyObj*> EnemyArr; //敵の生成時に呼ばれる関数 enemy = new Enemy1(arg_x, arg_y); EnemyArr.push_back(enemy); このようにした場合、例えばこれで敵を三体生成したとして、 (EnemyArr[0], EnemyArr[1], EnemyArr[2]) この中から delete EnemyArr[1]; としてもオブジェクトが破棄されないので困っています。 一番最後に生成した物(この場合EnemyArr[2])なら破棄できるみたいなのですが・・・。 一体どうしたらいいでしょう。
>>49 えっと、それはどういう意味でですか?
「破棄できないはずはない」のか、「根本的なミスをしている」のか
どっちの意味でしょう。
逆に聞くけど、破棄されてない事はどうやって確かめてるの?
>>51 オブジェクトが普通に表示されたり、
deleteする前の値(位置情報 xやyなど)
をそのまま持っているかどうかで確認しています。
>>48 > enemy = new Enemy1(arg_x, arg_y);
> EnemyArr.push_back(enemy);
原因の予感。push_back(const T&)じゃなかったか。
ゆえに、push_back(new Enemy1(arg_x, arg_y))で試してみて。
>>52 それって、破棄したオブジェクトをそのまま使ってるんじゃないか?
erase()でvectorの方も縮めておかないとだめだろ。
>>52 deleteしたからって中のデータは直ぐに破壊されん。
そんなん何の参考にならんし確認にもなってない。
まあコンテナにポインタだけを入れるのなら、boost::ptr_vectorの方が 使いやすいぞ。erase()したら自動的にdeleteしてくれるしな。
ちょっと状態遷移にそって処理を行いたいのですが解らないことがあります。 各個別は古典的にstateパターンで処理可能なルールとして実装できると思いますが 文脈を管理するためのクラスはどのように実現するのが一般的なのでしょうか? ルールはR0 = Aから始まるとします。 A = B | C B = a b c C = a | b c a = ... b = ... StateパターンでR0の状態を処理する。
deleteしてもそのポインタの指してる先が0でクリアされるわけじゃないから ポインタが指してる部分に情報が残ってるだけでは? デストラクタにstd::cout << "Delete Enemy" << std::endl;って行を入れて動作を確認してみて。
>>54 ,55
成る程、そういうことでしたか。
eraseする前に破棄されてるか確認したかったのですが、
それでは意味がないですね。
>>53 結局破棄されてないと勘違いしただけだったみたいですが、
その記述で一時的な変数が必要なくなって助かりました。
>>56 そういう便利なものもあるんですね。
ちょっと調べてみたいと思います。
>>58 成る程、デストラクタに入れておけば破棄された確認になりますね。
やってみます。
自分で書いてて意味不明だな。 とりあえず、文法を解析するときに 個別のルールはStateパターンで処理したいけど 文脈はどうやって処理すればいいのか思いつかないから助けて ほしいだけかもしれない
vectorにポインタを入れておいて、deleteした後その要素を使いたく ないなら、0を代入しておく方法もある。vectorコンテナは要素数が 大きくなると、eraseにO(N)かかるので高くつく。そこでdeleteした要素 には0を入れておき、後で必要になったらまず0の入っている要素を 再利用するという方法もある。 もちろんプログラム側で要素に0が入っていたら処理をスキップする 必要があるが。
>>61 まずデザパタに頼らず強引に文法解析の骨子を書いてみたら。
その後でStateパターンでまとめると綺麗にまとまるというだけの話。
64 :
53 :2006/11/02(木) 00:56:07
>>60 ごめん俺が間違ってた。気にするな。
>EnemyObj* enemy;
もちろんvirtualなデストラクタを持たせてるよね
>>53 push_back(new ...) はあからさまに例外安全じゃないので考え直したほうがいい。
>>58 破棄の確認が取れました。
ちゃんと破棄できていたようです。有難う御座います。
>>62 成る程、そういった利用方法もできるのですかぁ。
勉強になります。
>>64 持たせて破棄の確認をしました。
お騒がせしました。
>>65 それは
push_back(new ...)
にするより、元のコードのままの方がいいということですか?
newが例外を投げる可能性があるからね。 コンテナに対する操作とは分離しておいた方がいいだろう。 それと、コンテナの要素にアクセスする方法が単なるラウンドロビン的な 方法のみで、ランダムアクセスをしないのであればstd::listの採用を考え るのもよい。こちらはeraseしても反復子が無効にならない上、常にコストは O(1)だから。
>>47 new に対応する operator new はクラスのメンバとして宣言されたものか、
グローバルなものかのどちらかになる。 (5.3.4 9)
>>67 問題は push_back() が例外を投げた場合なわけだが。
>>66 元のコードも多分例外安全じゃない(いや、まcatchで適切にリソースの解体しているなら別だけど)
auto_ptr<Enemy>enemy(new Enemy(..));
EnemyAry.push_back(enemy.get());
enemy.release();
だいたいこんな感じで書けば例外安全。
>>70 ちょwwwwそれやり過ぎww
まあ業務用ソフトならそこまでするのかもしれんけど
>>67 ,70
うーむ、まだまだ未熟で理解できない点がありますので、
これから習熟していく上で徐々に理解していきたいと思います。
有難う御座いました。
>>70 は別にやりすぎとは思わないな
これくらいがふつう
だよな。 いつの日か、こんなのがリークの原因になってしまったとしたら、見つける自信が無い。 最初に書くときに安全を確保してしまうのが吉。
>>70 これって、もしEnemyAryがptr_vectorだったら例外安全難しくない?
1.
auto_ptr<Enemy>enemy(new Enemy(..));
EnemyAry.push_back(enemy.get());
enemy.release();
→enemy.release()が例外を投げるとptr_vectorとauto_ptrによる二重delete
2.
auto_ptr<Enemy>enemy(new Enemy(..));
EnemyAry.push_back(enemy.release());
→push_backが例外を投げるとリーク
>>75 releaseは例外を投げなーい。
だから安心安心。
>>75 prt_vector なら push_back(new ...) でいいだろ。
>>70 みたいな
コーディングを不要にするためのものなんだから。
push_backが例外投げたらどうすんだよ!
push_backって例外投げたっけ?
>75 auto_ptr::release()は例外投げません……
>>79 少なくともバッファが確保出来ないときは投げるんじゃない?
>>79 配列の拡張時にメモリ確保失敗する可能性があるから投げると思うよ。
ちょっとソース見てくる。
83 :
82 :2006/11/02(木) 02:21:02
見てきた。
>>77 のいうようにptr_*系は直接push_back呼び出して問題ない。
というか内部でauto_ptrつかって実質的に
>>70 と同じ処理をやってる。
だから、むしろauto_ptr使うと例外時に2重開放になるから使っちゃ駄目。
例外発生時にはpush_backは何もしないと思ってたので、
勝手に引数の開放するのは予想外だったのでちょっと驚き。
これからはptr_*系をちょくちょく使っていくか......
うげ、勝手に引数の状態変えるのかよ・・・
質問なんですが、関数の実引数や仮引数に auto_ptr<> を頻繁に使うことってあるんでしょうか?
>>86 new したオブジェクトの所有権が関数をまたいで頻繁に移動するならそうなるだろう。
>>87 なるほど。忘れていました。そうですよね。所有権が移動するから使えるんですか。
ありがとうございます。
そもそもauto_ptrって頻繁に使いますか?? 使わんとは言わんが、結局目の届く範囲においとかないと怖くて仕方ないので エラー処理とかでdeleteまとめんのが面倒くさいとかの時くらいしか出番ないですよ。 叩いて叩いて。
リソースリークを防止する一番簡単な方法がauto_ptr
自前でdeleteする手間とほとんど変わらん、便利よりも不便のが増えるで、 あればあったで構わないけど積極的な使用を推奨する気にはなれん代物でFA。
>>89 new があるところに auto_ptr あり。少なくとも new と同じぐらい使う。
boost 使ってるときは、ほとんどそっちになるけど。
>>91 手動deleteで例外安全確保しようと思ったらauto_ptrの100倍は面倒だろ
例外安全性なんて知ったことじゃありまっせん!
例外発生時点でそこから先計算不能な状態なんで書き込みリソースくらいしか例外安全に気を遣わない。 つか例外でたらabortせざるをえない。
97 :
デフォルトの名無しさん :2006/11/02(木) 09:30:17
>>68 遅くなりました。
ネームスペースに入れるとクラスのメンバのような扱いになっているって事ですか??
もう少しヒントを・・・
>>97 new を使ったときにメモリ確保に使われる operator new の決定方法は規格で
決められているわけだが、(以下
>>68 )
101 :
デフォルトの名無しさん :2006/11/02(木) 15:17:56
template<class T> class Test { vector<T> array; public: vector<class T>::iterator getBeginIterator() { return array.begin(); } }; こんなクラスを作ったのですが main関数で Test<unsigned char> test1; vector<unsigned char>::iterator itr = test1.getBeginIterator(); とすると main.cpp(37) : error C2440: '初期化中' : 'std::vector<_Ty>::iterator' から 'std::vector<_Ty>::iterator' に変換できません。 というエラーがでます。 どなたか原因がわかりませんか?
>vector<class T>::iterator getBeginIterator() typename std::vector<T>::iterator getBeginIterator()
>>101 Tというclassとclass Tという先行宣言の差。
vector<class T>をvector<T>にすれば多分大丈夫
>>83 push_back前の状態にロールバックするのが強い例外保証だからそれでいいんだよ。ていうか開放しないとリークしちゃうし。
newの戻り値をどっかに保存してたりするならそれはユーザー側の使い方が間違い。
abortするしかないとか言ってるやつは例外機構をメモリリーク防止くらいにしか思ってないんだろうなぁ。
リークを防ぐために例外発生時にも、 引数のオブジェクトの所有権を奪うという副作用を行っているんでしょ? その副作用のロールバックが出来ていないと思うけど、俺の解釈の仕方が間違っている? いや、ま、利便性考えればこの仕様が自然なんだけどね。 例外時にいちいち開放したくないし。
いや、コンテナにポインタを入れるという行為そのものが所有権の委譲なんだよ。
すまん。今のなしorz
問題は開放しないことにしてしまうと今度は基本的保証がされなくなってしまうことだね。強い保証がされてるかどうかは考え方の問題な気がする。
>>98 仮想記憶無い環境だとnewできない時はもうどうしようもねぇんだよ。
根本的には、 所有権の移動と配列の拡張という別個の事象を、 一つの関数で行うから、起きる問題だな。 stackのpop,topみたいに綺麗に二つに分けれると良いんだけど、 そもそも二つをくっつける為のptr_vectorというジレンマ
int x[3] = {3,5,1}; vector<int> a(&(x[0]), &(a[2]) + 1); a.sort(not2(less<int>() ) ); // 関数アダプタ not2() を入れた場合、エラーはでないのですが、実行した場合に強制終了となってしまいます。 なぜ、強制終了してしますんでしょうか? ソフトはVC++EEです。
>>112 a(&(x[0]), &(x[2]) + 1);
です。
std::vectorのメンバ関数にsortなんてあったっけ?
>>114 少なくともうちのVC8には無い。
int x[3] = {3,5,1};
vector<int> a(&(x[0]),&(x[2])+1);
sort(a.begin(),a.end(),not2(less<int>()));//
ちなみにこれなら普通に実行できたが。
どこのvector使ってるんだろう?
失礼しました。 listです。
>>116 もう信用できない。問題の発生するコードをコピペしろ。
#include "stdafx.h" #include <list> #include <functional> #include <iostream> using namespace std; template<class InputIterator> void Display(InputIterator first, InputIterator last){ for(InputIterator i = first; i != last; i++)cout << *i << " "; } template<class T> struct MyGreater : public binary_function<const T, const T, bool> { bool operator() (const T &t1, const T &t2) const { return t1 > t2;} }; void main(){ int a[8] = {5,8,4,2,41,6,9,7}; int b[14] = {9,9,4,2,1,0,5,6,7,1,1,1,1,1}; list<int> lst1(&(a[0]), &(a[7]) + 1); list<int> lst2(&(b[0]), &(b[13]) + 1); list<int>::iterator w = lst1.begin(); advance(w, 3); lst1.splice(w, lst2); Display(lst1.begin(), lst1.end());//3 lst1.sort(); Display(lst1.begin(), lst1.end());//4 lst1.sort(not2(greater<int>() ) );//-------ココです Display(lst1.begin(), lst1.end());//5 }
>>118 試したらデバッグモードのチェックで "invalid operator<" と言われたが、
「強制終了してします」ってのはこれのことか?
not(greater<int>()) つまり <= は比較関数に要求される
strict weak ordering の要件を満たさないってこと。
not2(greater_equal<int>()かless<int>()つかえって話だな。
122 :
デフォルトの名無しさん :2006/11/03(金) 00:19:41
>>99 また遅くなってしまい、スイセン
理解しました。まさしく文章通りでしたね。
確かにnew ヘッダも定義はstdの外でやっていました。
これで納得して進めることが出来ます。どうも有難う御座いました。
最近(というより数年前から)C++でもdoSomething()のような Java風の命名を良く見かけるのですが、何か理由はあるのですか?
>>123 典型的なところで、XercesみたいにJava出身のライブラリは当然、Java風になるね。
127 :
デフォルトの名無しさん :2006/11/03(金) 03:43:18
>>123 C++風の命名ってどういうものなんでしょう?
JavaからOOPL入ったので良くわかりません...
C/C++ class_name func_name Java ClassName funcName 確かにJavaスタイルをよく見かける。このスレ(板)でも。
それをC++風だとか、Java風とか分類するのがナンセンスなんだよ
C/C++ fuck_cpp Java fuckJava コーディングスタイルは他でやれよ
確かに、最近WindowsAPI風の関数名をよく見るね
それはDoSomething() まあ、どうでもいいけどね
133 :
101 :2006/11/03(金) 09:24:27
>>102 ,
>>103 サンクス。
>typename std::vector<T>::iterator getBeginIterator()
でいけました。
仮の型指定のあるテンプレート前方宣言はどう宣言したらいいのでしょうか? 仮の型指定がない次のような場合は通るのですが template < typename _T > class A; // 前方宣言 typedef A< int > B; template < typename _T > class A // 定義 { }; main( void ) { B b; } 以下のケースのように定義側に仮の型指定がある場合の前方宣言の仕方がわかりません。 template < typename _T = int > class A; // 前方宣言 無理 ERROR // template < typename _T > class A; // 前方宣言 無理 ERROR // template < > class A; // 前方宣言 無理 ERROR typedef A< > B; template < typename _T = int > class A // 定義 { }; main( void ) { B b; }
>>93 > auto_ptr で増える不便って何?
頭悪い子が付いていけない。
templateの機能を1から学ぼうと思うとどれ読めばいいの? Moden C++とか読むと書いてあることは解るけどなんでそんなこと 思いつくのよこの変態とか思うわけで....
書いてあることが分かるなら一から学ぶ必要は無い。
>>137 いやそれだと狭い知識しかみにつかんからもし
機能を体系的に勉強できるような資料があればうれしいのよ
>>138 lisp, Haskell, etc,,
>>136 機能を学ぶ以前に、想像力(or創造力)を鍛えた方が医院で内科医?
>>136 もう読んでいるのかもしれないけど、
>>4 のC++ Templates
このtemplateが永遠にコンパイルできません。助けてください template<int Depth, int A, typename B> struct K17 { static const int x = K17<Depth+1, 0, K17<Depth,A,B> >::x + K17<Depth+1, 1, K17<Depth,A,B> >::x + K17<Depth+1, 2, K17<Depth,A,B> >::x + K17<Depth+1, 3, K17<Depth,A,B> >::x + K17<Depth+1, 4, K17<Depth,A,B> >::x; }; template<int A, typename B> struct K17<16,A,B> { static const int x = 1; }; static const int z = K17<0,0,int>::x;
K17<Depth,A,B>の中にK17<Depth+1, 0, K17<Depth,A,B> >::x があると その実体化にまたK17<Depth,A,B>が必要になるから struct A{ A a;};と同じことになるんじゃね?
内部構造がスッタクオーバーフローしましたとかいう 意味不明なエラーが出て困ってます。
たった7600億回インスタンス化するだけでスタックオーバーフローするって やっぱC++って腐りきってるよね、C#とかJAVAがいいんだろうな
>>135 そうなると C++ 自体が使えないね。
どっかで見たことあるいぢめテンプレートだな〜
素直に関数型言語使えばいいじゃん。
つ elisp
>>142 ふつうに再帰関数でもフリーズ。
関数の呼び出し回数が190734863281回にもなるから当たり前だけどな
そこでgotoですよ
まぁC++は使えない言語だと証明されてしまったってことか
RUBYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
お前らがC++を使えないの間違いだろ。
はっきり言ってC++は使えるか使えないかは2極化しやすいよね。
何?他の言語ならそんなに呼び出しても大丈夫なの?w
>>156 まったくできず挫折する人。
深く理解して高度に使いこなす人。
そして第3の勢力… 俺C++ばっちりだぜ、と言いつつ実はベターCとしてしか使ってない人。
iostreamのマニピュレータの実装ってどうなってるんですか?
ソース嫁
>>160 概略だけでいいので…
それに、すぐにソース読めというのもあまり教育的ではないでしょう…
>>158 C++をBetter Cとして使うのってCでゴリゴリ書くより楽じゃね
>>161 独習C++の 9.1 独自マニピュレータの作成 とか
ベターCする人ってCだとメモリ管理ガタガタうるさいけど C++で一時オブジェクト作るからやめればっていわれるとファビョる え?え?え?なんでなんで問題ないでしょそんなのえ?え?え?え おいおい勝手に言うなよじゃあ証拠見せろとふぁびょります JISのC++企画書をサルでも解る日本語でいうとふーんまぁレアケースだね とかほざきます助けてくださいもう死にたい
お前も十分ファビョってるよ。 日本語学んでから書き込んでね。
ふぅ、今日は冷えるな。 残念ながら暖房は無しだ。
>>134 遅レスだけど、それ解決方法ないはず、
C++の継ぎはぎ構文の負の遺産の一つ。
構文解析の問題で、出来なければならないのに出来ない事例を集めたサイトがどこかにあったはず。
C言語のスーパーセットとして登場して十数年、
言語の拡張という意味ではC++はもういっぱいいっぱいです。
十数年どころじゃなかったわ。 歳をとるわけだ。
>>134 ,169
何を問題としているのかわからない。
宣言と定義の両方にデフォルト引数指定してるから、
再定義でエラーになるってだけじゃないの?
boost::spritの作り方解説してるところないでしょうか? 自分であれを作ってみたい
>>172 通常、定義はサードパーティーやら何やらのヘッダに書かれていて手をつけれない。
これを前提にした場合。
定義ヘッダ側に仮引数がないテンプレートクラスの先行宣言は通るけど、
定義ヘッダ側に仮引数がある場合は先行宣言そのものが出来ないってこと。
>>174 あーそういうことか。
でかいテンプレートコンポーネントの前方宣言は <iosfwd> みたいに
実装者が提供しないといけないってことになるかな。
覚えておこう。
boost::spiritだぉごめんお
そうだなぁ、まず禿げてみたらどうだい?
>>174 ×定義ヘッダ
○定義
×仮引数
○デフォルト引数
×テンプレートクラス
○クラステンプレート
△先行宣言
○前方宣言
たて続けに気になったんで、な。
>>173 使い方の解説ならあるんだろうけど、作り方はないだろうなぁ。
ソース読めば。
forward declaration の訳語って、公式なものは無いの? 前方宣言のほうが先行宣言より正しいような気はする。
>>182 free(*ptr) じゃコンパイル通らんだろ。 free(ptr) だな。
じゃあ何故 free(*ptr) と書かれてるんですか? ここのptrはint **なんでしょうか
>>184 誤記だろう。
ptr は int* のはず。
ptrはvoid************:だぉwwwwwwwwwwwwwwwwwwww
>>187 もういいよ
現場で使う言語がC++なんだから・・・
オブジェクト指向なんて意味ないからね
C/C++プログラマの休日の過ごし方について教えてください。 起床時間: 就寝時間: 食事: 行動: など
>>191 仕様なら仕様らしく書いてください
そんなのじゃ仕事できまんせ
>>190 正直に聞くが其れをゲットしてうれしいか?
>>191 さーて今起きたことだし、コンビニで弁当かってC++FAQでも読みながらたべよ
どれ、ドラフト行ってくるか・・・今日も欝だ死のう
ふぅ、禿に向かってお祈りしないと
今日もSFINAEがコンパイル通らなかったなぁ・・・
禿に餌やってきた。茄子が好物のようだ。 頭のテカりも良くなってきているから凶から茄子をやろう。うへへ。
>>198 ちょっ!、意味もなく笑っちまったぢゃないか!
200 :
デフォルトの名無しさん :2006/11/04(土) 21:06:58
>>129 いやJavaには推奨される命名規則あるだろ。
C++には無いからどんなの?と聞いただけで。
C++やってて思うんだ 言語仕様を覚えようと必死な俺だが、 C++は道具であって目的じゃない。と
>>203 C++の言語仕様を完全に把握しようというのは、とても難しいよね。
自分がやりたいことを実現するために必要な範囲を覚えたら、道具としては十分使える。
それで足りなくなったらまた覚えればいい。
知識が足りないうちは、大丈夫だと分かっていることだけを使おうとしても
知らずにまずい書き方をすることもあるだろうけど、
ある程度のレベルに達すれば、自分が大丈夫だと分かる範囲の機能だけを
正しく使えるようになると思う。
>>201 boostをまねておけばいい
STLの実装はまねちゃ駄目だぞ
>>206 数年前も十年前も今でも、 C++ で推奨される命名規則など無い。
そして標準ライブラリの命名規則はずっとある。
何か不満か?
>>206 C++ Coding Standards: 0項の一部を勝手に要約。
「一貫性のある規約を自分で定義し管理せよ」
まあ世の流行ってのはあるが、関連がないなら合わせる意味はない。
というか最早命名規則でどーのと悩む時間すら惜しいわけで…
>>209 の言うとおり馴れたのがあればそれが一番適当だと思うな
そんなわけで取り合えずJavaのに合わせてる俺がいきなり全裸。
書く時の「指先の理想」と、読む時の「目の理想」はまた別なのが奥深い。 書く上ではShiftキーを押すのがどうも「踏み切り前の一時停止」みたいで野暮ったいw だからアンダーバーもちょっと抵抗あって、hoge-fugaみたいに書けるLispのやり方が好き。 でもそれは、読む際の事情はまた別なんだよな。
>>212 つまり、ほんの僅かな手間を惜しんで事故の可能性を増大させるわけですな。
215 :
デフォルトの名無しさん :2006/11/05(日) 12:47:12
hogeクラスとfooクラスがあったとして class foo { hoge *A; void test(); } void foo::test() { // Aの中身は0x00000000のまま A->hoge_func(); } でA::hoge_funcのなかではグローバルなりソースか、hoge_func内で宣言した 関数内のローカルなリソースしか使っていなくて、hogeクラスのメンバは一切使ってない のですが、これってA->hoge_func読んだ時点でnull参照で落ちるんですよね??? VC2005でコンパイルしたんですが、これでずっと動いてたのですが、 デバッグで動かしてもちゃんとA::hoge_funcのなかに飛ぶので、不思議なのです。。 これは実は落ちないものなんでしょうか?
↑AはInitInstanceでNULLに初期化されていました
>>215 コンパイル時にクラスhogeのメンバ関数hoge_funcは解決されるから呼び出せる、ってだけじゃね?
メモリが足りなくて困ってます。 ただ同じことを繰り返してるだけなので、 試行が終わるたびにテキストで出力すればあとは手作業で済ませます。 どうすれば、試行の度に出力することができますか? ファイル名をその度に変える必要があるんどえしょうか?
>>215 hogeの定義次第じゃね?
>>218 スレ違い。
アップローダにソースを載せて、初心者スレ辺りで質問しなおせば誰かヒントをくれるかもしれない。
>>217 そういうものなんでしょうか。コンパイル時の解決関係で調べてみます。
>>219 hogeはCDialogの継承クラスなんですが、そういうのも関係してるのかなあとか。。
自分が作ったんじゃないんですが、たぶんダイアログをリソースエディタで作ったときに
当時VC6.0でクラスの追加メニューで作ったんだと思います。。
>>221 それは非仮想メンバ関数が第一引数の前にthisポインタを渡す関数として実装されることが多いからで(ry
>>222 す、すいません、よく理解できませんでした。。
第一引数の前にthisポインタを渡す関数
というのは、第一引数を渡す前に、thisポインタを渡すので暗黙のうちに場所がわかるということでしょうか?
それはメンバ関数内で別の自分と同じクラスのメンバ関数呼ぶときに、実体を指定せずに関数名だけで呼べるみたいな
ことでしょうか?
しかし今回hogeの実体は一度も作られていないので、thisポインタすら無いように思います
fooのほうは、実体はあるのですが。。
なんか間違ってるかもしれません
>>223 A->hoge_func()がhoge_func(A)に変わるとしたら
thisに0入ってるんじゃねーの?
ますます意味がわからなくなってきました。勉強不足でスイマセン。 今手元にソースがないので来週試してデバッグしてみます。。
未定義だけど、コンパイラのおかげ??で偶然動いてるんですね。。 とりあえずロジックとしてはおかしい?とおもうのでとにかく直しておきます。 ありがとうございます。
strdupってcでもc++でもfreeしなきゃダメなんですか? deleteじゃダメですか?
使っているCランタイムライブラリのドキュメントを読め
>>228 deleteはnewされたオブジェクトに対してのみ。
strdup()は内部的にmalloc()を呼び出しているので、free()を使う。
231 :
デフォルトの名無しさん :2006/11/06(月) 15:54:54
vectorに多数のクラスを格納した場合、クラスの中のメンバ変数を検索する場合どうしたらよいのでしょうか?
>>231 for_each()って事?
添え字がわかっているならoperator[]でアクセスできるけど
関係ないけどメンバ変数が降順もしくは昇順にソートされているなら lower_bound()も使える。
>>231 template< class T, typename V > struct my_predicate
: public binary_function< T, V, bool > {
bool operator()( T const & t, V v ) const {
/* TODO:比較処理 */
}
};
...
vector<T> vt;
vector<T>::iterator it = find_if( vt.begin(), vt.end(), bind2nd(my_predicate<T,int>(),1) );
ある値を使いたいのですが、その値を1.2.5.10.20.50.100.200・・・・のように 出力したいのですがそのようなプログラムになるのでしょうか?よろしくお願いします。
>>235 質問が抽象的すぎ
ある値がどこにあるのかとか。
それ以前に丸投げってやつは(ry
>>235-236 たとえばある一次式のxの値に1.2.5.10.20.50.100.200・・・・と順にその答えを出したいのですが、
1.2.5.10.20.50.100.200・・・・をどうやって出力するのかってことかな?
単に、数字をピリオドで区切っていくつも出力したいだけなのでは・・・
239 :
デフォルトの名無しさん :2006/11/06(月) 17:06:33
順番に出力だとちょっと面倒だなぁ
単に{1,2,5}の配列に*10しつづけながら出力するだけじゃないの?
241 :
デフォルトの名無しさん :2006/11/06(月) 17:13:03
考え方はそれで良いと思うけど、プログラムにするとちょい面倒・・・
それのどこが面倒なのか
よくわからないけどこういうこと? #include <stdio.h> void main(void){ int x[] = {1, 2, 5}; int i; for(i = 1; 1; i *= 10) printf("%d.%d.%d.", x[0]*i, x[1]*i, x[2]*i); }
struct c { c(){cout << "c ctor" << endl ;} //c( const c &obj ){cout << "c copy ctor" << endl ;} ~c(){cout << "c dtor" << endl ;} } ; c func( c obj ) { cout << "func" << endl ; return (obj) ; } で func( c() ) ; と実行すると c ctor func c dtor c dtor c dtor //をとってコピーコンストラクタを実装すると c ctor func c copy ctor c dtor c dtor コピーコンストラクタの定義の有無で デストラクタの呼び出し回数が変わるものなのでしょうか?
>>244 きちんとした実験結果があるのになぜ質問しているのか不明ですが、
現に変わってるでしょう?
なぜこういう動作になるかは、コピーコンストラクタがある場合と無い場合とで
引数(と戻り値)の受け渡しがどう変わるかを調べればわかると思います。
for(;;) { printf("%d.%d.%d.", x[0]*=10, x[1]*=10,x[2]*=10); } のほうがよくね?
>>244 コンパイラはコピーを最適化して除去できるので
変わっても不思議ではない。実際、GCCではどちらも2回だった
C++関係のサイトをみていると "Move Semantics" という単語がでてくるんですが、コレは std::auto_ptrの様にオブジェクトの所有権が移動する 事を指している という認識でいいんですか?
>>248 文脈にもよるけど、たぶんC++0xの機能のこと。
その機能の目的はauto_ptrのような所有権の移動を楽に記述するような機能と思えば大体OK
>>249 ありがとうございます。
具体的にどういう仕組みかわからないので、ググってきます
>>244 それ、コンパイラ何使ってる?
コピーコンストラクタをユーザー定義するかどうかで
一時オブジェクトの有無が変わる理由がわからん。
252 :
244 :2006/11/07(火) 01:04:15
>>245 変わってるんですが、なぜかわからなかったもので。
引数と戻り値の受け渡し時のコピーがらみかなとも思ったんですが
調べてもわからなかったもんで。
デストラクタが3回呼ばれるのが謎で
コピーコンストラクタの呼び出しをチェックしようとしたら
デストラクタが2回しか呼ばれなくなってわからなくなりました…
>>247 GCCではどちらも2回なんですね。コンパイラ依存?
VS2005 C++を使ってるんですが、デバッグ用なので
最適化オプションは無効になってますが、
その最適化とは違うことだとすると
ユーザ定義のコピーコンストラクタがない場合のみ
一時オブジェクトが2個作られてるって事でしょうか。調べてみます。
>>251 VS2005 C++です。
私もその理由がわからなくて悩んでます。
>>247 の最適化による除去が濃厚そうですね。
A := B | C | D B = a | bc みたなBNFをtemplate使って書いてみたいんですけどどうやって書けばいいの?
一体全体どこにtemplateを使うって?
>>251 ユーザー定義のデストラクタはあり、
ユーザー定義のコピーコンストラクタはない
バランスが取れてないのでVC++は除去しないと見た
ベンダに聞かないと分からんけどなw
std::map<std::string, A *> m; っていうコンテナ作りました。 これだと、Aを丸々コピーしなくても問題ないですよね? あと格納したオブジェクトをoperator()を実装して呼び出せば 関数呼び出しのコストはかからないですよね?
>>257 sizeof(A *)のコピーしか無いだろうが、ポインタの参照先については責任を持たなきゃならんな。
>あと格納したオブジェクトをoperator()を実装して呼び出せば
A::operator () () であろうが、void A::func()であろうが、所詮は同じ「関数」。
260 :
デフォルトの名無しさん :2006/11/07(火) 10:29:34
261 :
244 :2006/11/07(火) 15:23:23
下記のコードでfunc2()の引数objが初期化される時に ユーザ定義コピーコンストラクタありだと c obj = c() ; ユーザ定義コピーコンストラクタなしだと c tmp = c() ; c obj = c ; となるみたいです。 DEBUG版だから最適化無効になっているはずなんですけどね。 コンパイラの最適化の話ではなく、C++の言語仕様なんだろうか。 -- struct c { c(){ cout << "c ctor" << endl ; } //c( const c &obj ){cout << "c copy ctor" << endl ;} ~c(){ cout << "c dtor" << endl ;} } ; void func2( c obj ) {cout << "func2" << endl ; } で、以下をユーザ定義コピーコンストラクタあり/なしで実行すると、 func2( c() ) ; ユーザ定義コピーコンストラクタあり c ctor func2 c dtor ユーザ定義コピーコンストラクタあり c ctor func2 c dtor c dtor
262 :
デフォルトの名無しさん :2006/11/07(火) 16:08:46
実行結果をノートパッドなどに出力する方法教えてください・・・
263 :
262 :2006/11/07(火) 16:09:18
スレ違いでしたすいません
動的な型決定みたいなことをしたいのですが、どこかに適当なサンプルコードなどないでしょうか template< Any>//?? Any detAnyFromIndex(int index) { if(index==0) return( (char)(... ) ) if(index==1) return( (int)(... ) ) if(index==2) return( (double)(... ) ) }
>>264 templateをなんだと思ってるんだ?
最近template関係の質問多くなったな
それもアホみたいなのが。
流行ってんの?
266 :
264 :2006/11/07(火) 17:04:54
templateでなくてもいいのだけど 関数の返す方を動的に変えたい boost::any detAnyFromIndex(int index) だと、データを取り出すときに結局 boost::any_cast<float>(output ) が必要になって処理が後回しにされるだけで解決にならない
無理
>>266 型は静的なものだから、動的に取得することは出来ません。
269 :
デフォルトの名無しさん :2006/11/07(火) 17:39:08
できるもん!
ドラえもん!
>>266 その自身たっぷりんりんの発言はどこから来るんだ?
さっさとしね
274 :
264 :2006/11/07(火) 18:06:45
>>271 なぜに自身たっぷり?
よくわからないけど、プリプロセッサでなんとかできないか試してみる
>>274 できないっつってんだろうがボケww
プリプロセッサとか・・w
もう一度template勉強しろ
277 :
264 :2006/11/07(火) 18:14:27
自己解決 boostのHPにあったサンプルで解決できそうです #define ARITHMETIC_TYPE(I) ARITHMETIC_TYPE ## I #define ARITHMETIC_TYPE0 bool #define ARITHMETIC_TYPE1 char #define ARITHMETIC_TYPE2 signed char #define ARITHMETIC_TYPE3 unsigned char #define ARITHMETIC_TYPE4 short #define ARITHMETIC_TYPE5 unsigned short #define ARITHMETIC_TYPE6 int #define ARITHMETIC_TYPE7 unsigned int #define ARITHMETIC_TYPE8 long #define ARITHMETIC_TYPE9 unsigned long #define ARITHMETIC_TYPE10 float #define ARITHMETIC_TYPE11 double #define ARITHMETIC_TYPE12 long double
「 t e m p l a t e 」で、「 動 的 な 型 決 定 み た い な こ と 」をしたいのですが、できません>< boost使っても出来ません><;;;; どうすればできますか??? プリプロセッサ使えばできるんですか><
本人が満足してんだからほっとけ。 やりたいことは分かったしそれが最適だと思うなら勝手にしろ
281 :
264 :2006/11/07(火) 18:17:37
>>278 バカの一つ覚えみたいにうるせーよ
できねーってゆうならその証拠みせろ
>>281 マクロはコンパイル時に展開されますから、動的な処理は行えません。
相談室で相談に対して正解教えてるのにその口ぶり・・・酷ス
自分で Variant 型でも作ってみたら?
ふむ。。。 具体的な例がでてないから、やきもきするのはわかるが、 その態度は気にくわんな 学生さん?
285 :
264 :2006/11/07(火) 18:27:11
>>282 確かにできませんでした。
あきらめます。
出来ないことの具体例ってのは難しいな。
union
C++かWinAPIかちょっと判断できなかったんでこちらで質問させてください リソース管理クラスの目的で関数ポインタをメンバにしようとしてるんですが、 呼び出し規約が違うと関数ポインタに代入できないようで困ってます。 (今は各規約のポインタとコンストラクタを持ってる) 呼び出し規約ってのはtemplateで決定できないんでしょうか? #include <windows.h> template <typename T, typename R = void> class AutoResource { T resource; R (/*WINAPIV*/WINAPI *killFunc)(T); // ↑ここをtempleateに public: AutoResource(T res, R (/*WINAPIV*/WINAPI *func)(T) ) : resource(res), killFunc(func) {} ~AutoResource() { (this->killFunc)(this->resource); } }; void f(HMODULE h) { FreeLibrary(h); } int main() { AutoResource<HMODULE, BOOL> res(LoadLibrary(TEXT("freetype.dll")), FreeLibrary); //AutoResource<HMODULE> ress(LoadLibrary(TEXT("shell32.dll")), f); return 0; } コンパイラはVC8です
>>288 template< typename T, typename R > struct killer_base
: public std::unary_function< T, R > {
virtual ~killer_base() {};
virtual R operator()( T ) = 0;
};
template< typename F, typename T, typename R > struct killer
: public killer_base<T,R> {
F f;
killer( F func ) : f(func) {}
R operator()( T t ) { return f(t); }
};
template <typename T, typename R = void>
class AutoResource {
T resource;
auto_ptr< killer_base<T,R> > const killFunc; // noncopyable
public:
template< typename KillerFunc >
AutoResource(T res, KillerFunc func )
: resource(res), killFunc(new killer<KillerFunc,T,R>(func)) {}
~AutoResource() { (*killFunc)(resource); }
};
よこからすまん。
>>289 のkiller_baseって何で必要なの?
AutoResourceのコンストラクタの時点で関数の型が決定するから
>>291 boost::shared_ptr の sp_counted_base と、sp_counted_impl みたいなもの。
コンストラクタ呼び出しで渡された型を保存しておくための方法。
>>289 (゚д゚)スゲー とりあえず意図したとおりのものになりました
ありがとうございます
内容はまだ理解できてないけどな!
>>296 ああすることによって、killer<F, T, R>型(のうち具体的にはF)がなんであっても
統一的に基底クラスであるkiller_base<T, R>型のオブジェクトとして取り扱えるようになる。
boost::functionなんかも同じようなことをやっている。
あああああああああああOK 理解した。ありがつ。
299 :
デフォルトの名無しさん :2006/11/07(火) 23:47:53
#include "stdafx.h" #include <limits.h> int _tmain(int argc, _TCHAR* argv[]) { int n,max=INT_MIN,min=INT_MAX; bool flag=true; do{ printf("整数を入力してください。"); scanf_s("%d",&n); if(n==0) flag=false; if(n>max) max=n; else if(n<min) min=n; }while(flag); printf_s("\n最大は%d 最小は%dです。\n",max,min); return 0; } VC++ Proでこれを実行すると0を入力したとき コマンドプロント閉じちゃうんですがどうしたらいいんですか
300 :
299 :2006/11/07(火) 23:51:01
あ、できました。
ああ、答えをいただいて3時間超、ようやく判った。 ありがとう、おめでとう。
ところでOperator()って何のためにあるの? 意味不明。関数ポインタでいいじゃん
ステートを持たせることができる
そんなもん構造体引数に渡せばいいだろ
for_eachアルゴリズムの第三引数とか。 だんだんチラシの裏っぽくなってきた。
>>302 D&Eには、理由がない限りどの演算子も多重定義できるようにしたというようなことが書いてある。
そもそも導入された理由はその流れだろう。
>>304 Windows APIのコールバック関数ではそういう風になっているな。
だが、operator ()を使って(というよりboost::bindなんかで束縛してやって)のほうが、スマートだと俺は思う。
STLを考えた偉い人もたぶんそんなことを考えたのだろう。
型で管理できる。
templateで渡せる。
>>308 tmplateでどうやって渡すの?
サンプル教えて
template<typename FUNC> void call_funcobj(FUNC f) { f("hello,world") ; } void func(std::string const & message) { std::cout << message << std::endl ; } ; class FuncObj { std::string header_ ; public : FuncObj(std::string const & header) : header_(header) { } void operator() (std::string const & message) { std::cout << header_ << message << std::endl ; } } ; int main() { call_funcobj(func) ; FuncObj f1("message : "), f2("メッセージ:") ; call_funcobj(f1) ; call_funcobj(f2) ; }
メンバ関数を呼び出させることができるのも便利だと思っている。 class Window { // ... public: void SetTitle(const std::string&); // ... }; void f() { Window w; call_funcobj(boost::bind(&Window::SetTitle, w, _1)); }
312 :
デフォルトの名無しさん :2006/11/08(水) 02:59:48
ポインターからtypedefするにはどうすればいいのか どなたかお教えいただけないでしょうか struct sttest { typedef int myint; }; typedef sttest * psttest; typedef psttest->myint mymyint; こんな感じのtypedefをしたいのですが構文エラーe2143などとなって コンパイルできません
>>316 何がしたいんだ?
typedefは型を定義するものだよ
typedef sttest::myint mymyint; こういうことがやりたいのかな?
319 :
316 :2006/11/08(水) 19:16:52
したいことは psttestしか受け取れないclassの中でstruct sttest で定義した ypedefの情報をうけとりたいのです template<typename Ptr = psttest> class MyClass { typedef Ptr::myint mymyint; };
ESP の訓練をかねて
>>316 の思考を読んだ結果
typedef sttest::myint mymyint
がしたいんじゃないかと感じた。
321 :
316 :2006/11/08(水) 19:32:45
ポインターを渡すようにクラスMyClass を設計してしまったため ポインターが持ってるtypedefの情報を渡すことができなくなって しまったので、なんとか解決したい。というのがやりたいことです。
>>321 ポインタがtypedefの情報もってるって…何か壮大に勘違いしてないか?
>>316 がしたい事は別の構文で書くと、
typedef a+b c と同じような事だと思った。
template<typename T> struct RemovePointer { typedef typename T::myint type; }; template<typename T> struct RemovePointer<T*> { typedef typename T::myint type; }; typedef RemovePointer<psttest>::type mymyint;
なるほど、ポインタ型で特殊化するわけか・・・
326 :
316 :2006/11/08(水) 20:11:52
vector<vector<double>* > v; vectorに値を格納していって、 for(int i = 0; i < n; i++){ for(int j = 0; j < x; j++) cout << (*v[i])[j] << endl; } で表示するんですけど、 (*v[i])[j] ってどういう意味なんでしょうか? 不勉強で申し訳ないのですが、ご教授をお願いできないでしょうか?
>>327 v の i 番目 (0から数える。以下も同様) に入っているポインタが指す先にある
vector<double>型のインスタンスの、j番目の要素への参照。
>>327 おかしくないか?
*v[i][j]だと思うが。
すまん vector<double*>と勘違いしてた。
>>328 ありがとうございます!
助かりました!
>>329 参考書をそのまま写したんですが、
おっしゃる通りにやってみたところ、
エラーになりました。
はい。勉強になりました。
316よりましだけどな。
template も知ってるようだし、「何かやり方があるんじゃないか」と 感づくあたりだけ 316 の方がましだと思う。 文法めちゃくちゃでも一応コンパイルしてみる勇気も買うw 「ポインター」じゃなくて「ポインター型」と書いていればもっと良かったけど。
関数ポインタより効率いいっていうけど嘘じゃね? どうアセンブラのコードとにらめっこしても そんなコードはいてねぇよ
って関数オブジェクトのことな
>>336 template<typename Function> void call(Function f) { f(); }
Function が関数ポインタなら、おそらくインライン展開は行われない。
Function が関数オブジェクトなら、普通にインライン展開の対象になる。
質問です。 クラステンプレートの中にメンバ関数テンプレートがあります。 template< typename T > class MyClass { public: template< typename U > void f( const U& u ); }; この関数f()をクラスの宣言外で定義する書き方が分かりません。 どなたか分かる方がいらっしゃればご教示願います。 以上、宜しくお願いいたします。
template< typename T > template< typename U > void MyClass<T>::f( const U& u ) { ... }
ModernC++Design読んで満足してた俺はだめだなぁ・・・ これが思考停止ってやつですかorz NTPすげー
struct B{ typedef int H; }; struct D1 :public B {}; struct D2 :public B {}; class DD1 :public D1, public D2{}; int main(){ printf( "%d\n", sizeof( DD1::H ) ); return 0; } これコンパイル通ったんだが、 typedefの場合はメソッドとかと違って曖昧無しにコンパイラが解決してくれるの?
>>345 D1::H と D2::H が同じものを指すので、 DD1::H という名前の検索自体は問題ない。
曖昧な基底クラスでエラーになるのは、そっから先の使い方によるらしい。
(4.11-2, 5.2.5-5)
347 :
デフォルトの名無しさん :2006/11/09(木) 11:06:22
>>345 その場合、関数だと曖昧だけどtypedefの場合は大丈夫らしい
NTPの場合は仮想継承を使って基底クラスのtypedefしたものをoverrideしてる。
class B; // typedef int H;
class D1 :virtual public B; //typedef char H;
class D2 :virtual public B; //なにもしない
class DD1 :public D1, D2;
で、DD1::Hはcharになる。
ただの継承だとHは名前解決失敗するっぽい
名前解決は複雑だなー、、、
>>338 この程度の単純なコールバックだと,コンパイル時評価可能な
関数ポインタ値ならインライン展開しうるコンパイラもあります. MSVC とか.
コード晒してから言え
角度とか.
ぶっちゃけ、boostの使い方を勉強する方がいいと思った > 複雑なtemplateテクニックを書くより
>>348 わかんねー(´д`;
<_>とか、boost::mplがわからんです。
というかboost使ったことない・・・
>>354 とりあえずlambdaだけ使って味噌。
笑うくらいスッゲェーとか思うから。
後は興味が354を導くはず
>>354 ref_counted<_> は、lambda の _1 と同じく引数のプレイスホルダで、
この場合 T に展開される。
>>348 の smart_ptr< T, ref_counted<_> > は、コンパイル時に以下のように
書くのと同じ効果がある。
smart_ptr< T, ref_counted<T> >
lambda って使うと実行ファイルのサイズがすげー事にならない?
#pragma includepath ってVS2005では使えないのでしょうか? 何かコード中でincludepathを設定する方法はないのでしょうか
>>359 インクルードするときにフルパスで書けばいいんでね?
例えば #include "/usr/include/stdio.h"とか。
つーか、スレ違いだがね。
あのさー Cの構造体をC++のクラスにラップしたいんだけど typedef stract a struct a *next; ... }A; こんなかんじでnextで別のポインタ参照するような構造体を ラップするときってどうしてる?
>>361 こんなかんじ、といっても文法めちゃくちゃで何をしたいのか分からない。
構造体をクラスでラップするとはどういう意味?
とりあえず落ち着いて話せ。
typedef stract a{ struct a *next; ... }A;; こんなのだよこんなの、
意味がわからにあ
class A { A* next; .. }; ってことか?
>>363 これだけだと、どういうパターンを適用するのか判断が難しいなぁ。
単純なラップじゃなくなるけど、
自分ならstd::list + std::list::iteratorみたいに巡回と管理のクラスの二つにわけるかな。
>>366 ふむふむそっかぁ、同じデータ構造なんだけど
全然別々の名前のリスト状のデータ構造があって
ベタにCのデータ構造操作する部分記述したくないんだけど
やっぱそうやるしかないかぁ
掲示板をまるで会話のように使うとは。 言葉のニュアンスも読む人間の考えに任せるしかないのにそれは酷いだろう。 言葉を改めろよ。
朝鮮人に何を言っても無駄。 自分の事しか考えてないんだから。
テンプレートクラスに関する質問です。 template <class T> class Sample { public: Sample(const T& t) : m_t(t){} private: T m_t; }; みたいな事をやったとき、class Tには何でも指定できてしまいますが、 このclass Tをあるクラスのサブクラスのみに指定したいのです。 どうしたら、いいのでしょうか? 環境は vs2005 WinXPPro,SP2です。
template <typename T> class Sample { BOOST_STATIC_ASSERT(boost::is_base_and_derived<あるクラス, T>::value); public: Sample(const T& t) : m_t(t){} private: T m_t; };
>>370 特殊化すればいいだけなんじゃないの?
本に書いてあることだよ?
子供が全部public継承してるなら、テンプレートじゃなくて基本クラス要求すればいいんじゃない?
374 :
370 :2006/11/11(土) 01:24:25
is_base_and_derivedでぐぐったら、それらしい情報が出てきました。 どうもありがとうございます。
オペレータをオーバーロードして、 クラスAのポインタでクラスの中身(int t)を比較したいんですが、 bool operator< (A *a) const{ return (t < a->t); } bool operator> (A *a) const { return (t > a->t); } とクラスに書いてやって、 A *a1 = new A; A *a2 = new A; a1->t = 2; a2->t = 1; これで、a1 > a2 をしても真にならないのですが、どこか間違ってますでしょうか?
>>375 ポインタ同士の比較は配列の要素間の前後関係という意味になる。オーバーロードはできない。
そのオーバーロードの宣言は *a1 > a2 としたときに使われる。
struct A { int t; bool operator<(const A& a) const{ return (t < a.t); } bool operator>(const A& a) const { return (t > a.t); } }; int main() { A* a1 = new A; A* a2 = new A; a1->t = 2; a2->t = 1; std::cout << std::boolalpha << (*a1 > *a2) << std::endl; }
378 :
375 :2006/11/11(土) 05:04:06
>>376 ,377 なるほど、ありがとうございます。
ちなみに
priority_queue<A*, vector<A*, allocator<A*> >, greater<A*> >
にAをtの昇順に入れてやろうと思ったのですが、
おそらくそれが原因で上手くソート出来ませんでした。
うまい解決策はありませんでしょうか。
>>378 greater<A*> を専用の比較関数で置きかえれ。
381 :
デフォルトの名無しさん :2006/11/11(土) 09:26:35
class 内の関数のアドレスを取る事が出来ないのはなぜでしょうか。 class CTest { public: void func(){ }; } int main() { CTest t; cout << &(t.func) << endl; // エラー cout << (CTest::func) << endl; // 問題ないが、必ず値が1となる }
cout << &(CTest::func) << endl; // 問題ないが、必ず値が1となる アンドが抜けてました失礼。
static void func()アドレスをとるようになってるから。
相談です。 VC2005EEにてビルドしたらこのようなエラー構文が出ました。 対処方法を教えてください。 ※○○はわしの名前 c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2653: ' MessageBox' : 識別子がクラス名でも名前空間名でもありません。 c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2664: 'void System::Windows::Forms::Form::Show(System::Windows::Forms::IWin32Window ^)' : 1 番目の引数を 'System::String ^' から 'System::Windows::Forms::IWin32Window ^' に変換できません。
全 角 空 白 編集⇒詳細⇒スペースの表示
iteratorって使い方は解るのですが、自分の作るクラスに 定義する場合どのように定義すればよいのでしょうか?
>>382 &(CTest::func) じゃなくて &CTest::func じゃないと駄目らしいぜ。 (5.3.1 -3-)
>>382 アンドって書くと条件式の論理関になるから、記号の&単体はアンパサンドと表記するのが正しかったような
>>386 規格の 24.1 にある要件を満たすような型として定義する。
わりと面倒なんだけど boost の iterator ライブラリを使うと楽が出来る。
>>380
>>381 ストリームに対するoperator<<に void (CTest::func*)() を取るものがないので
暗黙の型変換でboolのやつが呼ばれてるんだろ。
>>385 どうもすいません
それしたあと、再度ビルドしたんですがまた同じエラー構文が出ました。
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2653: ' MessageBox' : 識別子がクラス名でも名前空間名でもありません。
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2664: 'void System::Windows::Forms::Form::Show(System::Windows::Forms::IWin32Window ^)' :
1 番目の引数を 'System::String ^' から 'System::Windows::Forms::IWin32Window ^' に変換できません。(新しい機能 ; ヘルプを参照)
使用可能なユーザー定義された変換演算子がない、または
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
>>393 表示設定を変えただけなんだから、その後にソース見て修正しないと駄目に決まってるだろ。
>>393 同じエラーなら貼らんでいい。総じて、脳みそが足りてないんじゃないか?
いや、構文見たらちゃんと半角スペースなってますよぉ
なってないからエラーが出てるんだ
98行目をもう一回書きなおせ もう来るな 氏ねカス
MessageBox::Show(textBox1->Text + "さん、こんにちは。"); この構文です。 どう見ても半角ですよぉ・・・ 「さん、こんにちは。」は全角ですけど本に沿ってんですよぉ・・・
全 角 「空 白」 ~~~~~~~~~~ 空 白 空 白 空 白 ほんとに >> 385 をやったのか?
やりましたよぉ・・・ そうしたらソースコードのところに→マークがいっぱいでます これをどうすんです・・・
>>400 "さん、こんにちは。"を試しに"xxx"でやってみたら通る?
ダメです・・・
「わし」とか「よぉ・・・」とかキモ過ぎ。おまけにバカときた。消えてくれ。
いやいい加減に出来とかんといかんのですよ 頼みますよマジで
もういいや。MessageBox の前に全角スペースがあるだろ。それを半角スペースに直せ。 いっそその行消してもっかい全部書き直せ。
答えが見つからないととりあえず質問者を叩く、と。
>>404 じゃあ
MessageBox::Show("xxx");
では?
どうやら出来たようです。 みんなありがとございましたぁ・・
>>407 指摘のMessageBOXの前の空白が全角だったのが原因でした・・・ぁ
4時間も前から正解でてたのにな・・・
>>412 氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね
もうくんなもうくんなもうくんなもうくんなもうくんなもうくんなもうくんなもうくんな
とほほ・・・ほ
322 名前:デフォルトの名無しさん[sage] 投稿日:2006/11/11(土) 11:08:59
相談です。
VC++2005EEにてビルドしたらこのようなエラー構文が出ました。
対処方法を教えてください。
※○○はわしの名前
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2653: ' MessageBox' : 識別子がクラス名でも名前空間名でもありません。
c:\documents and settings\○○\my documents\visual studio 2005\projects\hello\hello\Form1.h(98) : error C2664: 'void System::Windows::Forms::Form::Show(System::Windows::Forms::IWin32Window ^)' :
1 番目の引数を 'System::String ^' から 'System::Windows::Forms::IWin32Window ^' に変換できません。
323 名前:デフォルトの名無しさん[sage] 投稿日:2006/11/11(土) 11:20:55
>>322 全角スペースを半角に置換する
325 名前:デフォルトの名無しさん[sage] 投稿日:2006/11/11(土) 11:25:34
すいません、なるべく煽らんで下さい
>>417 おもしろいです。このスレにいて本当に良かったと思える一日でした
俺じゃねえ
エラー読めないヤツって生きてる価値ないよね。
「教えられたことを咀嚼する気は全然無いですが、わかるまで教えてください」 って言ってるようなもんだからな。
まるで朝鮮人のような奴だな。
こんなのが職場に居たらやってられんな
質問してくれるだけいい 質問にすら来ないでわからないことをほったらかしにするやつのほうがやばい
五十歩百歩だと思うが。
どっちが五十歩でどっちが百歩だ?
そんなことはどっちでもよいからこそ五十歩百歩と言うのだ。
それでは曖昧性があります。 コンパイルエラーです。
429 :
427 :2006/11/11(土) 21:23:26
i|!| |i┏┓! i!┏┳┓| |||i|!i| ||!i|| |||ii| ||| ||| |i||!|i│i!┏┓i!| |i|┏┛┗━╋┻┛|i!||!|ii|| i|!i||i|┏━┓ ┏┓i|i| i┃┃i!| i||┗┓┏┓┃||i┏━━━━┓┗━┛ ┃┃|i||!i┃┃i!| |i |!|i┃┃┃┃i||┗━━━━┛|i|| || ||||!┃┃i|i| i┗┛!i| i||i ||┃┃┃┃|! |||i ||i !|||!|┏━━┛┃|i||!i┏┓i|! |i!i |!┗┛┗┛i|!i| / | / | ┗━━━┛i|i| i┗┛i!| i| |||i|!i| ||!|i||i! /,_ ┴─/ ヽ |!i| ||| |i||!|i|i|||| ||i |i|| ||i!i|| (_゜.,》.'(_゜,》)ミ ヽ ! | |!i||!|ii||!|ii| i|ii / ,,__,ニ、、 ノ( | i|i!|i| |i | Y~~/~y} `, ~ | そ、そんなー… |i !. | ,k.,.,!,.,.,r| ,! く | i / <ニニニ'ノ \ l
くだらないAA張ってうけるとでも思ってるのか
初盆(´・ω・`)
さっきのコンパイルエラー出て助けてくれってやつLinux板にも マ板にも書き込んでるんだな
親切な奴多いよな いちいちバカに答えてるの。 (軽蔑の意味じゃなくて)普通にすばらしいと思う
なぜかム板は律儀でもあるけど、ネタに対して攻撃的な反応が多いのが(´・ω・`) ところで > System::Windows::Forms:: ってC#じゃないの C++/CLIとか?
^演算子(GC管理のリソースを指すポインタ)が使われているから C++/CLIだろう。 それにC#だったらSystem.Windows.Formsって書くし
そか、サンクス .net触ったことないからわからんかった
>>435 プログラマってのは偏屈でプライドが高いから
答えてやってるっていう意識が強いんだろう。
まぁ本来それが正しい姿勢だと思うがね
439 :
デフォルトの名無しさん :2006/11/12(日) 11:10:08
C++で引数に参照渡しを行う場合って 呼び出し元の変数を弄るとき以外に場合はある?
コピーさせずに関数に引き渡す場合とか。 constくっつけて変更防止させたりして。
string はだいたい、const string& として渡してるな 計測はしてないから、どの程度効果があるか分からんが
>>439 コピーコンストラクタとかの処理が重たいクラスは、
積極的に参照渡しにしたほうがよさげ。
>>439 俺は呼び出し側で引数を弄りたい場合はポインタ、
弄らなくてもいいけどコピーさせたくない場合はconst参照にしてる。
弄りたい場合も参照渡ししてる。 NULL渡す場合があるならポインタ。
関数が投げる例外を指定する下の例のようなthrowは void func() throw(); 宣言だけに付ければいいのでしょうか? それとも実装の方にも付けなければいけないのでしょうか?
>>445 それって「私は例外投げませんよ」って指定じゃなかった?
>>446 そんなことは分かったうえでの質問だろう。たぶん。
それはわかってます。 お尋ねしたいのは、それを宣言に付けさえすれば良いのか、定義の方にも 付けねばならないのかということです。
>>447 訊く前に実験実験。
struct hoge{
void payo()throw();
};
//void hoge::payo()throw(){}
void hoge::payo(){}
//error: declaration of `void hoge::payo()' throws different exceptions
実験しても環境依存やコンパイラのバグの可能性があるので 仕様そのものを知りたいなあと。 因みに、VC8だとそのコードが通ります。
そういう時俺は持ってるコンパイラ全部で通してみるけど。 vcとg++とbcc。 時間があるなら標準規格読む。
#include <windows.h> class Coordinate{ public: Coordinate(void): x(coo.X) , y(coo.Y) {} short& x; short& y; COORD coo; }; class Recta{ public: Recta(void): t(rec.top) , b(rec.bottom), l(rec.left) , r(rec.right) {} long& t; long& b; long& l; long& r; RECT rec; }; Coordinate C( int x , int y ){ Coordinate c; c.x = x; c.y = y; return c; } Recta R( Coordinate c1 , Coordinate c2 ){ Recta r; r.l = c1.x; r.t = c1.y; r.r = c2.x; r.b = c2.y; return r; }
454 :
続き :2006/11/12(日) 22:39:33
>>453 void main(){
Recta r = R( C( 1, 1 ) , C( 10 , 10 ) );
}
環境:VisualStudio.net 2002
やろうとしてること・・・
1. Windows組み込みのCOORDやRECTを、COORDやRECTとして使えるように維持しつつ機能を拡張する
(サンプルなので余計なメンバ関数は省いてますが)
2. COORD.X とかを小文字のxでアクセスできるように参照変数を付ける
3. (mainでは)頂点を二つ指定して正方形を作る
上のソースを実行すると、四角形の頂点の値が滅茶苦茶な値になっています
(初期化されてない値っぽい?)
1ステップずつ実行すると、どうやらC関数で座標を作るところまではできていて
Cの戻り値でR関数を実行する時点でおかしくなっているようなのですが
どうしてそうなるのかが判りませんです・・・
どこか根本的に無理なことをしようとしてるのでしょうか
>>454 デフォルトのコピーコンストラクタが参照の初期化に
コピー元への参照を使ってしまうから、コピー元が
破棄されることによって不正な参照が残ってしまう。
MFCのCRectのソースでも見れ
レスありがとうございます。 コピーコンストラクタって今まであまり意識していなかったのですが 今回、参照の指す先がおかしいということでしたので Coordinate( const Coordinate& C ) :x(this->coo.X) ,y(this->coo.Y) { this->coo = C.coo; } というコピーコンストラクタを明記してみたら、意図していた通りに動くようになりました
継承すればいいのに。
MFCからですか?
>>452 それによると例外指定は関数型の一部にならないってあるから
throw()は宣言にだけ付けときゃ良いわけですね。
>460 でも、throw指定するのは(nothrow指定含めて)時代遅れだと なんかで読んだ気がする。
むむ。 nothrowだけは例外的に使うべきだと思ってきたが。(除テンプレート内)
nothrowとthrow()は無関係かと・・・・。 nothrowは時代遅れ。
>>457 >2. COORD.X とかを小文字のxでアクセスできるように参照変数を付ける
これをする理由がわからん。
参照を返すアクセサを用意するだけでいいような希ガス。
nothrowとかthrowは、constみたいにコンパイル時に禁止できる訳じゃなくて、 try { hoge() } catch(Hoge){throw;} catch( ... ){ unexpected(); } みたいなコードを自動生成するだけだら、使えネーって話だな。
Boostによればthrow()は全然最適化に役立ってないらしいがなw
結局thorw()を付けるのと付けないのとでは、どっちがいいんだ? 俺は今まで、デストラクタには必ず付けていたが。
>>470 つけなくていいんじゃない?
Boostも例外指定はしないで決定してるみたいだし
Binary Hacksになんかこの手のが書いてあったな。
Herb Sutter は More Exceptional C++ Item 19 で 「throw() を付けるかどうかは好みの問題だけど、 個人的には /* throw() */ とコメントで書いておくのが好き」 と言ってるな
#if defined(ENABLE_EXCSPEC) #define NOTHROW throw() #endif
テンプレート使うライブラリはthow()とか書きようがないな
Herb Sutter は Exceptional C++ Style でも素敵なガイドラインを 書いてるね。なんとも含蓄があるよ。 教訓#1:例外仕様を決して書いてはならない。 教訓#2:空の例外仕様は除くが、私があなたなら、それさえも避けるだろう。
質問なんですが、 char型、string型でもいいのですが、 文字列から特定の文字だけを全部削除できる関数はあるんでしょうか? aaaabbbaaaabbbaaaaa ↓ aaaaaaaaaaaaa という風にです。
remove_if()とerase()を組み合わせれば出来る #include <iostream> #include <string> #include <algorithm> #include <functional> int main() { std::string s = "aaaabbbaaaabbbaaaaa"; std::cout << s << std::endl; s.erase(std::remove_if(s.begin(), s.end(), std::bind2nd(std::equal_to<char>(), 'b')), s.end()); std::cout << s << std::endl; }
std::bind_2nd〜の部分を別に関数オブジェクトに持てば、もっと 複雑な削除条件も簡単に書ける。 boost::bindで何としても一行で済まそうという傾向もありますが
482 :
478 :2006/11/17(金) 10:59:03
ありがとうございました☆ 解決しました
>>481 #include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void main()
{
string s = "aaaabbbaaaabbbaaaaa";
remove(s.begin(), s.end(), 'b');
cout << s << endl;
}
結果:aaaaaaaaaaaabaaa
remove()だけだと削除しきれない。
何故。
戻り値型がvoidのmain関数なんて規格には無い
はいはい規格規格
まあmainは一箇所だけ直せばいいからなw
悪い。483です。void main()は完全なる間違いです。すみません。はい。
と思ったら私のはちゃんとint main()になってたか・・・・void mainは別人ですた。 remove()でもいいですね。remove_if()をわざわざ使ったのは、例えば 'b'が2回現れた後は'c'も削除せよ、というような場合に便利ですね。 今回はremove()だけでいいみたいです。
何行かの改行されたファイルを文字数を指定して、 文字列を取り出していきたいんですけど、どうしたらいいでしょうか?
>>492 無視する文字は改行文字だけ?ホワイトスペース文字全般?
改行だけの方法と、 ホワイトスペースも無視する方法のふたつをお願いします。
>>494 #include <iostream>
#include <fstream>
#include <string>
int getsome(std::ifstream& fs, std::string& s, int n);
int getwows(std::ifstream& fs, std::string& s, int n);
int main()
{
std::ifstream fs("ws.txt");
std::string s;
int n = getsome(fs, s, 10); // 改行文字のみを無視
std::cout << n << "文字: \'" << s << '\'' << std::endl;
fs.seekg(0, std::ios::beg);
s = "";
n = getwows(fs, s, 10); // ホワイトスペース文字を無視
std::cout << n << "文字: \'" << s << '\'' << std::endl;
}
int getsome(std::ifstream& fs, std::string& s, int n)
{
char c;
int i = 0;
while (i < n && fs.get(c))
if (c != '\n') {
s += c;
i++;
} return i; } int getwows(std::ifstream& fs, std::string& s, int n) { char c; int i = 0; while (i < n && fs >> std::ws >> c) { s += c; i++; } return i; } getsome()が改行文字のみを無視、getwows()はホワイトスペース文字を 全て無視します。
なおテストに使ったファイルの内容は ---- ws.txt ---- 1234 56 78 90 [EOF]
ありゃ
>>497 には所々文字列の前に' 'とかタブ文字を入れて見て下さい。
499 :
494 :2006/11/17(金) 17:29:05
なるほど。get()を使うんですか! 問題を解決する事ができました! ありがとうございます!
void main(void){return;}
main(argc,argv)char**argv;{return 0;}
502 :
デフォルトの名無しさん :2006/11/18(土) 00:03:24
char* main(argc,argv)char**argv;{return argv[0];}
public static void main(string[] hoge)
int main[] = { -61 };
class m { public: virtual int main( int argc, char **argv ); };
クラスaをmain.cppから分離したいとき、 ヘッダファイルa.hひとつで class a{ void hoge(){ return 0; } }; という感じで定義も記述して、a.cppファイルを作らないのってよくないんでしょうか? 修正があったときhファイルとcppファイルをいじらなきゃならないのが嫌なので…。 今ぶちあたってる問題として、お互いのstaticなメンバ関数を お互いが使うような二つのクラスがあるときは宣言と定義を分けないとどうしようもないようなのですが。
>>506 ヘッダファイルには宣言だけ
cppに定義部を書く
俺は面倒だから大体ヘッダファイルに書いてしまうな。 やはりコンパイル時間は遅くなりそうだが。 ちなみにテンプレートを使ってるとヘッダファイルしか使えないよな。
毎日コンパイルしてテストしろ という時代だからな boostがちょろっと更新されるだけで pimplパターンなんて水の泡だ やるだけ無駄
>>508 コンパイル時間より、コードの肥大化の方を心配した方がいい
>>508 C++的にはexportつかえばヘッダに書かなくても大丈夫だよ!
>>511 ちゃんと使えるコンパイラってどれがあるの?
糞VCはサポートしていないね。
exportって一部のコンパイラしかサポートしてないって聞くけど、 実際のところサポートしてるコンパイラって何てやつ?
Comeauはフロントエンドだけだがお値段が$50、ただし製品ページのjavascriptがウザ過ぎる。 Borlandのってどう?
exception C++ Style読んだら分かるけど、 exportがあっても何も解決しないっぽいよ。
まじすか
その辺りはD言語では改善されてるのかな。 次期C++ではどうなの?
>>514 寡聞にして知らん。
糞GCCもずっと長いことサポートしてなかったと思うが、4.0系移行はサポートしたのか?
そういや時期BCCはexportサポートするとかしないとか言ってた気がするが、結局どうなったんだっけ
何にせよ宣言と定義で二回書かなきゃならないめんどくささはなんとかならんもんだろーか? c#だと楽だよね
>>522 UMLソフトでクラスしこしこ作ればそのへんは
骨だけは作ってくれるぞ
そこで全部ヘッダにぶちまけですよ
インターフェースクラスだけをヘッダに書いて、それを継承する実装クラスはcppにベタ書きとか結構やる。
それだとその実装クラスを他のソースで使えない?
実装へのポインタをインターフェースへのポインタとして晒していれば使わなくていい。
template<class T> class MYCLASS { ... }; こういうクラスがあって、実体化するときに以下の用に書きますがが、 MYCLASS<A> myclassA; MYCLASS<B> myclassB; こうかける方法を教えてほしいです。 MYCLASS myclassA; MYCLASS myclassB; このときTは、それぞれA, Bに死体です。
529 :
528 :2006/11/19(日) 09:57:35
すいません。間違いました。もう一回最初から書きます。 template <typename T> class MYCLASS { T* a; MYCLASS(T* t) : a(t) {} }; こういうクラスがあって、実体化するとき以下のように書きますが、 A a; MYCLASS<A> my1(&a); B b; MYCLASS<B> my2(&b); 以下のように書きたいです。 A a; MYCLASS my1(&a); B b; MYCLASS my2(&b); このときTは、それぞれA, Bに死体です。
そうですか。
class MYCLASS { boost::any a; template<typename T> MYCLASS(T* t) : a(t) {} };
532 :
528 :2006/11/19(日) 10:19:01
>531 ありがとう、boostインストールしてきます。
533 :
528 :2006/11/19(日) 12:37:45
boostインストールして、531を試したんですが、 デストラクタでTが使えないってエラーがでるんですが、 これは無理なんでしょうか? class MYCLASS { boost::any a; template<class T> MYCLASS(T* t) : a(t) {} template<class T> ~MYCLASS() { cout << sizeof(T); } }
>>533 無理。 T を決める方法が無い。
何がしたいんだ?
535 :
528 :2006/11/19(日) 14:29:55
MYCLASSのデストラクタでTのデストラクタを呼びたいです。
537 :
528 :2006/11/19(日) 14:44:10
呼ばれないと思います。コンストラクタで渡してるのは T*なので
これでどうかね? template<class T> MYCLASS(T* t) : a(*t) {}
539 :
528 :2006/11/19(日) 15:02:46
それで呼ばれるデストラクタはコピーされたTだと思いますが、 元々渡されたtのデストラクタを呼んで解放したいです。 529の例がスタック上のインスタンスになってるんですが、 実際はこういう風には使わないで、newしたものを渡します。
class MYCLASS { boost::shared_ptr< void > p; public: template<class T> MYCLASS(T* t) : p(t) {} }; 型が消えてるから MYCLASS 内で有用な仕事ができないとは思うけれど
>>539 デストラクタじゃなくて呼ぶのdeleteじゃね?
とりあえずスマートポインタだと無駄に重装備っぽいので関数ポインタ使ってみた
class MYCLASS{
MYCLASS(const MYCLASS&);
MYCLASS&operator=(const MYCLASS&);
void*ptr;
void(*delfn)(void*);
public:
template<class T>MYCLASS(T* t) : ptr(t),delfn(deleter<T>){}
~MYCLASS(){delfn(ptr);}
};
542 :
541 :2006/11/19(日) 15:10:46
おっと忘れてたこれも宣言する template<typename T> static void deleter(void*p){delete (T*)p;}
543 :
528 :2006/11/19(日) 15:19:31
>>540-542 ありがとうございます。難しそうなのでじっくり調べてみます。
>デストラクタじゃなくて呼ぶのdeleteじゃね?
そうですdeleteです。わかりずらくてすいません。
bbbの関数がaaaの動的なメンバにアクセスするにはどうすれば良いんですか。 class aaa{ int v; class bbb{ void func(int x){ v+=x; //コンパイルエラー } }b; };
GCCのトランポリンじゃないんだから。 #include <iostream> using namespace std; class aaa { int v; class bbb { int& v; public: bbb(int& w) : v(w) {} void func(int x) { v += x; } } b; public: aaa(int init=0) : v(init),b(v) {} int get_v(int e) { b.func(e); return v; }; }; int main(void) { aaa uho; cout << uho.get_v(12) << endl; cout << uho.get_v(2) << endl; return 0; }
どっかでみたなこれ ((aaa*)(reinterpret_cast<volatile char*>(this) - offsetof(aaa,b)))->v += x;
>>549 iie douitasi masite
一度アップキャストした型を 確実に型情報が解っているときはどのキャストで戻すべきなのですか?
static_cast
>>550 static_cast で一応可能。でも不正な関係のポインタを渡して死ぬのは
プログラマの責任。 dynamic_cast なら実行時にチェックが行われる。
そこでboost::polymorphic_downcastですよ。
boost紹介する奴はどんな機能があるのか説明してほしい
boost厨は好きだよ 俺もboost厨だから。 ただ boost;;XXX使え とかで終わる発言は投げっぱなし感が強くて嫌だわ
何も知らない自分に手厚い説明をつけてくれない奴には 痛い・うざい・キモイのレッテルを貼らないと気が済まないよね。 自助努力なんて要求してくる奴は人として許せないよね。
ていうかね、「次期標準候補」と「標準」では、雲泥の差があるのよ。 どこまで取り込まれるかもわからないし、 標準で規定されたわけじゃないから、仕様の変更も充分にありうるわけ。 (仕様も改定される可能性があるけどね) 例えば、POSIXで標準化されていても、C++の標準に含まれないものは このスレでは範囲外としているでしょ。 もちろんアドバイス的なことは出来ても ディレクトリの一覧なんかは、「標準C++では出来ない」が答えだし。 そういうのを、「標準じゃないけど」等の前置きなしに 当然のように書き込むから、嫌がる人が居るのよ。
過去ログを boost で grep してから言え。
>>560 お前だけ全然切り口が違うな。
「boost::XXX使え」が「標準じゃないけどboost::XXX使え」に変わっても
>>553 や
>>557 は何も満足しないだろうし。
>>553 や
>>557 は単に、自助努力を強いられてムカついちゃってるボクちゃん。
>>553 はただのスレ違い雑談だろ。そこからこんだけ荒れてんだから
テンプレに「荒れるからboostの話題禁止」って入れてもいいと思うんだが
まぁ誰も賛成しないよな
popenのような関数C++にはないですか? popenが必要な時にはCのioを使わなければなりませんか?
なんか見覚えがあるな。
566 :
初心者 :2006/11/20(月) 21:53:10
C++でハッキングを作るにはどうすればよいですか? 注:私の質問に対して煽りで返す不届き者がいるようですが、 そのような方は発言するだけ無駄ですのでお黙り下さい。 ちなみに私の友達には2ch管理者さえも畏れるハッカーがおり、 あまりにも礼を欠く発言に対してはそれ相応の「処置」をとらせていただくことを ご承知下さい。なお、質問に対して有意義な答えを下さった方には 感謝します。
>>566 きみの友達の方が詳しいからそっちに聞いた方が良いと思うよ。
あれ?いまって秋だよね?まだ冬休みじゃないよね? あれ夏休みでもないしなぁうーん異常気象で頭がおかしくなったんかな
プログラミングでいう「ハック」とは、「いかに少ない時間で巧妙に作るか」である。 再帰やSTL勉強しなさい。
570 :
初心者 :2006/11/20(月) 22:01:10
>>567 やはり自力でやらなければ意味がないのでここで質問しました。
出来ればもっと有意義なレスを期待します。
>>568 現れましたね、私が質問しているのに関係ない雑談を始める人が。
私は心が広いので寛容な心で許容しますが、今後このようなことが
あった場合当方では責任を負えませんのでご了承お願いします。
本当にネジどっかいっちゃた人が迷い込んできたなw さてさてどうなることやらw
ハッキングは動詞です><
>>570 おめぇにはVip板がお似合いじゃ
さっさと消えろ
575 :
初心者 :2006/11/20(月) 22:07:39
>>573 初心者と名乗っているのはあくまでも謙遜してのことであり、
そのスレッドは私の質問に対してはレベルが低すぎると判断して
このスレに書き込んだわけですが・・・
その辺を出来れば察してくれるとうれしいです。
>>574 VIP板はレベルが低いので私には合わないと思われます。
私のレベルはこのスレの平均よりやや上なので話が合うと思いこのスレに現れました。
ようするにかまってちゃんなんだw
577 :
初心者 :2006/11/20(月) 22:10:16
もういいです。 皆さんにはそれなりの制裁を下すのでそのつもりでいてください。
>>570 >自力でやらなければ意味がない
いや、だからこそ、その友達に色々聞いて自分でプログラム組めばいいんじゃない?
どのつもりよw
>>577 「制裁を下してもらう」の間違いだろwww
581 :
初心者 :2006/11/20(月) 22:13:19
ふざけないで下さい。 さっきは脅しのつもりでしたがもう容赦しません。
> やはり自力でやらなければ意味がないので 自力でやれよ
>>581 「ふざけないで下さい」と言っているわりには人に物を頼む態度じゃないね。
>>581 おまえズボン脱がしてトイレに頭突っ込むぞ?(笑
585 :
初心者 :2006/11/20(月) 22:16:40
ちなみに私はパケットを打ち出すスキルがあります。 インターネット上においてこのスキルがどういう意味を持つか、 多少なりとも知識のあるみなさんにはわかることでしょう。 ぜひ、賢明な判断をお願いいたします。
>>581 折角
>>578 が有意義なレスをしてくださっているのに、無視しましたね。
ふざけないで下さい。もういいです。
587 :
初心者 :2006/11/20(月) 22:17:11
これだから日本人は朝鮮民族の足元にも及ばないんです。 祖国にはあなた達のパソコンをハッキングする人が沢山居ます。覚悟していてください。
ああ、ウンコ民族だったかwww
ほかしときゃいいものを全くお前らときたら…
590 :
初心者 :2006/11/20(月) 22:18:39
ほかすって九州の方言?
久々に爆笑させてもらった。 まさか釣りだったとは。
なーんだやっぱり朝鮮人か
ニダ民か
>ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る
キューピー3分間ハッキング
愛用していたC++コンパイラに2時間と10分餌を与えないでいたら死んでしまいました。 どうすれば生き返るんでしょうか。
あきらめて新しいのもってこい。
599 :
564 :2006/11/20(月) 22:29:30
お願いします
#include <cstdio> でいいじゃん
#include <cstdio>
しゃーぷいんくるーどかくかっこしーえすてぃーでぃーあいおーかくかっことじ
603 :
557 :2006/11/20(月) 22:45:30
>>562 「標準だけじゃできないんだけど、boost::XXXならなんとかなるよ」的な回答なら気にしないけどなぁ。
>>558 も言ってるように投げっぱなし感の強い発言であり、且つ
>>560 も言ってるように標準でもないものをさも当然のように言うから引っかかる。
boostが標準なら「boost::XXX使え」でも全然気にならない。
はーいはーい しゅーりょー。 次の話題いこうぜ
>>564 popen()ということで、UNIX限定でいいのかな?
popen()すると、FILE *が返ってくる。
多くのC++ iostream library@UNIXでは、
FILE *を引数に取るコンストラクタが用意されているので、それを使えばいい。
int(file descriptor)を引数に取る物しかなければ、fileno()でFILE *→intすればいい。
で、詳しくはあなたの使っているUNIXのスレで聞いた方がいいな。 UNIX板か、Linux板の。
vectorで任意の要素のイテレーターを取得するにはどうすれば良いですか。
>>607 vector<...>::iterator i = hoge.begin();
advance(i, index);
確か、こんなんでできなかった?
荒しと不親切厨を切るのは構わないけど、boostとmetaprogrammingを 切るのは勘弁してくれ……
boostのコンポーネントで解決できる事ならそれが一番いいことが多いしな
>>611 だからそこからして意見が食い違ってんだって。
boost厨からしたらboostは事実上標準なのかもしれんが、
boost厨以外のヤツからしたらboostは標準でもなんでもないの。
え? boostって標準だろ?
614 :
612 :2006/11/21(火) 01:21:20
ちょっと言葉足らずだったような気がするので追記。 boost厨じゃないヤツからしたら標準でもないものをひとつやふたつの問題を 解決するためだけに導入するのは馬鹿げてることなの。
615 :
612 :2006/11/21(火) 01:23:02
>>613 `Д´)ノ だから標準じゃねーつってんだろうが!
一言「boost以外で」って入れればいいんじゃ?
boost に適切なコンポーネントがあるのに自作するほうが馬鹿げてるんじゃないの? なんかいいことあるのか?
まあ、そこまで詮索するこっちゃない
>適切なコンポーネントがあるのに自作するほうが馬鹿げてるんじゃないの? その点には別に異論はない。
>>617 仕事などでboostを導入できない環境というのもあるんじゃない?
何回やるんだこの話題。こっちでやんな。
boost専用スレがあるだろうが!
bootsスレもあるぞ!w
別にboostを否定することなかろうに。boost以外の方法も否定しないけど。 確かにboost以外NGとかいうboost厨は要らんな。
boostって一口に言っても巨大すぎで個々のコンポーネントの出来もピンキリ、 魅力的なコンポーネントが多いのは確かなので使い倒したくはあるも、 中にはアカデミックなばかりで実用性皆無な変態ハッタリコンポーネントなんかも 跳梁してたりするわけで、業務で使うには慎重になりたいところだが、 そうなると相応に現在の実装状況その他boost内部事情に詳しくならねばならず、 そんな暇あったら仕事しろやゴルァと怒られることしきり まー、あれだよ。 時間のあるスキモノの人は、気の乗った範囲で構わんので 知識を還元してくれると、ちょっぴり嬉しいですよ。 ウザがられない程度に。
Boostというものでハッキングをしたいのですがどのリンカでコンパイルすればいいのでしょうか? 注:私の質問に対して煽りで返す不届き者がいるようですが、 そのような方は発言するだけ無駄ですのでお黙り下さい。 ちなみに私の友達には2ch管理者さえも畏れるハッカーがおり、 あまりにも礼を欠く発言に対してはそれ相応の「処置」をとらせていただくことを ご承知下さい。なお、質問に対して有意義な答えを下さった方には 感謝します。
>リンカでコンパイル うん。確かに不可能だw
>>628 BoostするにはPanstが必要だ。
boost禁止にしても、boost全面OKにしても荒れるのは荒れるだろうし、
個々の局面で適切な答えかどうか判断するしかないんじゃないの?
>>625 のいうようにboostの中にはトンデモなやつから、
滅茶便利なものまであるからさ。
解答者が「標準で」と限定している場合は除いて、
boostならこういう風に簡単に解決できるというレスがあるのは、
質問者にもスレ住民にも有益だと思う。
「標準で」と限定している場合でも、
boostはこういう風に標準の上に実装しているというのを示すのは有意義だと思う。
boostは単に便利なだけじゃなくて、ソースを見て勉強するのにも使えるわけだし。
ただ、教科書を渡して「これ見て一人で勉強して」と言い放つようなレスばっかりだと見ている側としてもつまんないよね。
結局
>>554 >>557 の言うように紹介の仕方が不味いということなんだと思うんだけど、どうよ。
>>633 >「これ見て一人で勉強して」と言い放つようなレスばっかり
そんなレスどこにもないぞ
>>633 同じコンポーネント紹介するのにいちいち解説書き込んでたら
おんなじレス繰り返すことになるのがわからんのかね?
公式のドキュメントのほうが詳細で正確なんだし、読むために特別なコストが
かかるわけでもない。コンポーネントの名前を落としてさえ行けば十分だろ。
1行レスするから議論になる。 議論したいなら別だが、そうでないなら少し工夫するだけでいいだろ。 と思ったが、>553で充分ジャマイカ。それ以上何が要るんだ?
638 :
初心者 :2006/11/21(火) 11:26:59
分不相応な人がレスを返してるのが原因ではないでしょうか? 質問する人、答える人が双方高度な意識を持ち、有意義な質疑応答 をすることが必要だと考えます。そのための啓蒙文をVer2 にアップグレードしました。今後は各自の発言の最後にコピーアンドペスート することが要求されます。 以下、啓蒙文Ver2.0 注:有意義な質問に対して煽り、1行レスで返す方が多いようですが、 そのような方は発言するだけ無駄ですのでお黙り下さい。 また質問者に対するあまりにも儀礼を欠いた回答レスもお断りいたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、質問に対して有意義な答えを下さった方には ちゃんと評価しますので安心しましょう。
初心者は初心者スレへどうぞ。
>今後は各自の発言の最後にコピーアンドペスートすることが要求されます。 誰が誰に要求されてるんだろう? >質問に対して有意義な答えを下さった方にはちゃんと評価しますので安心しましょう。 なんで質問してる方が偉そうなんだよ。 「初心者」ってのは「(日本語の使い方が)初心者」ってことなんだろうな。
>639 だ〜か〜ら〜 1行レスで 返すなって 言ってん だろうが! ↓これも付けてね 以下、啓蒙文Ver2.0 注:有意義な質問に対して煽り、1行レスで返す方が多いようですが、 そのような方は発言するだけ無駄ですのでお黙り下さい。 また質問者に対するあまりにも儀礼を欠いた回答レスもお断りいたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、質問に対して有意義な答えを下さった方には ちゃんと評価しますので安心しましょう。
>レスで返す 馬から落馬すると同レベルだなw
無駄に煽るな。スルーしる。
boostを薦めるの禁止。 これからはboostなら一発でおkという場面は全部 「無いから自作しろ」と回答しよう。
なんか100近く進んでると思ったらこれか('A`) なんだってこうなるんだ……
t e s t
そしてboostが標準になったころに乗り遅れるお前らぷぎゃー
お前はそんなにスレを荒らしたいのか
booooooooooooooooost
boo+st
やぁ、こんにちわ。 どうです、釣れてますかな?
booooooooooooooooots
遊神プートス
何でこんなにスレ育ってるんだ? 今来た俺に3行で頼む。
VIP へ 池
657 :
655 :2006/11/22(水) 00:11:09
サバッシュktkr
以下、啓蒙文Ver2.0 注:有意義な質問に対して煽り、1行レスで返す方が多いようですが、 そのような方は発言するだけ無駄ですのでお黙り下さい。 また質問者に対するあまりにも儀礼を欠いた回答レスもお断りいたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、質問に対して有意義な答えを下さった方には ちゃんと評価しますので安心しましょう。 これテンプレに入れよう
>>659 ウザ('A`)
それ答える側も全く同じなんだけど。
>>659 もうちょっと日本語の勉強をしましょうね。
突っ込みどころが満載。
よりによってBOOTSスレかよ。
いつまで残ってるんだろう。bootsスレ(w
靴w
#include <靴/???>
分かった分かった、俺がバイト中に思いついたネタを披露するからお前ら仲良くしる 生std::auto_ptr様の生ポインタ.geeeeeettttt()!!!!
今日は冷え込みますね。
>>668 ニホンジンはドウシテイツモ、冷え込みますねッテイウカナ?
モウ十二月チカイカラ、ヒエルノアタリマエデスネ!ハハハハハ!
って隣のパキスタン人が言ってた。
何を言ぅ!
俺の隣のサイヤ人はなんか知らんけどわくわくしてた。
#include <靴/sprits> using 靴::sprits::adidas
classのstaticなメンバ関数は、インターフェイスをヘッダに書いて定義は別のファイルにする事が出来ないんでしょうか。 ネットを漂っていても、class内に直接書くものしか見ません。 === header === class foo{ inline static int x2(int val); }; === cppfile === int foo::x2(int val){ return val*2; } とした所"inline static int x2(int)は定義されていません"とwarnigをくらいました。
static じゃなくて inline の方が問題
inlineは分けて書いちゃダメ。
___ /´. _, -―-、ヽ、 ./ l´[☆ィTfヘマ、 ヽ | | |ィケリノ |ト}!l| | _| レァ予 伝yリ| ,..、 / | fr| 《{_丿 Ljハ‖ _,ノ/`il / | ゞ| |、'' r-ァ ,ツ イイ´ ハ il お前らまだC++なんて化石使ってるのかよ | | | ,フ 云'I「|{ {::::{ V リ \ || N {`ヽー弋イノ`衣√`ヾノ \ 从 |、 ハ Y.Qヘ\,イ乍} `ヽVリ'| ! Y´ア´ ,| | 「´ /ヒニリ `、 ん{,,,,'〉,、,、,、ゝ ┝━┿┥
#include <2ch.h>
679 :
デフォルトの名無しさん :2006/11/23(木) 13:55:29
お聞きしたい事があります。 typedef struct _Vec { float x, y, z; _Vec(float x=0, float y=0, float z=0) {this->x=x; this->y=y; this->z=z;} } Vec; と言うように宣言して、 Vec v = Vec(1.0,2.0,3.0); みたいな感じで使うと typedef struct { float x, y, z; } Vec; Vec v = {
};
681 :
679 :2006/11/23(木) 13:59:11
上の続きです 間違ってENTER押してしまいました。 Vec v = {1.0, 2.0, 3.0}; に比べてかなり速度が落ちます。 何故なのでしょうか? operatr *等でも速度が落ちました。 よろしく御願いします。
一時オブジェクト作らないようにexpression template使え。 あと初期化リスト使え。
最適化されれば変わらなくなりそうなもんだが
684 :
679 :2006/11/23(木) 15:35:42
レスありがとうございます。 expression templateについていろいろググってたのですが、 複雑で分からない・・・。 ヒント頂けませんか??
>>684 expression template の前に、最適化かけて差が問題になってるかどうか確認しろ。
>>679 × typedef struct _Vec {} Vec;
○ struct Vec {};
687 :
679 :2006/11/23(木) 16:01:42
>>685 vs2003使ってるのでReleaseではき出したところ早くなりました。
しかし、Debugモードでも早く動くようにしたいです。
>>686 実行速度は変わりませんでした。
>>679 Vec v(1.0, 2.0, 3.0);だとどうなる?
>>687 >しかし、Debugモードでも早く動くようにしたいです。
なんで?
>>コンパイルオプション弄れば
>そ、それはちょっと、、、
何が「それはちょっと」なの?意味がわからん
>>682 float三要素の構造体にexpression templateなんか使ったら余計に遅くなるよ。
expression templateで出来る一時オブジェクトと大きさが変わらんから。
693 :
679 :2006/11/23(木) 16:54:32
>>691 最適化したらデバッグしにくくなるから。
>>692 では、こういう使い方は辞めといた方が良いのでしょうか?
2項だけなら変わらんかもな。しかし遅くなるのはコンパイルとコーディングだけだろ。
デバッグビルドで速くしたい理由が分からない
速くすればデバッグも速く終わると思っている いや、冗談だ。
ベクトルなんてET適用の典型的な例だと思うんだけどなぁ
700 :
679 :2006/11/23(木) 17:54:04
えっと、言い忘れましたが、今作っているのがゲームでして、 大量のソースをいちいちデバッグとリリースを繰り返しビルドするのは時間の無駄なんですよ、、 だから、デバッグビルドでも通常の動作をさせたいんです。
>>700 まずデバッグビルドとリリースビルドがどう違うのか、その違いによって
それぞれどんな用途に使われるのか知ってればそんなことを望むはずはない。
>>700 んなことできるんだったら「デバッグビルド」なんて存在しねーんだよ。
もうすれ違いだから出て行け。
>>699 サイズ固定のVectorじゃなければな
なんだ、低脳共ばっかりか
705 :
679 :2006/11/23(木) 18:47:13
じゃ、どうすればいいか教えてくれお
v*pperは家に帰れお( ^ω^)
ublas::c_vector<float,3>
708 :
679 :2006/11/23(木) 19:51:25
かいけつしたお
そりゃよかったな
711 :
679 :2006/11/23(木) 20:03:17
こうだった
712 :
初心者 :2006/11/23(木) 20:57:20
各地でスレのモラルが向上したとして大好評につき、啓蒙文をVerUPしました。 以下のレスについては、必ずこの啓蒙文を付け加えましょう。 また、もし啓蒙文がない場合は、暗黙のうちにこの啓蒙文が了承されていると みなされます。 以下、啓蒙文Ver3.0 注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を するように。
STLスレがメインだからどうでもいいや
余計なこと言うな ('A`)STLスレにまで感染したらどうする気だよ
テンプレに変なもの書くようなスレだから祟りが起こって当たり前だな
717 :
679 :2006/11/23(木) 21:27:17
結局、リリースビルドとデバッグビルドを使い分けろという事でしょうか?
まぁ暇だから誰も書き込まないうちは適当に遊んで良いよ。
720 :
679 :2006/11/23(木) 21:57:55
>>717 承知しました。
ご迷惑おかけしました。
うん、まぁわかんないことも多いだろうけど、頑張れ。
このスレkusa○a○eが書き込んでるなw
>>722 どのあたり?
俺にはkusak○b○っぽい書き込みは見当たらないが…
おまいら構造体のプレフィックスってどうしてる? クラスなら C メンバ変数なら m_ ポインタなら P 文字列なら状況により str って付けてるけど、構造体は S だと文字列みたいだから、 とりあえず全て大文字にしているけど、おもいらどうしてる?
>726 逝ってくる
visual studio2005使ってるんですが、 long longって32ビットマシンだと32ビットのintとして振舞うんでしょうか? 遅くても64ビットintとして動いてくれたりはしないのですか?
C99のlong longは少なくとも64ビットなければならないようになっている。
少なくともVC++6.0の時代から__int64は32bit環境でも普通に64bit整数として演算可能だった。
IA32上で実行したけど、sizeof(long long)は8だったよ。
typedef struct { int a; int b; } INT_STRUCT; というのと、 typedef struct _int_struct { int a; int b; } INT_STRUCT; の、どちらが良いのでしょうか。 後者を使うメリットはございますでしょうか。
>>734 あえて
struct _int_struct hoge;
と宣言したい時に使え
>>734 メリットはない、プログラミング言語Cによれば
古いバージョンの互換性を保つために残してあるが使うべきではないと書いてある。
後者はコンストラクタとか使うためなんじゃないの?
>>737 thx!そういうことですか、了解しました。
>>738 スレ違いだった、、、Cです。
でわでわ!
>>725 最近boostと同じ名前をつけるようにしてる
>>734 typedef struct _int_struct {
int a;
struct _int_struct *next;
} INT_STRUCT;
C++ではこの場合typedefは必要ない! struct INT_STRUCT { int a; struct INT_STRUCT* next; }; で十分
>>740-741 スレ違いに亀レスつけてんじゃねーよ。
あと、タグ名に奇怪な名前使うのは即刻やめていただきたい。
>>742 C++ではnextの部分のstructも不要だっ!!!!
>>744 そうだったのか、
でも自分は、PODな(あるいはそれに近い、メンバだけの)structには、
慣れで、そういう風に書くだろうけど。
美学にこだわるのは勝手だが、いらん情報は書かんのがC++流だと思うがね。
それくらい自分で試せ。
>>748 注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を
するように。
Intel C++ 8.1 (VS .NET 2003) では いずれもノーエラーだった。 でも付けないほうがすっきりしてるね。今後 C++流に簡潔に書くことにするよ。 他の処理系ではどうなのかな?
c++では不要。 つまり、必要な処理系があればそれはc++ではないということだ(ぉぃ
>>751 必要かどうかを聞いているのではなく、つけても問題ないかということじゃない?
つけても問題ないがつける意味は無い。
カスタムiostreamの実装って難易度どれくらいですか? 何もしないNULLstreamがほしいんですけど。。。
なんかWin32のOutputDebugStringをiostream化したページが どこかにあったからそれ参考にするとか いくつかのメンバを実装するだけだから難しくないかと
つ[/dev/null]
756 :
753 :2006/11/25(土) 13:12:33
レスありがとー。
なぜほしいかというと、クラスにiostreamのポインタを持たせて、コンソールにだしたりファイルにだしたりしたかったからです。
>>754 なるほど!できるかなー。
ちょっと探してみます。
>>755 いやー、ウインドウズなんですよ。提案は感謝。
>>756 つ iostreamで使えるかしらんが、nullデバイスはあるぞ。
echo "hoge" > nul
('A`) さて、javaにもどるか
>>753 もし Boost を許容できるなら Boost.Iostreams を使って以下のようにできる
boost::iostreams::null_sink snk;
boost::iostreams::stream< null_sink > os( snk );
os << "hoge";
>>757 およ、そんなことできたんですね。何に使うんだろ??
>>758 よさげですね。ちょっと読んでみます。
>>759 Boostは見るたびにスゲーっておもうんですが、なんせ範囲がでかいもんだから、僕の許容量こえてるんですよね。TT
次期標準になってコンパイラについてくるようになったら覚えようと思ってます。
今回は見送りますが、提案には非常に感謝。
>>760 用途が良くわからないけど便利なんですかね。
--
うんで、
>>758 を流して読んでみたんですけど、streambufをがりがり書くかiostramに委譲すればできそうな感じですね。
ご協力感謝!
>>762 コマンドラインレベルで作業しない人にはイメージが伝わりにくいけどこんなとき便利。
・余計な出力は見たくない
make > /dev/null
・空の入力を与えたい
awk 'BEGIN {print sqrt(2);}' /dev/null
linuxrcなんかによく使うよね。
struct : std::streambuf {} g_dummybuf; std::ostream nullstream(&g_dummybuf); 俺、こんなんでやってた。もうどうでもいいね。じゃぁ
Effectiveなんとかとか、Exceptionalなんとかとか、内容被ってそうなが本が 多すぎです。 取りあえず Exceptional C++ は読んだんだけど、次に読むとしたら 何がお薦め?
>>767 なるほど。 template 周りも一冊読んでおくべきかな。
あんまり深入りする気はないけど、最近の変態 C++er のコードを読める程度には
なりたいしなぁ。 C++ Templates 良さげだけど…分厚いな…。
落し穴に嵌まらないためのノウハウ的な方向は Exceptional C++ で
足りてるのかな。なんかあれ読んだら無性に不安になって…。
>3 は全部読んだほうが良いと思う。 重複は気にしない。重要だから繰り返されているということですな。
おっと、The C++ Programming LanguageとC++ Primerはどっちか読めばよさげ。
変態 C++コードが飛び交う現場なんて本当にあるんだろうか
Boostの開発現場 実際にどこか1ヶ所にみんなが集まっているわけではないだろうけどね。
正直More〜は立ち読みで十分な悪寒
ちょっと質問。 hoge(aaa, "aaa"); を、HOGE(aaa) か HOGE("aaa") みたいに、 aaa を1度しか書かなくていいようにマクロ化したいんだけど、無理かな? 文字列連結とか # 連結マクロとか考えたけど思いつかず・・・
>>774 #define HOGE(expr) hoge(expr, #expr)
これじゃ駄目なのか?
C++ 関係ないな。
#define HOGE(aaa) hoge(aaa, #aaa)
#define HOGE(x) hoge(x, #x) それはこれで済む話か?
774 の人気に嫉妬
779 :
774 :2006/11/26(日) 02:09:45
a##b → ab のタイプの連結しか知らなかったです ありがとうございました。 連結マクロでぐぐってもいいのが見つからなかったんですが、 これ何か名前ついていますか?
>>779 # は連結じゃねーしマクロじゃない。文字列化演算子。
みんなマクロが好きなんだね そんなに好きならLispさんちの子になっていいんだよ
783 :
774 :2006/11/26(日) 02:37:43
>>780 ありがとうございます、文字列化演算子#、トークン連結演算子## が見つかりました。
デバッグなどで、列挙体を表示するのに使いたかったのです。
#define HOGE(word) E_##word
enum TYPE {
HOGE(aaa),
HOGE(bbb),
};
#undef HOGE
#define HOGE(word) #word
static char* COMMAND[] =
{
HOGE(aaa),
HOGE(bbb),
};
こんな感じにやっといて、
HOGE(aaa) HOGE(bbb) の部分だけ別ファイルにして #include で取り込めばいいかなーと。
そうすれば、COMMAND[E_aaa] で "aaa" が取り出せるって寸法です。
後はスクリプトなどで、コマンド ⇔ ID の変換とか。
>>783 常套手段だ。
× static char* COMMAND[] =
○ static char const* cons COMMAND[] =
○ static char const* const COMMAND[] =
bootsの話はもう終わり?
始まってすらいない。
Effective C++ More Effective C++ Effective STL は必ず読むべきです。読みやすいですし。 以上を読んで理解ししたら、 C++ Coding Standards を手元に置いといて眺めてください。 余力があれば、 More Exceptional C++ Exceptional C++ Style C++ Templates この他は読む必要ない。
原典スルーかよ?
原典読みやすいよね。
ハムラビ原点?
792 :
788 :2006/11/26(日) 11:39:34
More Effective C++の翻訳版って誤訳あるの? できれば日本語のほうがいいのですが、どうでしょう
誤訳というかわかりにくい
最近C++を勉強を始めた者ですが、 クラスのインライン関数についての質問なんです。 関数を頻繁に使う場合はクラスの定義の中に書くって参考書には書いてたんですけど、 実際どれくらいの頻度ならインラインを使うべきなんでしょうか? また、頻繁に使うけど中でのループする処理が多い場合はインラインを使わない方がいいんでしょうか? 初歩的質問だとは思いますが、よろしくお願いします。
>795 今は「気にするな」ということらしい。 inline指定の有無にかかわらず、コンパイラは勝手にインラインにしたりしなかったりするんだって。
>>795 クラス定義外に書いても inline とつけた定義をヘッダに置けば
インライン関数にできる。分けて書いたほうがクラス定義がすっきりする。
インラインにしたい場合はヘッダに実装を晒さないといけないんで、
実測に基づいて効果があると確認できたときだけにしておいたほうがいいと思う。
予測に基づくチューニングは無意味だから、 気にしないことを勧める。 VC7以降は「リンク時コード生成」というのがあって、 パフォーマンス向上のためのインライン宣言が無駄になる。 gccにはまだないけど、まあそのうちはいるでしょ。 むしろ、見易さを優先したほうがいい。 たとえば、メンバ変数の単純なgetterをインラインで書いておくと、 .h/.cppを往復する回数が減る。
なるほど。勝手に判断してくれるんですか。 ありがとうございました! 勉強になりました!!
単純なアクセサを実装見なければ判らないように書くほうがどうかしているとは思うが。
>>798 実装が単純な getter であっても、インターフェースと混ぜてしまうのには
抵抗があるな。その getter が単純な変数の読み取りであることをユーザーに
認識させてしまって良いのかどうかによって、答えは変わるだろう。
どうせテンプレートを使ったときには丸見えにするしかないから俺はあまり深く考えていない。
上に同じ。
整数を文字列変換&結合についての質問です。 整数:a = 10; b = 20; を 文字列に変えて結合したいんですけど、 このときに、文字列はstring型で扱いたいんですが、どうしたらいいでしょうか? char型は使いません。
std::stringstream
boost::lexical_cast
>>804 toString してたせばいいんじゃないんだっけ?
printfのようなものを望むならば、 boost::formatがまさにそれだが。
toString()はC++じゃないぞww
boostも標準C++じゃない。 stringstreamやsprintfは標準だけどな。
正しいC++規格で書かれたものが標準ではないとはこれいかに?
空気嫁
>>812 俺様ライブラリに
toString()というのを正しいC++規格で書けば良い
というお話ですよね?
そして彼は私にあのときは標準C++規格に採用されたライブラリではないと いいたかったのだったといったのだったがそれがすでに手遅れだったので だっふんだをしたかったのだったがそれも手遅れだったのだったのだっふんだ と言ったのだった
,.-─ ─-、─-、 , イ)ィ -─ ──- 、ミヽ ノ /,.-‐'"´ `ヾj ii / Λ ,イ// ^ヽj(二フ'"´ ̄`ヾ、ノイ{ ノ/,/ミ三ニヲ´ ゙、ノi! {V /ミ三二,イ , -─ Yソ レ'/三二彡イ .:ィこラ ;:こラ j{ V;;;::. ;ヲヾ!V ー '′ i ー ' ソ Vニミ( 入 、 r j ,′ ヾミ、`ゝ ` ー--‐'ゞニ<‐-イ ヽ ヽ -''ニニ‐ / | `、 ⌒ ,/ | > ---- r‐'´ ヽ_ | ヽ _ _ 」 ウプレカス [ uBLAS ] ( 西暦一世紀前半 〜 没年不明 )
質問いたします. クリップボード内のデータの履歴を取り,再利用するものを想定しています. テキストだけでなく,画像やリンクなどを含めたデータをクリップボードから取り出し, 保存するにはどのようにしたらよいでしょうか?
>>817 OLE使え。IDataObjectを取り出してそれを保存するんだ。
Windowsのスクラップオブジェクトもたぶんそうしている。
スレ違いだから、詳しくはよそ行け。
OLEってなんですか? WindowsってX-Windowsのことですか?
おいしいお菓子のことですよ。ひとつあげましょうか。
次のC++規格はいつ決まるんですか?
_,,-'' ̄ ̄`-、 / \ ,/ \ / ― ― ヽ lヽ - 、 ! , _ | |r――-、_⊥ ,――'-、 |,-, |::::::::::::::::/ |ヽ:::::::::::::::|-|'イ!| ト、__,,/: |: `、__,,/ ,|ソ/ .| 、_ j| _,、 ,|-' | /lll||||||||||l`、 ,| `i ,|||' ̄= ̄`|||、 / ト、 「|ヽ|ll||||||||||||||||| /i |::::\ /:::::\`!!||||||||||||!!' |::::::::\ /::::::::::::::`ー-、.._ i |::::::::::::::\ /:::::::::::::::::::::::::::::::::::`ー-、. |:::::::::: ハンツキー・ロムッテロ[Handski Romtteroo] (1955〜 アメリカ)
ようハンツ、おまえももう50代か。
824 :
デフォルトの名無しさん :2006/11/27(月) 22:55:25
ものすごく単純な質問なんですが doubleより大きな実数値を表せる形ってありますか?
long double >= double > float long double == double か long double > double かは環境依存
絶対値が大きいって意味? それとも有効桁数が多いって意味?
827 :
824 :2006/11/27(月) 23:22:22
返答ありがとうございます。
>>825 xp home,borland 5.5無料版です。この場合long double の方がよくなるんでしょうか?
>>826 有効桁数です。100行100列くらいの逆行列を陰解法によって解いてて
それで有効桁数がネックとなり、逆行列の精度がすこぶる悪いんです…
>>827 100x100程度の逆行列求めるのにdoubleで足りなくなるのは演算の仕方が悪いだけ。
830 :
デフォルトの名無しさん :2006/11/27(月) 23:42:17
なんでublasやLAPACK使わないの?
勉強してるんだろ。
ええことや!
LAPACK の逆行列ルーチンって、 ついでに行列式を求めてくれないんだよな。 いまいち使えん。
835 :
デフォルトの名無しさん :2006/11/29(水) 01:18:13
std::stream 系に、ビット列?をそのまま渡す方法はないでしょうか? 例えば int 型を渡すと、4バイトそのままの形で流し込むイメージです。 出力先はファイルだったりメモリだったり色々です。
>>835 operator<<を自分で定義すればいいだろ。
但しoperator<<(std::ostream&, int)は既に定義されているので、
ラッパークラスを作る必要はあるだろうが。
その通りなのですが、もし用意されているのなら、 用意されているものを使った方がいいと思ったのです。 うーん、諦めて作りますか・・・ありがとうございます。
std::write()なんてのもあるけど、これは個別に呼び出さないと いけないけどな。
write(reinterpret_cast<char*>&i, sizeof(i));
2つのクラス間でstd::map<string, A *>のようなmapコンテナを渡す時は std::map<string, A *> &get(){} void set(std::map<string, A *> &m){} こんな受け渡しでOKなのでしょうか?何故かAのポインタだけ あってAの中身がないのですが困った助けて
この関数のループ内で宣言したhoge *hのスコープはループが終了するまで会ってるのでしょうか? FuncA(){ for(...){ hoge *h; .... } } もし、このhogeをループが終わってからもポインタアドレスとその中身を保存したい場合は オブジェクトをコピーしないとダメなのでしょうか?
>>842 アドレスをコピーしても意味がない。それはローカル変数だから
スコープを抜けると同時に消滅する。
中身はコピーしてとっておける。
>>842 C++始めたばかりで解らないのですが
JavaみたいにClose()みたいなAPを呼んでコピーすれば
いいのでしょうか?
よろしければ、上の問題でコピーをどのように行えばいいのか
議事コード的なものを示していただけないでしょうか?
>>844 C++にはClone()なんて気の利いた関数は用意されていないから、
自分で代入演算子やコピーコンストラクタを定義しなければならない。
もしクラスhogeにポインタを含んでいないのなら、デフォルトの代入演算子
やらコピーコンストラクタで十分。
そしてFuncA()の戻り値をhogeにすればよい。
>>840 気になったのでやってみた。特に問題はないようだが
struct A {
void print() const {
std::cout << "A" << std::endl;
}
A(int j = 0) : i(j) {}
private:
const int i;
};
class T1 {
std::map<std::string, A*> m1;
public:
std::map<std::string, A*>& get() { return m1; }
void set(std::map<std::string, A*>& m) { m1 = m; }
};
int main()
{
T1 x;
std::map<std::string, A*> m, m2;
m["abc"] = new A(1); m["def"] = new A(2);
x.set(m);
m2 = x.get();
m2["abc"]->print(); m2["def"]->print();
}
訂正 void print() const { std::cout << "A" << i << std::endl; }
>>842 ポインタは、
FuncA(){
hoge *h;
for(...){
....
}
}
でいいけど、その指している先をどうすればいいかはそのプログラムだけでは分からない。
>>846 大丈夫かどうかはnewしたAの寿命次第だな。
多分
>>840 は、コンテナをコピーした後Aがdeleteされたんだろ。
Perl、Ruby等でCGIプログラミングしか経験がないんですが、C++を勉強したい場合、 どのような本がお薦めでしょうか?一応「独習C++」は注文しましたが…。
>>3-4 の書籍は、「初心者向けじゃない」という評価が多かったのですが、
それでも
>>3-4 を読むべきですか?
まずCをやりなよ。
>>854 独習C++を読んで、それに気付きました。独習C++って、Cを理解していることを前提に書かれていますね…。
CをやらずにC++を勉強することが出来る…というか基本的な部分も記載されているC++の本ってないでしょうか…。
「C++ ⊃ C」らしいですから、Cを勉強するってことがそのままC++の基本を勉強するってことなんでしょうけど…。
>>855 俺Cやらずに独習C++でC++から入ったよ。
難しい事なんて何も無い。
「型」や基本的な構造も、PerlやRubyしか触ったこと無いので曖昧です。 int main() { } の「int」が何を意味しているのかも分かりませんし、 void hogehoge() { } の「void」の意味も曖昧です。hogehoge(void)とか。<iostream.h>の「.h」の意味も分かりませんし。 なのでやはりCの基本も記載している本が必要だと思います。 とりあえず独習Cも注文してみました。少し慣れてきたら、プログラミング言語Cとプログラミング言語C++も手元に置くことにします。 Cの基本からC++を学べる本がありましたらご教示ください…。
>>855 他言語で何か作れるならプログラミングの素養だけはあるって事だ。
あとは言語の仕様書(っていうとC++の場合悲鳴が上がるかもしれんくらいでかいけど)と
首っ引きで習うより慣れろでやっちまうのも手だよ。(
>>853 の出した書籍がそう)
Ruby知ってて型がわからんってのは無しにしようよ。
>>858 分かりました。やってみます
>>859 「型」という概念が分からないのではなくて、intやdouble、char、longなど、
出てきたことのないものを完全には把握してないということです。
各型(クラス?)の、Rubyでいうところのクラスメソッドのようなものも知りませんし…。
とりあえず、皆さん親切にお答えくださってありがとうございました。 しつこくレスして申し訳有りませんでした。 独習C/C++とプログラミング言語C/C++でやってみます。
過去何度も言われてることだけど、プログラミング言語Cはいまや古文書の類で、 決して初心者向きの入門書とかではないぞ。 もっと噛み砕いた本はいくらでもあるし、その本読んでからC++へ行こうなんて 考えるくらいなら、はじめからストラップのハゲのC++第三版読んでも変わらない。 難易度的には大差ないし、内容としては包含されている。 独習〜は正直好みも分かれると思う。 入門書として悪い物ではないかもしれないが、読み終わってみて 自分の中に残っているものの少なさに愕然としたりもする。 アンチも多いが柴田〜の本を立ち読みしてみて、合いそうならそっちを選ぶのも有りかもしれん。 中の人がとんでもなくイタい人なんで、その辺を気にしだすとまったく読む気がなくなる本でもあるが、 入門書の類には素直な良著も多い。
「作って分るCプログラミング」がいいよ
みんな親切だな
>>856 亀レスだが
さすがにそれは無いと思う……
他の書籍ならともかく、独習C++は独習C読んでることを前提として書かれてる。
1章(C++の概要)から、いきなり
オブジェクト指向とは
CとC++の相違点(ヘッダとか名前空間とかコンソール入出力とか)
2章・3章で、すぐにクラスの説明
まあ Perl の文法知ってればあんまり問題ないだろうけど。
あとは型をちゃんと使い分けるくらい?
java厨が書いたC++コードは最悪だった 必然的にメモリ周りがおかしい。穴あけ過ぎ 最近は初めての言語がjavaってのが増えてるんだろうなー
>>866 そうでもないよ。
分からない事は断片的に現れるくらいだし、それが出てきたとしても
数分ネットで検索するか考えるかすれば簡単に読み進めれるよ。
まぁCやらずにって言っても、ネットのC言語の資料を嫌と言うほど読み漁ってたからね。
>>864 最近読んだなんかの本に、
「Javaはハード側の問題を隠しすぎ。やるならより低級のCとかからやるべき」
って書いてあった。
それはつまり、
>>867 が指摘してることなのかな
いや俺もプログラム初級者だからあんまわかんないけど。
>C++の前にCをやれと言う人の多くは >自分がCをもともと知っていたという主観が多分に入ってるからそんな気にすることもないと思う。 これはテンプレに入れてもいいくらいだと思う。 C++がCの「反省を踏まえた上での」スーパーセットだということを皆忘れすぎ。 Javaについては、こちらも「C++における諸々の問題点についての反省を踏まえた上での」言語なので、 ある意味退化言語に戻ってくる点については重々把握してもらっておかないと >メモリ周りがおかしい。穴あけ過ぎ には確実に陥るだろうなー。 そういう人にはC++/CLIとかC#って選択肢もあるとは思うけど。
まぁあれだ、 Cの学習を始める前にアセンブリ言語やれって言われてた時代と状況は変わらんってことな。
ぶっちゃけC++の基礎を学ぶ段階なら、本なんざいらん。 VC2005 Expressとか落として、ぐぐりながら思考錯誤で十分。 3ヶ月もあれば基礎は理解出来るだろ。
また極論だな。3ヶ月間もPCの前でうだうだしてられる学生やニートならそれでもいいだろうが。 どの世界でもそうだが、自分がやって来た方法をそのまま押し付けることが教えることだと勘違いしてる奴多いよな。
>>872 ARMでも読めば一週間もかからずに学べるのに、なんで三ヶ月もそんなことしなきゃならんの?
875 :
初心者 :2006/11/29(水) 18:34:55
私は大体C++の教科書は3日で読み終わりました。 初心者にお勧めなのはVisualC++入門等でしょう。私レベルなら1日ほどで 読み終わりますが、不慣れなあなたたちでも1ヶ月もあれば読めると思います。 その後C++の最新のバージョンであるVisualC#入門等を読むことをおすすめします。
C#はC++の最新ではない。別の言語だ。
迷える子羊の方々 C#厨の言葉に惑わされてはいけません 彼らは破滅と絶望を分かち合うことを楽しんでいるのです
C/C++なら入門サイトもたくさんあるし本を読むほどでもない
「言語を何日でマスター出来た」なんて話で本当にマスター出来ていた試しがないんだが
>>876 ほんとにわかっていらっしゃるでしょうか?C言語+アルファ=C++言語なようにC++言語+アルファがC#というのは
常識です。あえていえばC++にはStandaad Template LibraryというVisualBasicライクな開発補助ツールが
付属する程度でしょうか。また最近はC#の更に発展としてD言語というものも開発されており、
D++、D#と今後C++は発展していくことでしょう。
注:現在、私は公私ともに多忙を極め、スレを見ることが困難な状況です。
しかしその中でも何とか時間を作り、このスレに出向いて質問をしています。
そのような貴重な質問者に対し、1行レス、煽り、罵倒で返す愚か者がいるようですが
私のような質問者がいなければそもそもあなたたちの知識をひけらかす場が
存在しないことをよく認識し、身の程をわきまえるべきであります。
よって、私のような貴重な質問者に対し、見下した回答、儀礼を欠いた回答
(例:質問してくれてありがとうございました等のお礼がない、である調で答える、
様をつけない、w等の意味不明な言葉を発する)を禁止いたします。
ましてや自分の立場もわきまえず逆にお礼を強要したり、各人の目に触れやすくなるよう
多数のレスに同様の質問をしているのを「マルチポスト」呼ばわりするような輩は
当然加害対象として私のリストに載ることになります(賢い方は意味がおわかりでしょう)
この規則は2chの精神にものっとっており、強制的に施行されます。もし違反した場合には
2ch管理人への通報、加害届けの提出、プログラムのハッキング(私には
2ch専門のハッキング部隊と契約を結んでおり、銀行の口座のハッキングから
FBIのコンピュータのハッキングまでこなす例のあれと親密な関係です)等断固たる処置
を取らせていただきます。また、形式的にはちゃんとした回答であっても、知識不足のため
不正確な知識を回答することも禁止いたします。よく考え、よく調べ、正確な回答を
するように心がけましょう。なお、当方が質問に対し多少は役に立つと判断した場合は
それなりに評価するのでご安心下さい。なお、確認はこの啓蒙文を読んでいることを
前提としており、読んでいない、理解できない等のいいわけは一切通用しません。
また、有識ある諸君は今後自分の発言に対しこの啓蒙文をコピペすることが義務になります。
スルー推奨
>>879 そもそも何を持ってマスターしたと言っていいのか決めようが無い罠。
>>882 きっと、本人が「俺様はもう完璧」と思った時点。
だからマスターしているというのは大抵あてにならない。
>>883 そういうのって中二病の症状のひとつだろ。
身に覚えがあるから恥ずかしい。
趣味でC++10年ほどやってて大抵の事は知ってるつもりだけど、マスターしてるとはとても言えない。 未だに初めて知る事が年に数回あるから困る。
啓蒙だ義務だってのが今年の冬の中二病の特徴かね。
C++から初めてテンプレートの直前あたりでCやアセンブラに退化して それが終わったらテンプレート行くのがいいんじゃね? 失敗しまくって無理やり覚えるならどんなルートでもいいんだろうけどな
>>887 俺も才能ないにしても、仕事で10年ぐらい使ってても
>>885 でいってること分かるよ。
まあC++がどんどん変わってるってのもあるけどやっぱり奥の深い言語だ。
ちゃんと仕様書読んでれば、度忘れすることはあっても「初めて知る」なんてことあり得ない。
仕様書読まないヒトなら、仕様の全貌が分からないのだから「大抵のことは知っている」なんて言えるわけがない。
よって
>>885 は嘘。
それってどこまでをC++に含んでるかによるんじゃない? C++の言語仕様だけならそりゃ数ヶ月触ってればほとんどわかるだろう。 だけどライブラリやらデザインパターンやらって使わなきゃ知らないままのものって 多いしね。ちょっとしたテクニックにしてもしかり。
>>890 仕様書が分かればその言語を全て知ったことになるのかよw
激しく日曜大工プログラマだなw
>>892 仕様書も読まないずに、単に経験が長いからってだけで
「大抵の事は知ってる」なんて言う奴がいるわけねーwってのが骨子だよ。
>>891 それは同意だが、それって新知識が年に数回程度で済むかな。
>>894 それなりに長いことやってたら実際に現場でばりばりコード書く時間は少なくなってくるからねぇ。
単に勉強不足になったともいうが。
また仕様書か
規格書
>>890 templateをこんな風に使うとsingletonができるなんて驚き
マスターする=コンパイラ書いた
×コンパイラ書いた ○規格に完全に準拠したコンパイラ書いた
>>898 templateをこんな風に使うとsingletonができるのは当然
ゲーハー
>>900 そのころにはC++1x位になっていると思う。
寧ろ、 『C--』 を作成
wchar_tの配列を初期化するときは str = L"string"; とLをつければいいみたいですが,単なる文字のときはどうすればいいですか? wchar_t a = 'a'; wchar_t a = L'a'; どっちもコンパイルは通るみたいですが・・・
>>906 L'a'が正しいです。
'a'は暗黙の変換が働いているだけ。たぶん'あ'などはうまくいかないでしょう。
規格に完全に準拠したコンパイラ書けても 規格書を完全に暗記してても 変態テンプレート書けるとは限らん罠
自分のしたいことが大体コーディングできて、 人が書いたものが全て理解できれば(難読化されてるものを除く) 「マスターした」と言ってもいいような気がするが・・・
>>909 もしそうなら,マスターなんて単語いらない
“マスター”だと「熟練した」以外にも「支配する」とか 「飼い馴らす」とかいうニュアンスがあるからねぇw
>>909 そっから先の「どれ程のものを書けるか」ってのは、
特定の言語をマスターするとかの話ではなくて
プログラミングの才能みたいなものだからなぁ・・・
C++規格の標準化の最前線で名が知れればマスターじゃないか。 フォースとか使えるようになるぜきっと。
そういやヨーダも毛がないよな
マスター禿
無能はこういう、プログラミングの外側の 俺様定義や言葉尻に関するディスカッションになると元気だよね。 敷居が低くて、各人のレベルが曖昧にしか見えてこないテーマには すぐ飛びつくからわかりやすいw
マスター アジアは何をマスターしたのだろうか
そりゃ文脈から言ってアジアをマスターしたんだろう。
マスターベーションマスター
920 :
デフォルトの名無しさん :2006/11/30(木) 04:44:53
最近かそってたからちょうどいい
自慰はmasturbationだぞ。
確かにここはスレタイにあるとおりC++相談室だ。 C#厨は最初からお呼びでないことをうっかり忘れていた。
語尾に -tion がついていると全部同じ言葉に聞こえる ヲナニーのやり過ぎだ(;´Д`)ハァハァ
ステーションハァハァ
だから定義が曖昧な言葉に突っかかるなと
「ほとんど」と「完全に」には10〜20%くらいの開きがあるからね。
よくいるよな。こういう曖昧な言葉につっかかって「俺は偉いんだぞ」とでも 言いたそうなやつ。見てて痛い。
>>927 「完全」の意味がよくわからないけど、
規格書を読んで理解してる人がいるからこそ、
修正の提案がなされたり議論されたりされてるんじゃない?
じゃあこの言い回し修正汁とか言いだす人は、 「読んでないけど捏造に決まってる!修正汁!謝罪と賠償を」とか 「読んでも全く意味がわからないけどこういう意味に決まってる!修正しろ!」とか 言ってるわけか。病んでるな。
>881 私にはスルー力がありません><
ていうかさ、正直規格なんてある程度分かってれば目的のものは作れればそれが一番だと思うよ。 全部理解しないと使えないってのはむしろ言語としての欠陥かと。
>>936 はぁ?お前が不勉強なだけだろうが。規格ってのは最低限度の知識なんだよ。
趣味でHelloWarld(笑)やってるぐらいならいいが
>>927 も読んでないような奴は
プログラマと自称するべきじゃないな。
規格書が手元にあれば全部覚えてる必要を感じない。 もちろん参照頻度は少しずつ減っていくけどね。
イタイwww
痛い馬鹿がいると聞いて来ました。 + + ∧_∧ + (0゚・∀・) ワクワクテカテカ +. (0゚∪ ∪ + と__)__)
無能はこういう、プログラミングの外側の 俺様定義や言葉尻に関するディスカッションになると元気だよね。 敷居が低くて、各人のレベルが曖昧にしか見えてこないテーマには すぐ飛びつくからわかりやすいw
牛乳飲みながらちんすこう旨いぞ。
>>943 ちんこすうに見えた。
ここの人たちは変なことばっかり言うって先入観でもあるんかな。
ちんすこうはうまいね。
味の想像は付くけど今度牛乳と一緒に試してみる。
ちんすこう美味いか?砂糖かけたカンパンにしか見えない。
おいおい、それ言ったらサトウキビは砂糖水でふやけた竹だぞ
だいたい砂糖なんて甘い粉みたいなもんじゃん
さーたーあんだぎー
ろくに勉強して無い大卒が 「プログラミングなんていくら上手くても無駄、言語ヲタ脂肪wwww」 とかやたら必死になって力説する理由が分かるスレですね
>>950 プログラミングなんていくら上手くても無駄、言語ヲタ脂肪wwww
なんで急に大卒?
>>952 「大学で数学ちゃんと習ってデスマーチと縁の無い職場に行くのが勝ち組」
が根拠らしい。
VC2005のiostreamってスレッドセーフなの?
>>954 スレ違い。だけど誘導先が見当たらないんで答えてしまう。
昔はシングルスレッド用とマルチスレッド用とをオプションで選択できたけど、
今はマルチスレッド用しかなくなってる。いちおうマルチスレッドに対応したもの
ってことになってるから、ほぼ問題ないと思われる。
なるほど。さんきゅー。
結局プログラミングなんていくら上手くても無駄なんだよ。 言語オタクはマジキモいから早く死んでね。 でも家畜さんが居なくなると困るから、奴隷のように働くしか道が残ってないかわいそうな人は死なないでね。
これはいいツンデレ
プログラマってきもいんだよwwww社会の屑wwwww BoostだのSTLだの偉そうにしゃべりやがってオタクがwwwww まあたまにはよくこんなコードかけるなあって感心することもあるけどさ 正直難しいよね。 俺なんかHello Worldがせいっぱいでさ・・・ できたらiostreamの使い方を教えていただけませんでしょうか先輩方。
960 :
デフォルトの名無しさん :2006/11/30(木) 22:02:16
だが断る
iostreamっていっても漠然と言われても広いから困る。
C言語の関数を呼び出したプログラムを libにしたのですが、このlibを呼び出そうとすると mallocが見つかりませんなど、Cの関数の呼び出し部分が 参照できないようです。 C++のプログラムの中にCの関数を呼び出す記述が含まれる場合に このソースをlibにする場合には他に何をすればよいのでしょうか?
>>962 extern "C" が抜けてるんじゃない?
コンパイラ付属の stdlib.h を使えば malloc() では問題ないはずなんだが。
>>963 externCは
char *hoge = malloc()ってな感じで使ってる場所でexternすればいいの?
組み込み系でなんかライブラリ標準じゃないのがちらほら.....
名前マングリングを発動させたくない関数にextern "C"を使う。
前から思ってたんだが、マングリングって響きがいやらしい。
マングリ返しングリラ
>>966 そうなんだよね。知っている人同士の会話なら問題ないんだけど、
職場で使うと変に誤解されそうで口にできない。
まあ使う機会なんてほとんどないんだけど。
返り値とかも、周りから聞いたら相当危ない
>>970 たしかに、音だけ聞いたら分からんな。
あと、プロセスを殺すとか、死んでとか。
つい電車の中で同僚と話してしまったことがある。
こうですか?
>>971 「で、そしたら(プロセスを)殺して(kill関数)、返り値が無ければ(ゼロであれば)、成功だな」
プロセス周りだと親とか子とかゾンビとか出てきて、とっても危険な雰囲気。
iostreamはまた別のメンドクサさがあってなあ・・
975 :
デフォルトの名無しさん :2006/12/01(金) 06:25:55
fstreamでファイル操作する時、ファイルサイズ取得する方法ってありますかね? Cの標準関数の場合は、ファイルの終わりにSEEKして位置情報取得すればいいんですけど。 fstream::size()みたいなメソッドがあれば一番なんですけどねぇ…
fstreamでもやっぱり ファイルの終わりにseekして位置情報を取得する
seekp, seekg
>>976 でもなんでC/C++の場合ってことごとくそれ系の関数/メソッドが無いんでしょうか?
何か、予め実装しておくと不都合な事でもあるんでしょうかねぇ…
io.hには_filelength()ってのがありましたけど…
標準C/C++では入出力に関して、だいぶ非力な環境も想定していたと思う。 バイナリファイルをバイト単位で管理しない(できない)環境とかね。 (バイナリファイルでは書き込んだ終わりに余計なヌル文字がついていることがあってもよいというような記載もCにはあったはず) Boostには、boost::filesystem::file_sizeという正にファイルの大きさを返す関数がある。
CP/Mあたりは、ファイルシステムがファイルのサイズを管理してなかった。 なんで、実際にファイルのケツまで読んでEOFを確認しないと正確なファイルサイズがわからなかった。
C/C++においてはファイルは生(なま)物だからな。 入力中にサイズが変わるかもしれないし、そもそも動的な入力デバイスかも知れん。
なるほど、色々考慮してるんだなぁ。 まぁBoostに関数があるんならいいや。
>>980 管理してないのではなくて、
バイト単位ではなく、ブロック単位の管理だった。
Text fileはそれでは不便なので、最後にCtrl-Zを置くことでバイト単位管理。
これがstdioのtext modeとbinary modeの由来の一つ。
CP/M上のstdioは、text modeでCtrl-Zを見たらEOFを返す。
binary modeはそうではない。
WindowsもCP/M互換で出発したのでこのCtrl-Zの扱いを引き継いでます。
上のような関係でiostreamにもその名残りが。
984 :
デフォルトの名無しさん :2006/12/01(金) 11:24:49
流れ変えて悪いけど、VC++6.0のSTLのソース、あれ凄いね… よくわからんけど、なんであんなインデントめちゃくちゃなの? 嫌がらせ?気持ち悪すぎて吐き気して来たんだけど… まったく読めない…
書いてる人の環境とタブ幅が違うとか 元のソースからVC++6用に機械的にコンバートされたものとか
>>985 よく見るとインデントというより書き方にクセがある感じだなぁ、まぁ慣れかな。一部抜粋するとこんな感じ(vector)
bool _Lt(const _Myt& _X) const
{return (lexicographical_compare(begin(), end(),
_X.begin(), _X.end())); }
void swap(_Myt& _X)
{if (allocator == _X.allocator)
{std::swap(_First, _X._First);
std::swap(_Last, _X._Last);
std::swap(_End, _X._End); }
else
{_Myt _Ts = *this; *this = _X, _X = _Ts; }}
friend void swap(_Myt& _X, _Myt& _Y)
{_X.swap(_Y); }
protected:
void _Destroy(iterator _F, iterator _L)
{for (; _F != _L; ++_F)
allocator.destroy(_F); }
iterator _Ucopy(const_iterator _F, const_iterator _L,
iterator _P)
{for (; _F != _L; ++_P, ++_F)
allocator.construct(_P, *_F);
return (_P); }
void _Ufill(iterator _F, size_type _N, const _Ty &_X)
{for (; 0 < _N; --_N, ++_F)
allocator.construct(_F, _X); }
void _Xran() const
{_THROW(out_of_range, "invalid vector<T> subscript"); }
_A allocator;
iterator _First, _Last, _End;
};
インデントつーか、閉じ括弧の位置がLISP的だった気がする。たしか。
でもこの調子でずらずら詰めて記述されてるんで、最初は圧倒されるね…
STLのヘッダーファイル見ると頭がおかしくなりそうになる まあ他のDLLファイルもソースコードは似たような感じなんだろうけど
VC++6だと、プラウガが書いたヤツなんじゃないの? 彼は雑誌に良くコードを出すし、STLのソース本も出しているから、 行数が少なくてすむスタイルを好むんだと思う。 コーディングスタイルのスレがあるから続きはそっちで。
Copyright (c) 1995 by P.J. Plauger. ALL RIGHTS RESERVED. になってたからそうみたい。
次スレはまだですか? ↓よろしく
( ^ω^)立てられなかったお
俺も無理だった
995 :
デフォルトの名無しさん :2006/12/01(金) 14:32:23
生きるのに疲れた
997 :
デフォルトの名無しさん :2006/12/01(金) 15:20:03
age
あっ! 埋めよう
999got
1000なら寝る。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。