■過去ログ置き場に戻る■ 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.