■過去ログ置き場に戻る■
1-
前250
次250
最新50
[memo]
"9999999999_00.html#R20"
という感じで、URLの最後に "#R
レスNo
" を追加すると幸せになれます。
C++相談室 part40
751
名前:
デフォルトの名無しさん
:2005/06/11(土) 19:19:40
仕様:本ソフトウェアはサロゲート・合成文字の類には一切対応しておりません。
752
名前:
デフォルトの名無しさん
:2005/06/11(土) 21:57:26
そんなもん使うやつはいないからそれでいいよ
753
名前:
デフォルトの名無しさん
:2005/06/14(火) 03:58:37
コンパイル時に数が確定しているstaticなインスタンスを数え上げて
そのインスタンスへのポインタの配列を
コンパイル時に自動的に確保するようなコードって書けますか?
例えばclass Fooがあったとして
Foo a, b, c;
としたときに
Foo* AllFoos[3] = { &a, &b, &c };
のようなものをコンパイル時に作ってしまいたいんです
テンプレートとコンストラクタとstaticメンバ組み合わせれば
出来そうな気がするんですけど、なかなかうまくいきません
754
名前:
デフォルトの名無しさん
:2005/06/14(火) 05:45:13
Foo* AllFoos[3] = { &a, &b, &c };
の部分を自動で生成するってことか?
>テンプレートとコンストラクタとstaticメンバ組み合わせれば
>出来そうな気がするんですけど、なかなかうまくいきません
これだと実行時じゃないの?
755
名前:
デフォルトの名無しさん
:2005/06/14(火) 06:01:31
>>754
その部分の3ていう数字とか&aとかの部分です
というのもFooオブジェクトはスタティックな
インスタンスとしてしか存在しないんだけど
ソースファイルのいろんなところに散らばってしまうので
追加修正があったときにGrepしてカウントするのは非効率かなと
なんでコンパイル時にこだわってるかは、例えば
インスタンスの数が極端に少なければ全てのインスタンスに対するループ
for (int i = 0; i < Fooの総数; ++i) {
AllFoo[i]->SomeMethod();
}
がコンパイラの最適化によって展開されたりしたらいいなあと
756
名前:
デフォルトの名無しさん
:2005/06/14(火) 06:17:50
for文をこうすれば
for (int i = 0; AllFoo[i]!=NULL; ++i) {
修正箇所は一箇所じゃないの?
Foo* AllFoos[] = { &a, &b, &c, NULL };
最適化はよくわからんけど
それだと仮に最適化されてもどうでもいいような速度じゃない?
757
名前:
デフォルトの名無しさん
:2005/06/14(火) 06:59:28
>>756
わかりにくくてすみません
概念的にリスト構造なんで仮に配列で表現したまでで、
実際配列でやるのかは実装次第です
例えば実行時にリストを構築するとすれば
class Foo {
static std::vector< Foo* > s_AllFoos;
public:
Foo() { s_AllFoos.push_back(this); }
static void ForEach(std::unary_function<Foo, void> func) {
std::foreach(s_AllFoos->begin(), s_AllFoos->end(), func);
}
};
みたいにな感じになると思うんですが、動的に作らないクラスなので
コンパイル時に全てのインスタンスがわかるので
起動時に一々リスト構築するよりうまいやり方がないかなと思ったわけです
758
名前:
デフォルトの名無しさん
:2005/06/14(火) 07:54:01
std::vector::push_back
を呼び出すならコンパイル時には無理なんじゃないの?
759
名前:
デフォルトの名無しさん
:2005/06/14(火) 10:50:33
>>753
俺だったら簡単なスクリプトを書いてそういうソースを自動生成するな。
760
名前:
デフォルトの名無しさん
:2005/06/14(火) 11:23:09
適当に書いただけだと思うが、
static void ForEach(std::unary_function<Foo, void> func) {
std::foreach(s_AllFoos->begin(), s_AllFoos->end(), func);
}
こんなの間違っても書くなよ
761
名前:
デフォルトの名無しさん
:2005/06/14(火) 13:26:47
>>759
ですから、あくまで例です…
>>759
確かにスクリプトの領分かもしれません
一旦別の方向で考えてみます
>>760
すみません適当すぎましたw
762
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:11:40
超初心者が質問してもいいスレはこちらですか?(;´Д`)
763
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:24:28
いいえ
764
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:25:43
【初心者歓迎】C/C++室 vol.18
http://pc8.2ch.net/test/read.cgi/tech/1117984322/l50
765
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:26:38
先輩にnullは使うなといわれました。確かに安易に使ってはいけないとおもいますが
こうゆう場合はどうなのでしょうか?
俺がつくった関数
hoge getHoge()
hogeが取れなかった場合nullを返す
先輩がつくった関数
boolean getHoge(hoge &h)
hogeが取れなかった場合falseを返す
どちらも呼ぶ側はif(!getHoge(...))です。ここまでしてnullを避けなければならないのでしょうか?
会社によってはこうゆうルールがあるのですか?先輩はnullはダメだとしか教えてくれませんでした
766
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:28:22
わざわざnullableまで作ったMSの立場は
767
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:28:48
>>765
もしかして、言語が Java じゃないか?
768
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:32:07
>>767
C++です
769
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:34:11
どんな事にせよ明確な理由も述べずに教条的に「〜しろ」言う奴は信用しない方が
770
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:41:01
信用はせず、イヤイヤ黙って従っておく
というあたりが、おすすめの処世
771
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:44:49
こういう話なんじゃないのかね。
http://www-6.ibm.com/jp/developerworks/java/010810/j_j-diag2.html
772
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:47:39
nullアクセスで例外を吐いてくれるとはなんて親切なんだ!
とC/C++使いとしてはうらやましいわけですよ
773
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:54:36
Windowsなら例外飛んでくるぞ。SEHのほうだがな
774
名前:
デフォルトの名無しさん
:2005/06/14(火) 23:54:41
Windows上ではC/C++でもSEHになる。少し細工すればC++例外に出来る。
まあここはそんなスレじゃないけどな。
775
名前:
デフォルトの名無しさん
:2005/06/15(水) 00:04:46
>>768
boolean とか、hoge getHoge() でなぜか null を返せるとか (hoge がポインタ型に
typedef されてるのか?) 俄には信じがたいんだが。
null 返すな bool にしとけ、ってのは CODE COMPLETE で見た気がする。
ポインタだとエラーチェックを端折るヤツが多くて後で苦労した、という実経験に
裏打ちされた話だったような。
776
名前:
デフォルトの名無しさん
:2005/06/15(水) 01:44:44
ポインタだとエラーチェックを端折るヤツが多くてboolだと大丈夫という理屈はさっぱりわからんな。
ただポインタ返されてもそれがnewしたものかメンバのポインタかわからんので
コードメンテ上良くない。
777
名前:
デフォルトの名無しさん
:2005/06/15(水) 09:12:59
>>776
> ポインタだとエラーチェックを端折るヤツが多くてboolだと大丈夫という理屈はさっぱりわからんな。
理屈は分からなくても、実際にデバッグ工数減れば何でも良いよ。
778
名前:
デフォルトの名無しさん
:2005/06/15(水) 22:01:46
ポインタでエラーチェックを端折るヤツはboolでも端折るんじゃないかと
779
名前:
デフォルトの名無しさん
:2005/06/15(水) 23:51:49
コンストラクタの本体で、thisの指す先もしくは*thisを構築済みの
有効なオブジェクトとして扱う行為は正当でしょうか?
class C;
void func(C &); // Cのオブジェクトを操作する
class C
{
C(){ func(*this); }
};
780
名前:
デフォルトの名無しさん
:2005/06/16(木) 00:00:42
>>779
「構築済み」を規格レベルの意味で捉えるなら、不当。
コンストラクタの実行が完了したときに「構築済み」と言える。
ttp://www.kuzbass.ru/docs/isocpp/basic.html#basic.life
781
名前:
デフォルトの名無しさん
:2005/06/16(木) 00:46:46
>>780
ありがとうございます。
http://www.kuzbass.ru/docs/isocpp/special.html#class.init
上節などを読む限りでは構築中の場合でも制限付きで扱えるということみたいですね。
ただこれに関して規格を厳密に追うのは結構しんどそうだと理解しました。
782
名前:
デフォルトの名無しさん
:2005/06/16(木) 23:55:35
クラスのあるメンバ関数を、初期設定により異なる
メンバ関数に割り当てたいと考えています。
class Test
{
void a_(int x){cout << "a:" << x << endl;}
void b_(int x){cout << "b:" << x << endl;}
public:
Test(unsigned int kind)
: run( kind ? a_ : b_){}
void (Test::*run)(int);
};
int main()
{
Test test(1);
test.run(3); <-- test.b_(3)が呼ばれてほしい
return 0;
}
上記のように試してみたのですが、test.run(3); の行で、
error:expression must have (pointer-to-) function type
とエラーが出てしまいます。上記の例はどのように直せば
うまく行くでしょうか?お分かりの方がいらっしゃいましたら、
ぜひご教授よろしくお願いいたします m(__)m
783
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:05:41
>>782
(test.*test.run)(3);
784
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:06:40
test.*run(3);
じゃない? 試してないから知らんけど。
785
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:06:44
>>782
class Test
{
void a_(int x){cout << "a:" << x << endl;}
void b_(int x){cout << "b:" << x << endl;}
void (Test::*run_)(int);
public:
Test(unsigned int kind)
: run_( kind ? &Test::a_ : &Test::b_){}
void run(int x) { return (this->*run_)(x); }
};
786
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:07:11
>>782
class Test
{
void a_(int x){cout << "a:" << x << endl;}
void b_(int x){cout << "b:" << x << endl;}
void (Test::*pf)(int);
public:
Test(unsigned int kind)
: pf( kind ? &Test::a_ : &Test::b_){}
void run(int c)
{
(this->*pf)(c);
}
};
int main()
{
Test test(1);
test.run(3);
}
787
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:07:27
(test.*(test.run))(3);
788
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:07:36
>>782
汚すぎ。
せっかくC++使うんならポリモフィズム使えばいいだろが。
789
名前:
786
:2005/06/17(金) 00:08:01
かぶった。すまぬ。
790
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:08:34
何人いるんだ・・・
791
名前:
784
:2005/06/17(金) 00:10:00
皆質問に飢えてたりするのかねw
792
名前:
782
:2005/06/17(金) 00:11:40
一気にすごい数の回答が。。ありがとうございますm(__)m
今からそれぞれ試してみます!
793
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:14:23
>>791
飢えているなら俺から質問
voidってなに?
794
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:17:55
全然関係ないが
> <-- test.b_(3)が呼ばれてほしい
これは無理だろ
795
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:20:53
ひっかけ問題か。全員不正解!
796
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:21:15
>>794
783- の回答でできたんじゃないの?
797
名前:
784
:2005/06/17(金) 00:22:40
>794
Ω<ナ、ナンダッテー
798
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:23:04
>>793
戻り値なし
799
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:24:14
>>798
thx
ホントにvoidだけにスルーされたかと思った
800
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:25:21
void* what_about_this(void);
801
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:26:03
>>796
> Test test(1);
となってるからrunにはTest::a_が入る。
だからTest::b_は呼ばれない。
802
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:28:56
>>801
あーそうだったのか。
803
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:32:19
>>800
はいはい
void*型
引数なし
804
名前:
782
:2005/06/17(金) 00:32:23
>>785
=
>>786
は無事うまく行きました。文法的に
何をやっているかも理解できました。なるほどこうやればいいんですね。
ありがとうございます。
>>783
>>787
は共に文法的に同じ事を意味しているようですね。
文法的にどのような構造になっているのか
よく理解できていないのですが、無事うまくいきました。
何だか分からんが、すごいです。。
>>784
は残念ながら私の環境ではエラーになってしまうようです。
>>788
確かに、きたないですね。。ただ、対応すべき関数(a_,b_など)がいっぱい
ありすぎるため、いちいち子クラスを作ると大量にクラスができてしまう
ので躊躇してしまっています。
皆様、これくらいの事は一瞬で分かるようで、
すご過ぎて尊敬してしまいます。
大変勉強になりました。どうもありがとうございましたm(__)m
805
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:35:24
>>782
お前はすごいよ
俺なんてvoidすらわからねぇんだから自信もて
806
名前:
782
:2005/06/17(金) 00:35:25
>>795
よし、皆ひっかかったぜ!
というのは大嘘で、単なるミスです。。
すみません、ご指摘ありがとうございました。
807
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:35:53
>>804
どういう経緯でそれが必要になったか知らないが、設計考え直したほうがいいぞ。
808
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:37:12
>804
>>783
等の形は、
「メンバ関数へのポインタ(変数)は、そのクラスのメンバであるとは限らない」ことから。
変数を指定するためのtest.runと、
そのメンバ関数ポインタを呼び出すインスタンスとしてのtest
この2つが必要だということ。
809
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:39:14
関係ないんだが
会社とかでさ
パッケージを保守する仕事してたら
ソースのFOR文とかに
iとかjとかつかってるのがあると萎えるのはなぜ
810
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:41:12
i, j よりも for が大文字なのが、一体どんなマクロかと思って萎える。
811
名前:
デフォルトの名無しさん
:2005/06/17(金) 00:42:46
>>810
特に深い意味はなかったけど何で大文字にしたんだろ
812
名前:
782
:2005/06/17(金) 00:43:28
>>807
そうですね。色々ほかの可能性も考慮に入れて見る事にします。
>>808
なるほど。。超勉強になります。どうもありがとうございます。
813
名前:
デフォルトの名無しさん
:2005/06/17(金) 12:00:34
class TestBase {
public:
virtual void run(int) = 0;
};
class TestA : public TestBase {
public:
void run(int x){cout << "a:" << x << endl;}
};
class TestB : public TestBase {
public:
void run(int x){cout << "b:" << x << endl;}
};
class Test {
public:
Test(int kind) { if (kind) tb = new TestA(); else tb = new TestB(); }
virtual ~Test() { delete tb; }
void run(int x) { tb->run(x); }
private:
TestBase* tb;
};
int main()
{
Test t(1);
t.run(3);
return 0;
}
814
名前:
デフォルトの名無しさん
:2005/06/17(金) 12:03:32
>>813
Strategyを差し込もうよ。
815
名前:
813
:2005/06/17(金) 13:26:01
>>814
俺も勉強中なんだ。リファクタリング希望。
816
名前:
813
:2005/06/17(金) 13:28:53
こんなか?
class TestBase {
public:
TestBase(string n) : name(n) {}
void run(int x) { cout << name << x << endl; }
private:
string name;
};
class TestA : public TestBase {
public:
TestA() : TestBase("a:") {}
};
class TestB : public TestBase {
public:
TestB() : TestBase("b:") {}
};
817
名前:
デフォルトの名無しさん
:2005/06/17(金) 14:22:57
>>814
書いてからよく見たらほとんど変わらなかった。
class Runnable { // 仮想デストラクタ省略
public:
virtual void run(int x) = 0;
};
class A : public Runnable {
virtual void run(int x) ){ cout << "a:" << x << endl; }
};
class B : public Runnable {
virtual void run(int x) ){ cout << "b:" << x << endl; }
};
class Test {
public:
void setRunnable(Runnable* r) { r_ = r; } // setterでさしこむ
void run(int x) { r_->run(x); }
private:
Runnable* r_;
};
818
名前:
デフォルトの名無しさん
:2005/06/17(金) 14:50:07
こうしてみると
>>785
あたりが意外と悪くない気がするなぁ。
別クラスにすると場合によってはTestのポインタを(TestA,TestBとかに)引き渡さなくちゃいけなくなるし。
819
名前:
デフォルトの名無しさん
:2005/06/17(金) 18:32:53
std::stackって最後に追加したものだけしか要素を参照できませんよね.
先頭とその次の要素まで参照できるstackがほしいんですが,どう実装するのが良いんでしょうか.
820
名前:
デフォルトの名無しさん
:2005/06/17(金) 18:40:47
stack使わずにdequeなりvectorなり使えば?
821
名前:
819
:2005/06/17(金) 19:52:05
>>820
とりあえず今は std::deque で実装してるんですが,先頭から二つの要素が見える
stackとしてしか使っていないので,できる限りstackっぽくしたいんですよねえ.
822
名前:
デフォルトの名無しさん
:2005/06/17(金) 20:37:14
std::stack stk; // ゴミ箱があるとする
tmp = stk.top(); // ふたをコピーして
stk.pop(); // ふたを開けるとする
// stk.top(); // 中身を見てうげー
stk.push(tmp); // ふたを閉める
これしかないんじゃ?
823
名前:
デフォルトの名無しさん
:2005/06/17(金) 21:28:03
>>818
うん。
生のメンバ関数ポインタを boost function に変えれば、
ほぼ 785 の通りにできるよね(呼び出し時にもthisとか
いらない)。
824
名前:
デフォルトの名無しさん
:2005/06/18(土) 16:32:00
boostのソース追ってて気になったんですが、
メソッドの引数で(foo<T> const & r)みたいな
constの位置ってどういう意味なんでしょうか?
(char * const bar) みたいのがポインタ不変宣言なのは知ってるのですが
参照の前にconstがあるのは知りませんでした…
825
名前:
デフォルトの名無しさん
:2005/06/18(土) 16:34:08
const T と T const は同じ
826
名前:
デフォルトの名無しさん
:2005/06/18(土) 16:58:44
>>825
ありがとうございます
827
名前:
デフォルトの名無しさん
:2005/06/19(日) 02:04:30
クラステンプレートでメンバフィールドの特殊化ってできますか?
メソッドならtemplate<> ClassName<特化型>::SomeMethod()
みたいな感じにするのはわかるんですが、
例えばインデックスの型によってコンテナを使い分けるクラステンプレート
template<typename valueT, typename indexT>
class MyTable {
indexT add(const valueT& value);
void remove(const indexT& index);
valueT find(const indexT& index);
}
みたいのを、具体的にどうやって記述して良いのかわかりません
数値ならハッシュテーブル、文字列なら二分木、みたいな感じでやりたいのですが…
828
名前:
デフォルトの名無しさん
:2005/06/19(日) 05:42:34
template<typename valueT, typename indexT> class MyTable;
template<typename valueT>
class MyTable<valueT,int> {
//ハッシュで実装
};
template<typename valueT>
class MyTable<valueT,char*> {
//木で実装
};
これじゃダメか?
829
名前:
デフォルトの名無しさん
:2005/06/19(日) 11:22:29
>>828
あー…なるほど…クラス自体を特殊化してしまうんですね
830
名前:
デフォルトの名無しさん
:2005/06/19(日) 11:25:08
本当にメンバフィールドの型だけを変えたいってのなら、Boost 使うとこんな感じ?
typedef typename if_<is_integral<indexT>, hash<indexT, valueT>, tree<indexT, valueT> >::type containerT;
でもメソッドの実装ごと切り替えたいなら実装用のクラスを作ってテンプレート引数で切り替えるというのも
有りかと。まー
>828
と同じだけど
template<typename valueT, typename indexT>
class MyTable : public MyTableImp<valueT, indexT, is_integral<indexT>::value> {};
template<typename valueT, typename indexT, bool b>
class MyTableImp {
// ハッシュテーブル実装
};
template<typename valueT, typename indexT>
class MyTableImp<valueT, indexT, false> {
// 二分木実装
};
831
名前:
デフォルトの名無しさん
:2005/06/19(日) 16:41:20
>>830
ありがとうございます
テンプレートをboolリテラル?的に扱うのは
覚えた方が良さそうですね
832
名前:
デフォルトの名無しさん
:2005/06/21(火) 19:17:40
ガウス・ジョルダン法を用いてn*(n+1)行列を変形する関数を作っているのですが、
変形する関数(GaussJordan)は行列のクラスのメンバ関数にしていいと思いますか?
833
名前:
デフォルトの名無しさん
:2005/06/21(火) 20:40:31
俺ならそうはしない。
インタフェースは必要最小限がいい。
834
名前:
デフォルトの名無しさん
:2005/06/21(火) 21:01:48
テンプレートのことで聞きたいんですが,
class A
{
//普通なクラス
};
template <class name>
class B{
//テンプレートクラス
};
があったとします。
そして、このテンプレートクラスを使うために"型"を指定してインスタンス化
するわけですけど
b<型> object;
この"型"に一番上に書いた「class A」のような
自分で作ったクラスを"型"として指定できるのでしょうか?
int型などは、普通に指定できるのはわかっているんですが・・・・
ご教授お願いします。
835
名前:
デフォルトの名無しさん
:2005/06/21(火) 21:04:30
できる。
836
名前:
デフォルトの名無しさん
:2005/06/21(火) 21:16:14
>>833
ですよね。
ありがとうございました。
837
名前:
デフォルトの名無しさん
:2005/06/21(火) 22:27:09
クラスのメンバ関数に関してなんですが
クラスのインスタンスにはメンバ関数へのポインタは含まれてないけど、
そのかわりに○○○って所へのポインタを持っていて
メンバを呼ぶと○○○からたどって目的のメンバ関数を呼び出すって感じだったと思うんですけど
○○○って何て名前ですか? たしかアルファベット3文字だったと思うんですけど。
838
名前:
デフォルトの名無しさん
:2005/06/21(火) 22:28:36
vtblのことか?
ちなみに仮想関数だけな。
839
名前:
デフォルトの名無しさん
:2005/06/21(火) 22:29:50
vtbl?
840
名前:
デフォルトの名無しさん
:2005/06/21(火) 22:32:10
DVD
841
名前:
デフォルトの名無しさん
:2005/06/21(火) 22:38:05
>>838-839
どーもありがとん。
842
名前:
デフォルトの名無しさん
:2005/06/21(火) 22:53:16
>>833
C++って何でもメンバにしがちだけど
俺もそっちの方が自然だと思うな。
例えばvectorクラスだったら、
長さを返すlengthはメンバでいいと思うけど
正規化するnormalizeは関数の方がいいみたいな。
843
名前:
デフォルトの名無しさん
:2005/06/21(火) 22:58:00
normalize なんかは非常によく使うので、
メンバ、関数共に存在して欲しい
844
名前:
デフォルトの名無しさん
:2005/06/21(火) 23:02:44
自己書き換えで const でないメンバ関数 normalize (戻り値なし)と、
正規化した結果を返す関数 T normalize(const T&) の両方欲しい。
効率の観点から。
845
名前:
デフォルトの名無しさん
:2005/06/21(火) 23:06:22
俺はlengthもフリー関数で良いと思うけど。
効率の問題があるなら
>>844
みたいにするか、成分ごとの操作を許すかだな。
846
名前:
デフォルトの名無しさん
:2005/06/21(火) 23:26:37
ノーマル関数というかクラスのstatic関数にしないか普通
847
名前:
デフォルトの名無しさん
:2005/06/21(火) 23:35:57
もれのところでは
class Vector {
float Norm() const;
Vector& Normalize();
static Vector Normalize(const Vector& v);
inline float Length() const { return Norm() };
};
みたいになっている
しかしガウスジョルダンだかしらんけど
用途が極限られてるメソッドは
独立させた方がいいんじゃないかね
848
名前:
デフォルトの名無しさん
:2005/06/21(火) 23:36:00
>>846
なんでそんなことするんだ?
849
名前:
デフォルトの名無しさん
:2005/06/21(火) 23:37:56
わかってないから
850
名前:
846
:2005/06/21(火) 23:42:01
あれ?俺だけ?
例えば
>>847
のように
Vectorクラスに関連してるが
インスタンスの情報は必要ないユーティリティ的な関数ってstaticにするけど
851
名前:
デフォルトの名無しさん
:2005/06/21(火) 23:46:23
値を返す方は漏れも普通の関数にするな。
>>845
>効率の問題があるなら
>>844
みたいにするか、成分ごとの操作を許すかだな。
「成分ごとの操作を許さない行列クラス」ってちょっと使い難いと思う。
>>847
>Vector& Normalize();
なるほど。 v2 = (x - y).Normalize() * 2; とか効率よく出来るわけね。
>>848
普通の関数にするのは、Vectorみたいなデータクラスの操作を一々
メンバ関数にしてられっかょ、何か追加するたびに毎回Vectorみたいな
基本的なクラスに変更が入んのか、というようなことだと思う。
852
名前:
デフォルトの名無しさん
:2005/06/21(火) 23:57:30
基本的には同意だが、ベクタぐらいならともかく、
外に見せるインターフェースと内側での実装の間に
多少なりとも違いのあるクラスなら、メンバ関数にして内側の実装を直接いじった方が
効率がいいかも、とは考えるかな。
853
名前:
デフォルトの名無しさん
:2005/06/21(火) 23:59:42
>>850
俺なら同じファイルに入れるだけにするな。
static関数もカプセル化のために使いたい。
854
名前:
デフォルトの名無しさん
:2005/06/22(水) 01:40:25
>>843-844
俺はどっちかに統一して欲しいなあ。
神経質なんで。
855
名前:
デフォルトの名無しさん
:2005/06/22(水) 01:54:43
ん、いきなり流れを立って申し訳ないけど。
VC6でbool形に true to falseしか代入させないようにするって出来ますでしょうか?
VC6だとこれ通っちゃうんですけど・・・
bool foo = (float)1.0;
bool foo = (double)1.0;
TRUE,FALSEの代入も抑制したいんです。
856
名前:
デフォルトの名無しさん
:2005/06/22(水) 01:57:24
>>855
無理
857
名前:
デフォルトの名無しさん
:2005/06/22(水) 01:57:34
>>855
言語の規格なんで、無理。
858
名前:
デフォルトの名無しさん
:2005/06/22(水) 02:18:54
boolean型新たに作るとか
859
名前:
デフォルトの名無しさん
:2005/06/22(水) 03:26:53
boon b;
860
名前:
855
:2005/06/22(水) 08:38:43
無理ゆーなーヽ(`Д´)ノ
一時オブジェクトを生成させることによって、
コンパイルエラーをわざとと吐かせることは可能なんだぞ。
あとはグローバルの bool operator = をオーバーライドする方法さえあればいいのに。
int f(void){return 1;}
#undef TRUE
#define TRUE f();
bool foo1 = TRUE;
861
名前:
デフォルトの名無しさん
:2005/06/22(水) 08:44:36
>>860
だから、無理。
862
名前:
デフォルトの名無しさん
:2005/06/22(水) 14:39:24
時間と手間をかけるほどの意味なし。
863
名前:
デフォルトの名無しさん
:2005/06/22(水) 17:44:57
>>855
VC7.1では1と0のリテラル以外なら整数・浮動小数点数共に警告が出た。
864
名前:
デフォルトの名無しさん
:2005/06/22(水) 22:03:37
>>835
さん回答ありがとうございます。
で、また疑問が出てきました。
あの、.netを使ってるんですけど
テンプレートのことで
.h
でテンプレートクラスとその関数を定義
.cpp
でテンプレートの関数を実装
でビルドするとリンクされてませんエラーが出ます。
このスレの過去ログで、vc6ではこのcppとhの分離が出来ないということがわかりました。
現在でもこのcppとhの分離は出来ないのでしょうか
よろしくお願いします。
865
名前:
デフォルトの名無しさん
:2005/06/22(水) 22:18:16
テンプレートは全部ヘッダに書く。これC++の決まり。
866
名前:
デフォルトの名無しさん
:2005/06/22(水) 22:20:28
exportでできるけど 可能な実装見た事ないなぁ
867
名前:
デフォルトの名無しさん
:2005/06/22(水) 22:22:45
>>866
こも
868
名前:
デフォルトの名無しさん
:2005/06/22(水) 23:21:17
>867
これですね。
ttp://www.comeaucomputing.com/
他にも
>Full C++03 core language support!
>Full TC1 support!
とか書いてありますが。
869
名前:
デフォルトの名無しさん
:2005/06/22(水) 23:28:17
>>865-867
ありがとうございます。
なるほど。
決まりだったのか・・
もやもやした疑問が解けてかなり助かりました。
これで、作業が進めれれるぞ!(・∀・)
870
名前:
855
:2005/06/22(水) 23:36:18
無理かもしれないけど、boost/mpl で何とかならんのかー('A`)
仕方ないので、comp lang c++ λ...逝って来ます・・・。
871
名前:
デフォルトの名無しさん
:2005/06/22(水) 23:45:38
>>855
VC6って、「警告をエラーとして扱う」オプションとかないの?
872
名前:
デフォルトの名無しさん
:2005/06/22(水) 23:46:00
あったと思う。
873
名前:
デフォルトの名無しさん
:2005/06/22(水) 23:59:05
>>869
進めれれるってあんた・・・
874
名前:
デフォルトの名無しさん
:2005/06/23(木) 16:04:59
>>870
http://www.artima.com/cppsource/safebool.html
これは参考にならないですか?
875
名前:
855
:2005/06/24(金) 00:55:52
>>874
おおぅ。 それっぽいことが長々と書いてある。塾読してみます。サンクス。
876
名前:
デフォルトの名無しさん
:2005/06/24(金) 18:05:38
>>871
警告の個数で停止汁ってできたんじゃ?
877
名前:
デフォルトの名無しさん
:2005/06/25(土) 02:25:53
>>871
[プロジェクト]-[設定...] メニューで出てくるダイアログの [C/C++] タブの中に
「警告をエラーとして扱う」 オプションがあるよ。
コマンドラインからなら /WX かな。
>>876
んなオプションどっかにあった?
878
名前:
デフォルトの名無しさん
:2005/06/25(土) 17:31:53
VC.NET2003で以下のようにシングルトンを実装したいのですが、
error LNK2001:
外部シンボル ""private: static class Hoge * Hoge::_h"(?_h@Hoge@@0PAV1@A)"
は未解決です。
というコンパイルエラーが出ます。
class Hoge{
public:
static Hoge& GetInstance();
private:
Hoge();
static void Instance(){
static Hoge h;
}
static Hoge *_h;
};
Hoge& Hoge::GetInstance(){
return *_h;
}
Hoge::Hoge(){
_h = this;
}
コンストラクタHoge()からstaticクラスメンバ*_hへのアクセスが、
外部シンボルとなってしまうのはなぜでしょうか?
879
名前:
デフォルトの名無しさん
:2005/06/25(土) 17:42:53
>>878
コンパイラのエラーそのまんまの意味じゃん?
どっかのcppにHoge * Hoge::_h = NULL;と書いとけ
880
名前:
デフォルトの名無しさん
:2005/06/25(土) 17:44:03
ソースファイルに
Hoge* Hoge::_h;
って書かないと。
881
名前:
デフォルトの名無しさん
:2005/06/25(土) 17:44:06
>>878
staticメンバには実態が必要。
882
名前:
878
:2005/06/25(土) 20:19:11
解決しました。
ありがとうございました。
883
名前:
デフォルトの名無しさん
:2005/06/26(日) 08:31:08
http://www.open-std.org/jtc1/sc22/wg21/
News 2005-06-26: The C++ Standard Library Issues List (Revision 37) is available
884
名前:
デフォルトの名無しさん
:2005/06/26(日) 11:45:48
2つのクラスA,Bを作り、それぞれにヘッダファイルとソースファイルを用意したとき、
/* A.h */
#ifndef _A_H_
#define _A_H_
#include "B.h"
(中略)
#endif
/* B.h */
#ifndef _B_H_
#define _B_H_
#include "A.h"
(中略)
#endif
としてしまうと、
A.hを読み込むと、B.hが読み込まれますが、さらにB.hがA.hを読み込むとき
#ifndefのせいでB.hではAが定義されていないとエラーが出るのですが
解決する方法はございませんでしょうか?
885
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:08:57
>>884
B.h から #include "A.h" を削除。
886
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:10:29
>>885
B.hを読み込むファイルもあるのです。
根本的に変更するべきでしょうか
887
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:13:02
>>884
,886
A.h から #include "B.h" を削除。
888
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:13:46
AとBは互いを参照するほど強い関係なのだから、1つのファイルにまとめてもいいだろ。
1つのファイルにまとめるほど強い関係でないのなら、クラス設計的にもっと何とかなるだろ。
889
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:15:10
>>886
B.h は A.h にインクルードされているんだから、A.hをインクルードすればいい。
890
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:15:43
>>887
それだとA.hを読み込んだときに
「Bがない」とエラーが出てしまいます。
891
名前:
884,886,890
:2005/06/26(日) 12:17:52
>>888
,889
考えてみます。
ありがとうございました。
892
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:33:35
>>891
---------[A.h]-------------
#include "B.h"
class A
{
B *pB;
;;
};
---------[B.h]-------------
class A;
class B
{
A *pA;
;;
};
---------[main.cpp]-------------
#include "A.h"
int main()
{
A a;
B; b;
;;
};
893
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:45:15
>>892
そんな方法もあったのですね。
ありがとうございました。
894
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:47:22
>>892
どちらか片方がポインタだけの利用で済むならそれが答えになるだろうが、
884 はそんな情報は示していない。
895
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:48:13
>>884
インクルードガードの先頭 _ はやめとけよ。
896
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:49:42
情報なんて不足しまくりだし、ひとつの例を示しただけですが。
897
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:54:23
>>894
,896
情報が足らずにすいませんでした。
ポインタでない場合でもできるような方法はありますでしょうか?
>>895
eclipseでクラスを作ると自動的についてくるのでそのままにしていたのですが
なにか問題が発生しますか?
898
名前:
デフォルトの名無しさん
:2005/06/26(日) 12:59:06
C/C++では規格上、アンダースコア( _ ) やダブルアンダースコア( __ ) で始まる識別子は、
処理系で予約されている。だから使うべきではない。
でも、現実問題、使われまくりだったりする。
899
名前:
855
:2005/06/26(日) 13:21:33
>>897
プリコンパイラヘッダを使い方法は?
900
名前:
デフォルトの名無しさん
:2005/06/26(日) 13:26:40
ポインタでない場合、ヘタすれば無限再帰でコンパイラも殺せる
テンプレートをマンセーしておく。
901
名前:
デフォルトの名無しさん
:2005/06/26(日) 13:27:39
>>897
前方宣言によって有効になる記述はポインタ以外にもいろいろあるが、
一言で言うと、不完全な型しか要求しない記述なら大丈夫。
「完全な型」、「不完全な型」の詳しい意味は、自分で調べてくれ。
902
名前:
デフォルトの名無しさん
:2005/06/26(日) 13:35:08
>>901
ありがとうございました。
903
名前:
デフォルトの名無しさん
:2005/06/27(月) 03:04:45
つーか#pragma onceでいいじゃん。
インクルードガードなんて馬鹿馬鹿しいから
消しまくってるよ。
904
名前:
デフォルトの名無しさん
:2005/06/27(月) 03:15:45
特定OS上の特定処理系でしか絶対に使用しないとわかっているものなら
それでも良かろう
905
名前:
デフォルトの名無しさん
:2005/06/27(月) 08:47:59
QDBMというDBMを使っているのですが
c++でvistaを使う為に
xvilla.hのソースコードの#include<villa.h>を#include<vista.h>に変えてみたり
アプリケーションのソースコードに#include<vista.h>を書いてみたのですが
普通にvilla用のデータベースファイルが作られてしまい、villaとして機能してしまっているみたいです。
vistaをc++で使う為にはどうしたらいいのでしょう?
906
名前:
デフォルトの名無しさん
:2005/06/27(月) 08:54:20
むしろインクルードするヘッダファイル名を変えただけで
置き換わるほうがまれだろう
907
名前:
905
:2005/06/27(月) 09:23:12
villa.hのシンボルをマクロでオーバーライドしているので
ヘッダファイル名をvista.hに変えるだけで良い、とマニュアルに書いてあって、
C用だと確かにヘッダのファイル名を変えるだけで上手く行くのですが
C++用はxvista.hが無いしxvilla.h内のvilla.hのインクルードをvista.hに変えてもダメだし
マニュアルにはC++はCとほぼ同じAPIが使えると書いてあったけど(ほぼなのでC++用vistaは無いのかもしれないけど)
C++用vistaについて何も書かれていないし、QDBMのWEB上の情報自体が少ないんです。
ただ、かなり優秀なソフトなので使っている人は割と多いのではと思うのですが
分かる方が居たら教えて欲しいです。
908
名前:
デフォルトの名無しさん
:2005/06/27(月) 15:57:13
やっぱりC++使う以上は、継承とかバリバリ使えないといけないのでしょうか。
ウィンドウズでVisualC++とか使っている範囲では、
殆どそんなテクニックは意識したことが無いのです。
909
名前:
デフォルトの名無しさん
:2005/06/27(月) 16:06:22
ぷらぷらでは
aho.h
class boke; //クラスの名前だけどっかにあるよ宣言
//#include "boke.h" いんくるーどはしませんよ
class Aho {
boke* m_pBoke; //ポインタ形だからクラスの名前だけあればいけるよ
};
とやってるんですがここでbokeが
typedef struct tag_boke {
...
}BOKE;
typedef struct tag_boke* LPBOKE;
とCライクに書かれている場合はどのようにbokeクラス宣言すればいいのでしょうか?
インクルードせずに
class Aho {
LPBOKE m_pBoke;
};
と書きたいのですが・・・。
typedefされたLPBOKEをインクルードせずに見る方法ってあるのかな。
910
名前:
デフォルトの名無しさん
:2005/06/27(月) 16:15:51
あるわけねーだろチンカス
そんくらい悟れや
911
名前:
デフォルトの名無しさん
:2005/06/27(月) 16:23:17
ないですよねぇ・・・。
動機としては
class Aho {
private:
Boke* m_pBoke
}
だからAhoはBokeを実装手段としてプライベートに持つ
つまりAhoクラスを使うクライアントにはBokeクラスを知る必要がない。
ということでインクルードはしたくないし、不必要
だったのですが、
今時typedefでLPなんとかとやるメリットは
どこにあるのかと思ったチンカス君でした。
912
名前:
デフォルトの名無しさん
:2005/06/27(月) 16:25:15
こうなるだけではないの?
class tag_boke;
class Aho {
tag_boke* m_Boke;
};
913
名前:
デフォルトの名無しさん
:2005/06/27(月) 16:27:48
typedef struct tag_boke* LPBOKE;
この行があれば充分だけど
914
名前:
デフォルトの名無しさん
:2005/06/27(月) 16:33:01
結局タグなんたらって書いてますが・・・
いちいち#ifndef LPなんたらもめんどいし・・・。
915
名前:
デフォルトの名無しさん
:2005/06/27(月) 16:33:22
boke_fwd.h
struct tag_boke;
typedef struct tag_boke* LPBOKE;
916
名前:
デフォルトの名無しさん
:2005/06/27(月) 16:45:57
わざわざ二箇所でtypedefするのも嫌だな・・・。
917
名前:
デフォルトの名無しさん
:2005/06/27(月) 16:49:40
boke.h
#include "boke_fwd.h"
918
名前:
デフォルトの名無しさん
:2005/06/27(月) 17:08:37
試してみたら出来た。MSすげぇ
コレが出来たら何でもありじゃん。
//struct struct_boke
//{
//int a;
//};
class class_boke
{
int a;
};
__if_exists( ::struct_boke)
{
class aho
{
::struct_boke* pboke;
};
}
__if_exists( ::class_boke)
{
class aho
{
::class_boke* pboke;
};
}
919
名前:
918
:2005/06/27(月) 17:14:23
と思ったけど
今回のケースでは役に立たんね ガクッ(x_x;
920
名前:
デフォルトの名無しさん
:2005/06/27(月) 18:30:29
c++のコードを沢山乗せるホームページを簡単に作れる
ツールってないのでしょうか?
http://www.kmonos.net/alang/boost/classes/test.html
こんな感じのホームページにしたいです
921
名前:
デフォルトの名無しさん
:2005/06/27(月) 18:50:17
>>920
お前はそこの管理人よりもずっと頭が悪いんだから無理です。
そいつは東大の学生だぞ。
922
名前:
デフォルトの名無しさん
:2005/06/27(月) 19:03:04
>>921
なんちゅー答えだw
お前は馬鹿というより幼い感じだな。
923
名前:
デフォルトの名無しさん
:2005/06/27(月) 19:14:09
c2html?
924
名前:
デフォルトの名無しさん
:2005/06/27(月) 19:34:42
>>920
そんな阿呆な質問してる奴のソースなんて、見せられても逆に困る。
925
名前:
デフォルトの名無しさん
:2005/06/27(月) 20:54:43
>>920
htmlのソース見てコピペすればすむことだろ。
926
名前:
デフォルトの名無しさん
:2005/06/27(月) 20:59:22
>>920
そしてboostに例があったりする
ttp://www.boost.org/libs/regex/doc/regex_replace.html#examples
927
名前:
デフォルトの名無しさん
:2005/06/27(月) 22:37:48
うちは Source HighLight の Win32版つかってる。
928
名前:
デフォルトの名無しさん
:2005/06/27(月) 23:32:31
要するに<PRE></PRE>でいいんじゃねーの?
929
名前:
デフォルトの名無しさん
:2005/06/27(月) 23:43:28
>>928
色とか付けたいってコトだろ
930
名前:
デフォルトの名無しさん
:2005/06/28(火) 01:25:03
Doxygenでも使っとけ
931
名前:
デフォルトの名無しさん
:2005/06/28(火) 09:44:58
カクカクシカジカさんにも置いてあるね>cpp2html
932
名前:
デフォルトの名無しさん
:2005/06/28(火) 10:53:53
クラス図を書いていて思ったのですが、C++で設計する場合、
グローバル変数は1つも使うべきではいないのでしょうか。
使ったほうが便利なケースはいくらでもありそうな気がして
ならないのです。
設計のスキルはまだ全然ないのですが、他のソースを
リバースエンジニアリングしてみてもほとんどのソースで
グローバル変数が使用されている様子ですが・・・。
933
名前:
デフォルトの名無しさん
:2005/06/28(火) 10:59:22
タトエバどんな場合?
934
名前:
デフォルトの名無しさん
:2005/06/28(火) 11:00:20
>>932
グローバル変数の是非はC++に限らず。
http://www.google.co.jp/search?q=%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0
935
名前:
デフォルトの名無しさん
:2005/06/28(火) 11:00:28
大半はクラススコープ/ファイルスコープのstatic変数だろ
とは言っても、グローバル変数はいくらでも使われてるだろうけど。
errnoとかcoutとかだって、その一種と言えないこともないし。
936
名前:
デフォルトの名無しさん
:2005/06/28(火) 11:05:53
>>932
糞ソースばかり読むな
937
名前:
デフォルトの名無しさん
:2005/06/28(火) 11:30:38
略して糞ース
938
名前:
デフォルトの名無しさん
:2005/06/28(火) 11:47:00
>>936
糞ソースじゃないソースを提示してみろと言ってみる
939
名前:
デフォルトの名無しさん
:2005/06/28(火) 12:19:57
糞だろうが何だろうが
提示できるソースをいきなりホイホイ挙げられるかよ
940
名前:
デフォルトの名無しさん
:2005/06/28(火) 12:24:16
>>939
逆ギレキタ━━━━(゚∀゚)━━━━!!
941
名前:
デフォルトの名無しさん
:2005/06/28(火) 12:38:25
まーオープンソースのものって大抵グローバル変数使われちゃってるわな。
942
名前:
デフォルトの名無しさん
:2005/06/28(火) 17:44:41
オープンソースやるやつは露出狂
943
名前:
デフォルトの名無しさん
:2005/06/28(火) 19:50:08
>>920
ソースコードを強調表示されたhtmlにしたいときは、漏れなら
-gvimのhtml変換機能で出力させる(ページがphpなら出力ファイルをinclude)
-wiki(pukiwiki codeプラグインなど)を使う
ttp://pukiwiki.org/index.php?%E8%87%AA%E4%BD%9C%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%2Fcodehighlight.inc.php
あたりを考える。
クラスの関係図とかまで出力したいときはdoxygenなのかもしれないけど
そういう設計レベルの図が必要な場合、設計段階で図を書いてるし
わざわざ使うほどのものでもないかなと。
>>928
実はPREタグの場合、template <class T>と書けない。
html special charsは<や>にしないといけない。
このフィルタを書こうとすると、「やっぱり色つきにしたい」などと夢がふくらむ罠
そしてそれは激しく車輪の再発明に。(もちろん、勉強のためにはおもしろい題材だけど)
944
名前:
デフォルトの名無しさん
:2005/06/28(火) 20:16:43
>>943
背景として、C++に限らずlisp・perl・おぞましいN88-BASICなどのソースコードも
提示することがあるから、それらすべてに対応してる既存品が楽かなと。
>>932
真にグローバルな変数は使わない方がいいと思う。
他のプロジェクトではもっとまともなのかもしれないけど、
過去のC/BASIC/Fortranのソースコードから再利用したり
担当者が4人ほど変わって引き継いだりそもそも担当はプログラム経験がほとんどない人だったり
仕様が毎日か長くて毎週変わったり
それを5年ほど続けると、もうすごいことになっています。
・・・結論まで書こうと思ったが鬱になったのでもうどうでもいいや…
945
名前:
デフォルトの名無しさん
:2005/06/28(火) 22:37:33
真と書いて「マジ」と読む?
946
名前:
デフォルトの名無しさん
:2005/06/28(火) 22:38:56
グローバルで管理したいデータってどうしたらいいのでしょう。
というのが、今回の問題です。
947
名前:
デフォルトの名無しさん
:2005/06/28(火) 22:43:23
そんな貴方にSingleton
948
名前:
デフォルトの名無しさん
:2005/06/28(火) 22:45:04
なにもわかってないな
949
名前:
デフォルトの名無しさん
:2005/06/28(火) 23:02:40
>>946
グローバルで管理したい理由、プログラムの規模、プログラムの寿命などによって答えは変わる。
950
名前:
デフォルトの名無しさん
:2005/06/29(水) 00:13:31
プログラムの規模、って言っても、表現に困るよね。
規模なんて相対的だし。客観的な表現方法ってあるの?
951
名前:
デフォルトの名無しさん
:2005/06/29(水) 00:58:13
次スレは「C++相談室 part42」です。テンプレは次でよろしく
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
専用の別スレがあるライブラリ(Boostなど)や
開発環境、IDE(VC++など)に関する質問はそちらにお願いします。
前スレ part40(実質41)
http://pc8.2ch.net/test/read.cgi/tech/1113408957/
952
名前:
デフォルトの名無しさん
:2005/06/29(水) 10:41:33
http://www.open-std.org/jtc1/sc22/wg21/
News 2005-06-28: C++ Standard Core Language Issues List (Revision 36) is available
953
名前:
デフォルトの名無しさん
:2005/06/29(水) 14:02:21
>>950
「プログラムの規模」って言いたかっただけでは?
954
名前:
デフォルトの名無しさん
:2005/06/29(水) 16:16:10
>>950
明確な基準はないと思うけど、
「いつ、どこで、どんな操作がされるかを把握できる」
かどうかに懸かってるんじゃなかろか。
例えばログファイルにメッセージ書くクラスがあって
それが「書き込み」という操作しかなければ
グローバルにインスタンス作ってもいいわけで。
955
名前:
デフォルトの名無しさん
:2005/06/29(水) 16:44:44
グローバル変数の欠点を理解してない意見も混ざってる気がする。
publicでstaticな変数との違いは、
クラス宣言に書く必要が無いからこっそり使ったりする事が可能だって事と、
大規模なプログラムの場合、名前の衝突が管理出来なかったり、
VCみたいな賢いIDEが使えない場合に型の確認が面倒だって事くらいだろう。
publicでstaticな変数にも共通する欠点は色々あるから、
それを許すかどうかもはっきりさせた方がいいわな。
どっちにしろ、「使わなくても出来るけど手抜きでやってる」って事を意識しとくべき。
956
名前:
デフォルトの名無しさん
:2005/06/29(水) 16:50:54
MFC使うとグローバル変数の一個大隊がついてくるからなぁ。
957
名前:
デフォルトの名無しさん
:2005/06/29(水) 17:48:09
グローバル変数が0で済むプログラムってのもどんだけちっちゃいんだよって思うけど。
まぁクラスにきちんとまとめて、それも全部publicとかじゃなくて丁寧にアクセス制御しとくんだろうな
958
名前:
デフォルトの名無しさん
:2005/06/29(水) 19:58:18
クラステンプレートの内側に、クラステンプレートの特殊化版をネスト定義できない件について。
ふぬおおおソースがきちゃなくなるんじゃあああヾ(`□´)ノ
959
名前:
デフォルトの名無しさん
:2005/06/29(水) 20:43:25
?
コンパイラが古いんジャマイカ。
VC++6.0ではネストできんかった。
VC++.NETではネストできた。
960
名前:
959
:2005/06/29(水) 20:43:44
?
.NET 2003ね。
961
名前:
デフォルトの名無しさん
:2005/06/29(水) 23:08:21
>>959
g++だと意図的に対応していないようであります
標準のappendixで禁止しているかららしい。
関数内関数定義とか、templateの宣言・定義の簡略化とか
C++0xで変わったらいいなあ。
962
名前:
デフォルトの名無しさん
:2005/06/30(木) 01:08:31
WindowsプログラミングをしようとするとWinMainとWndProcの兼ね合いとかでほとんど無理だけどな>グローバル0
963
名前:
デフォルトの名無しさん
:2005/06/30(木) 01:26:43
?
>>962
とりあえずフレームワークさえ構築してしまえば
表だったグローバル変数は使わなくて済むと思う。
まぁ俺は安易にグローバル変数使っちゃう族だが。
964
名前:
デフォルトの名無しさん
:2005/06/30(木) 02:04:38
いや、ウィンドウプロシージャごときで静的変数なんかつかわねーだろ普通
965
名前:
デフォルトの名無しさん
:2005/06/30(木) 02:10:20
>>951
結局、STLはここでいいんだよね?
966
名前:
デフォルトの名無しさん
:2005/06/30(木) 02:28:18
>>965
いいはずでしょ、標準の一部だし。
967
名前:
デフォルトの名無しさん
:2005/06/30(木) 03:17:57
このスレの1が変なのか
968
名前:
デフォルトの名無しさん
:2005/06/30(木) 07:30:17
STLスレを立てるやつが変。
969
名前:
デフォルトの名無しさん
:2005/06/30(木) 15:39:33
デバッグしてみたら
-1.#IND000000000
-1.#INF000000000
こんな数字が変数に入ってるんだけどこれは何なのでしょうか?
970
名前:
デフォルトの名無しさん
:2005/06/30(木) 16:24:42
>>969
数値以外の値。
前者はなんだろう。
後者は負の無限大かな?
いずれにしても、C++の問題というよりデバッガの問題だよな。
971
名前:
デフォルトの名無しさん
:2005/06/30(木) 16:39:51
INDって何の略ですか?
972
名前:
デフォルトの名無しさん
:2005/06/30(木) 16:56:01
>>969-971
前者は「不定」で恐らくは-0/0の結果。
後者は「無限大」で恐らくは-1/0の結果。
973
名前:
デフォルトの名無しさん
:2005/06/30(木) 17:24:04
なんかシンプルな行列やベクトルライブラリありませんか?
DirectXのD3DXVECTORぐらいでいいのですが、環境に依存しないやつほしいです。
974
名前:
デフォルトの名無しさん
:2005/06/30(木) 17:33:48
boostなり自分で作るなり
975
名前:
デフォルトの名無しさん
:2005/06/30(木) 17:44:42
>>973
ttp://www.objectclub.jp/download/vecmath1
こんなん?
976
名前:
デフォルトの名無しさん
:2005/06/30(木) 17:59:58
>>973
gslとかliboctaveとか
977
名前:
デフォルトの名無しさん
:2005/06/30(木) 18:09:53
>>971
Indeterminate
978
名前:
デフォルトの名無しさん
:2005/06/30(木) 18:51:49
>>974
boostのベクトルも探してる最中なんですが、
2次元3次元のベクトルよりquaternion、octonionやらが先に見つかってしまいます。
どこかな・・・。
>>975-976
ありがとうございます。
そーゆーのです。
といってもいろいろあると目移りしてしまいます・・・。
979
名前:
デフォルトの名無しさん
:2005/06/30(木) 19:02:32
>>978
>どこかな・・・。
ublas
980
名前:
デフォルトの名無しさん
:2005/07/01(金) 01:13:04
スレ違いかもしれないどうしようもない質問をしてしまうのですが
自分は今までプログラムをやった事がないものの、来週からC++をやろうとしています
ここで質問ですが、C++をやるに当たって最初に必要なものはなんでしょうか?何か買う必要があるのでしょうか?
幾ら調べても本当にわけが分かりません、コンパイラーというのが有れば出来るものなのでしょうか?ご指導をよろしくお願いいたします。。
981
名前:
デフォルトの名無しさん
:2005/07/01(金) 01:17:13
>>980
コンパイラーと、あとはテキストエディタが要るだろうな。
しかしここはスレ違いだ。
何か始めて、行き詰まったらまず↓こっち行け。
http://pc8.2ch.net/test/read.cgi/tech/1119793525/
ここの過去ログやリンクを漁れば、初心者の質問は大抵カタがつく。
982
名前:
デフォルトの名無しさん
:2005/07/01(金) 01:20:18
>>980
どうして突然C++をやることになったのかが興味がわきますね。
とりあえず友達にプログラマを見つけて、ある程度のレベルまでは教えてもらうのが早いかと。
983
名前:
デフォルトの名無しさん
:2005/07/01(金) 01:24:04
>>980
Microsoft Visual C++ Toolkit 2003 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1109618655/6-12
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
貼っときますね
プログラミングやってる奴がキモいです><
ttp://ex11.2ch.net/test/read.cgi/news4vip/1120152486/
987
名前:
デフォルトの名無しさん
:2005/07/01(金) 02:45:23
>>984-985
using namespace boost::lambda;
std::for_each(a, a + 10, bind(&A::a, _1) = 10);
988
名前:
デフォルトの名無しさん
:2005/07/01(金) 02:50:27
>>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
>>987-988
lambdaを使うんですね、ありがとうございました。
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' に対してではない参照は 非左辺値へバインドできません。」
とでます。どういう意味でしょうか?
992
名前:
デフォルトの名無しさん
:2005/07/01(金) 06:24:00
煮詰まったので質問します。
型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使う意味があるんでしょうか?
993
名前:
デフォルトの名無しさん
:2005/07/01(金) 06:34:31
>>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というのは使い道が見えません。
普通に直で関数オブジェクト書いちゃった方が楽な気がする・・
995
名前:
デフォルトの名無しさん
:2005/07/01(金) 09:23:58
>>994
ttp://boost.cppll.jp/HEAD/libs/lambda/doc/ar01s05.html#sect:nested_stl_algorithms
996
名前:
デフォルトの名無しさん
:2005/07/01(金) 10:59:36
@string型をint型にキャストするにはどーすればいいんですか??
StrToIntとかToIntという関数があるようですが,
これでは駄目なようで困っています.
Aファイルから1行を切り出すにはどうすればいいんですか??
40文字ずつ改行しながら別のファイルに出力させていくという
プログラムを作りたいのですが,
char *c;
fileReader.get(c, number, '\n');
のようにしてnumberが21くらいになるとメモリがreadにならないという
エラーメッセージが出てきます.どうしてでしょうか??
997
名前:
デフォルトの名無しさん
:2005/07/01(金) 11:21:46
>>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使う
998
名前:
デフォルトの名無しさん
:2005/07/01(金) 11:41:15
>>992
>型AとBが同じ型のときtrueを、異なる型のときfalseを返すクラステンプレート
これだけが必要なら別に外側だけ特殊化すればよいような気がします.
>外側のクラステンプレートは特殊化せず、内側だけを特殊化したいのです。
これは言語規格的に無理です.
999
名前:
デフォルトの名無しさん
:2005/07/01(金) 12:29:57
999
1000
名前:
デフォルトの名無しさん
:2005/07/01(金) 12:30:09
ギリギリまで真面目に話してるおまえらにもえ
■過去ログ置き場に戻る■
1-
前250
次250
最新50
DAT2HTML
0.33f Converted.