952 :
デフォルトの名無しさん:2005/06/29(水) 10:41:33
>>950 「プログラムの規模」って言いたかっただけでは?
>>950 明確な基準はないと思うけど、
「いつ、どこで、どんな操作がされるかを把握できる」
かどうかに懸かってるんじゃなかろか。
例えばログファイルにメッセージ書くクラスがあって
それが「書き込み」という操作しかなければ
グローバルにインスタンス作ってもいいわけで。
グローバル変数の欠点を理解してない意見も混ざってる気がする。
publicでstaticな変数との違いは、
クラス宣言に書く必要が無いからこっそり使ったりする事が可能だって事と、
大規模なプログラムの場合、名前の衝突が管理出来なかったり、
VCみたいな賢いIDEが使えない場合に型の確認が面倒だって事くらいだろう。
publicでstaticな変数にも共通する欠点は色々あるから、
それを許すかどうかもはっきりさせた方がいいわな。
どっちにしろ、「使わなくても出来るけど手抜きでやってる」って事を意識しとくべき。
MFC使うとグローバル変数の一個大隊がついてくるからなぁ。
グローバル変数が0で済むプログラムってのもどんだけちっちゃいんだよって思うけど。
まぁクラスにきちんとまとめて、それも全部publicとかじゃなくて丁寧にアクセス制御しとくんだろうな
クラステンプレートの内側に、クラステンプレートの特殊化版をネスト定義できない件について。
ふぬおおおソースがきちゃなくなるんじゃあああヾ(`□´)ノ
コンパイラが古いんジャマイカ。
VC++6.0ではネストできんかった。
VC++.NETではネストできた。
960 :
959:2005/06/29(水) 20:43:44 BE:140478645-
.NET 2003ね。
>>959 g++だと意図的に対応していないようであります
標準のappendixで禁止しているかららしい。
関数内関数定義とか、templateの宣言・定義の簡略化とか
C++0xで変わったらいいなあ。
WindowsプログラミングをしようとするとWinMainとWndProcの兼ね合いとかでほとんど無理だけどな>グローバル0
>>962 とりあえずフレームワークさえ構築してしまえば
表だったグローバル変数は使わなくて済むと思う。
まぁ俺は安易にグローバル変数使っちゃう族だが。
いや、ウィンドウプロシージャごときで静的変数なんかつかわねーだろ普通
このスレの1が変なのか
STLスレを立てるやつが変。
デバッグしてみたら
-1.#IND000000000
-1.#INF000000000
こんな数字が変数に入ってるんだけどこれは何なのでしょうか?
>>969 数値以外の値。
前者はなんだろう。
後者は負の無限大かな?
いずれにしても、C++の問題というよりデバッガの問題だよな。
971 :
デフォルトの名無しさん:2005/06/30(木) 16:39:51
INDって何の略ですか?
>>969-971 前者は「不定」で恐らくは-0/0の結果。
後者は「無限大」で恐らくは-1/0の結果。
なんかシンプルな行列やベクトルライブラリありませんか?
DirectXのD3DXVECTORぐらいでいいのですが、環境に依存しないやつほしいです。
boostなり自分で作るなり
>>974 boostのベクトルも探してる最中なんですが、
2次元3次元のベクトルよりquaternion、octonionやらが先に見つかってしまいます。
どこかな・・・。
>>975-976 ありがとうございます。
そーゆーのです。
といってもいろいろあると目移りしてしまいます・・・。
スレ違いかもしれないどうしようもない質問をしてしまうのですが
自分は今までプログラムをやった事がないものの、来週からC++をやろうとしています
ここで質問ですが、C++をやるに当たって最初に必要なものはなんでしょうか?何か買う必要があるのでしょうか?
幾ら調べても本当にわけが分かりません、コンパイラーというのが有れば出来るものなのでしょうか?ご指導をよろしくお願いいたします。。
>>980 どうして突然C++をやることになったのかが興味がわきますね。
とりあえず友達にプログラマを見つけて、ある程度のレベルまでは教えてもらうのが早いかと。
984 :
デフォルトの名無しさん:2005/07/01(金) 02:28:49
struct A{ int a; };
A a[10];
for( A* i = a; a != a + 10; ++a )
a->a = 10;
これをSTLの関数オブジェクトまたはboostのbindを使って置換したいのですが
どうすればいいでしょうか?
985 :
984訂正です:2005/07/01(金) 02:29:38
struct A{ int a; };
A a[10];
for( A* i = a; i != a + 10; ++i )
a->a = 10;
これをSTLの関数オブジェクトまたはboostのbindを使って置換したいのですが
どうすればいいでしょうか?
986 :
デフォルトの名無しさん:2005/07/01(金) 02:30:36
>>984-985 using namespace boost::lambda;
std::for_each(a, a + 10, bind(&A::a, _1) = 10);
>>985 boost::bind ではなく boost::lambda::bind だけど。
#include <algorithm>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
namespace bl = boost::lambda;
std::for_each(&a[0], &a[10], bl::bind(&A::a, bl::_1) = 10);
989 :
デフォルトの名無しさん:2005/07/01(金) 03:10:18
990 :
デフォルトの名無しさん:2005/07/01(金) 05:13:32
class func : std::unary_function<int, void>
{
public:
result_type operator( ) ( argument_type i ){}
};
std::vector< int > v;
boost::bind( &std::for_each, _1, _2, _3)( v.begin(), v.end(), func());
すいません、また教えてください・・
VisualC++7.1なんですが、これのコンパイルが通りません。
error C2780が大量に出ます。さっぱりわかりません。
991 :
デフォルトの名無しさん:2005/07/01(金) 05:44:56
&std::for_each を
&std::for_each< std::vector< int >::iterator, func > に直しましたが
まだ駄目です。
bind関数の一番目の引数である「v.begin()」に対して
「1 番目の引数を '_STL::vector<_Tp>::iterator' から '_STL::vector<_Tp>::iterator & ' に変換できません。」
「'const' に対してではない参照は 非左辺値へバインドできません。」
とでます。どういう意味でしょうか?
煮詰まったので質問します。
型AとBが同じ型のときtrueを、異なる型のときfalseを返すクラステンプレート:
template <typename lhs, typename rhs>
struct is_equal {
tempalte <typename T> struct proxy { enum { type = false }; };
template <> struct proxy<rhs> { enum { type = true }; };
enum { type = proxy<lhs>::type };
};
は、explicit specialization in non-namespace scopeエラーとなりコンパイルできません。
そこで、proxyクラステンプレートをnamespaceスコープで特殊化することになりますが
この書き方がサッパリわかりません。
外側のクラステンプレートは特殊化せず、内側だけを特殊化したいのです。
コンパイラはgcc-3.3.3です。
>>990 それはbind使う意味があるんでしょうか?
>>991 bind内部では参照がメインだからです。
boost::bind( &std::for_each<std::vector<int>::iterator&, func>, _1, _2, _3)( v.begin(), v.end(), func());
これでいいと思うよ。
994 :
デフォルトの名無しさん:2005/07/01(金) 08:04:40
>>993 やってみて駄目だったんですが、
一時オブジェクトは非const参照には変換出来ないとわかりまして
以下のようにしたら通りました。
勉強になりました、ありがとうございました。
std::vector< int > v;
std::vector< int >::iterator b= v.begin();
std::vector< int >::iterator e= v.end();
boost::bind( &std::for_each< std::vector< int >::iterator, func >, _1, _2, _3)( b, e, func());
>>992 for( iterator i = v.begin(); i != v.end(); ++i){
for( iterator j = i->w.begin(); j != i->w.end(); ++j){
func( *j );}}
これを関数オブジェクトで書けないかと検討中だったんです。
しかし、bindやlambdaというのは使い道が見えません。
普通に直で関数オブジェクト書いちゃった方が楽な気がする・・
996 :
デフォルトの名無しさん:2005/07/01(金) 10:59:36
@string型をint型にキャストするにはどーすればいいんですか??
StrToIntとかToIntという関数があるようですが,
これでは駄目なようで困っています.
Aファイルから1行を切り出すにはどうすればいいんですか??
40文字ずつ改行しながら別のファイルに出力させていくという
プログラムを作りたいのですが,
char *c;
fileReader.get(c, number, '\n');
のようにしてnumberが21くらいになるとメモリがreadにならないという
エラーメッセージが出てきます.どうしてでしょうか??
>>996 inline int stoi(const string& str) { return atoi(str.c_str()); };
関数名から予想するとBCBのようだけど、
AnsiString == String != std::string (!= CString)
なので注意ナ
「一行」切り出すのは、finをテキストモードで開いて
string str;
getline(fin, str);
40文字ずつ改行するならsubstrかカウンタ使う
漏れならperl使う
>>992 >型AとBが同じ型のときtrueを、異なる型のときfalseを返すクラステンプレート
これだけが必要なら別に外側だけ特殊化すればよいような気がします.
>外側のクラステンプレートは特殊化せず、内側だけを特殊化したいのです。
これは言語規格的に無理です.
999
ギリギリまで真面目に話してるおまえらにもえ
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。