1 :デフォルトの名無しさん2011/11/04(金) 01:58:02.00
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part91
http://hibari.2ch.net/test/read.cgi/tech/1315922506/

このスレもよろしくね。
http://hibari.2ch.net/test/read.cgi/tech/1312621728/

ついでに壁紙にしてね。
http://www2.research.att.com/~bs/Bjarne.jpg
7 :デフォルトの名無しさん2011/11/04(金) 07:40:38.35
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

地鎮祭終了>>1乙
9 :デフォルトの名無しさん2011/11/05(土) 19:50:36.17
>>1
おつ
2 :デフォルトの名無しさん2011/11/04(金) 01:58:53.59
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://en.cppreference.com/w/cpp (英語)
 http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
 http://www2.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。
3 :デフォルトの名無しさん2011/11/04(金) 01:59:43.54
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
11 :デフォルトの名無しさん2011/11/05(土) 23:55:51.53
びよーんすぽすぽがどうした?
13 :デフォルトの名無しさん2011/11/06(日) 15:39:49.29
>>11
愛玩用人工知能KAZAMAを開発して地下室で生活してたのがバレた。
14 :デフォルトの名無しさん2011/11/06(日) 21:20:47.23
禿本 4th マダー?tntn
俺あいつの語り口がけっこー好みなんだが入門いらね
15 :デフォルトの名無しさん2011/11/06(日) 22:00:17.24
英語で読むのか、なあ、英語で読んじゃうのかウワァァァァァァヽ(`Д´)ノァァァァァァン!
16 :デフォルトの名無しさん2011/11/06(日) 22:24:07.01
>>15
英語英語がたがた抜かすな。
コードは世界共通だ。
恐れることはない。
19 :デフォルトの名無しさん2011/11/07(月) 01:50:25.19
class A{
public:
virtual void B(){
//何か
}
void C(){
B();
}
};
class exA:public A{
public:
void B(){
//何か
}
};

exA ex;
ex.C();//class AのB関数を呼ぶ。

exAのC()でclass AのB関数でなくclass exAのB関数を呼び出してもらいたいんだけど、

C関数をvirtualにしてexA関数で再定義する以外に方法ある?
22 :デフォルトの名無しさん2011/11/07(月) 02:00:20.97
>>19
意図してる方法かしらんけど、
Cの中で、A::B();とすれば、AのB()が呼ばれるようになる。
ただし、派生先がどうであれ、B()は常にAのB();が呼ばれてしまう。
あとは、テンプレを使って、Type::B()の形式で呼び出すとか。
23 :デフォルトの名無しさん2011/11/07(月) 02:35:35.29
>>20
糞ですまん。
C関数の中のB関数以降は全く同じ処理だから楽出来るかなとおもいまして。

>>21
ネーミングは気にしないでくれ。

>>22
template<class Func>
void C(){
Func::B();
};
こんな形ですか?
24 :デフォルトの名無しさん2011/11/07(月) 07:37:16.19
>>19
そのソースで意図した動作ができてると思うんだけど、何か気に入らないの?
http://codepad.org/ENTqMxOP
20 :デフォルトの名無しさん2011/11/07(月) 01:56:02.79
exAでBをoverrideしなきゃいいんじゃね。
てか、親classから派生classの関数を呼び出す処理は往々にして糞だ。
21 :デフォルトの名無しさん2011/11/07(月) 01:59:16.20
ネーミングセンスがないな
26 :デフォルトの名無しさん2011/11/07(月) 09:43:22.64
共変の戻り値とNVIイディオムを同時に使おうとするとやはり変
仮想関数の意味ないんじゃねこれじゃ

struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { std::puts("Base::put"); }
private:
virtual Base* duplicate_xxx () { return this; };
};

struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
void put() const { std::puts("Derived::put"); }
private:
virtual Derived* duplicate_xxx () { return this; };
};

int main()
{
Base* b = new Derived;
Derived* d = new Derived;

b->put();
d->put();

delete d;
delete b;
}
27 :デフォルトの名無しさん2011/11/07(月) 10:14:33.26
>>26
そのコードでどんな動作を期待してて何がどう変なんだ?
29 :デフォルトの名無しさん2011/11/07(月) 10:22:07.44
>>26
duplicate()がスマートポインタを返す設計で使えるかも?
31 :デフォルトの名無しさん2011/11/07(月) 11:04:28.61
>>27
仮想関数ならb->putでDerivedの方のput()を呼び出してくれるんじゃないのかい
33 :デフォルトの名無しさん2011/11/07(月) 12:05:24.51
>>31
putが仮想関数ならそうだが>>26のputは仮想関数ではないしNVI使ってもないだろ。putにNVI使うなら

struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Base* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Base::put"); }
};

struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
private:
virtual Derived* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};
34 :デフォルトの名無しさん2011/11/07(月) 12:55:35.63
>>33
サンクス
なるほどduplicateではなくてputをNVIイディオムにしなければいけないのでした
やろうとしていた事はduplicateが返したthisからputを呼び出す事でした
勘違いしてたようです
30 :デフォルトの名無しさん2011/11/07(月) 11:04:13.01
C++11 の変更点をまとめた専門書ってありますか?
37 :デフォルトの名無しさん2011/11/07(月) 13:01:48.66
>>30
MayersがPDF売ってるよ
36 :デフォルトの名無しさん2011/11/07(月) 13:01:44.70
これでOKでしたありがとうございました

struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Base* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Base::put"); }
};

struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Derived* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};

int main()
{
Base* b = new Derived;
Derived* d = new Derived;

b->duplicate()->put();
d->duplicate()->put();

delete d;
delete b;
}
38 :デフォルトの名無しさん2011/11/07(月) 13:58:15.69
>>36
duplicateをどういうものにしたいのかわからないけど(Derived*を返す必要が本当にあるのか?)
基底クラスのpublicな非仮想メンバ関数を派生クラスで再定義・隠蔽するのはNVIではないよ

struct Base {
Base * duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Base * duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Base::put"); }
};

struct Derived : public Base {
private:
virtual Base * duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};

int main()
{
Base * b1(new Base);
Base * b2(new Derived);
Derived * d(new Derived);

b1->duplicate()->put();
b2->duplicate()->put();
d->duplicate()->put();

delete d;
delete b2;
delete b1;
}
39 :デフォルトの名無しさん2011/11/07(月) 14:54:27.17
>>38
NVIと仮想関数の返す値を共変にするのを両立させたかったんです
やはり両立は無理ですかね?
40 :デフォルトの名無しさん2011/11/07(月) 17:14:17.92
>>39
NVIは継承に関して不変だからムリだな
おとなしく仮想関数をインターフェースにしたほうがいいと思うよ
42 :デフォルトの名無しさん2011/11/07(月) 17:20:59.14
>>40
いやここ見てたんですよ

http://d.hatena.ne.jp/tueda_wolf/20110125/p1

という事はこのブログは間違いですかね?
43 :デフォルトの名無しさん2011/11/07(月) 17:34:50.92
>>42
もしもしなのでちょっと読んだだけだけど、これは単にそれっぽく隠蔽しただけなのでは……
仮想関数使った共変と振る舞いが一致しない場合があると思うんだけど


あと
>隠蔽(オーバーロード)
ってのは確実に誤りだな
45 :デフォルトの名無しさん2011/11/07(月) 17:56:36.65
共変返り値ってあって嬉しかったこと一度もないんだけどどんなときに使うの?
47 :デフォルトの名無しさん2011/11/07(月) 23:12:21.62
>>45
派生クラスメンバーの戻り値をコピーしたい場合。

Base b = object.OrverrideFunction(); //OrverrideFunctionは親の定義だとBase
Derived d = object.OrverrideFunction(); //共変の戻り値が使えないとコンパイルエラー
48 :デフォルトの名無しさん2011/11/07(月) 23:22:06.84
>>47
そのobjectの型はDerivedなんでしょ?
だったら別にわざわざオーバーライドした関数呼ぶ必要ないじゃん
46 :デフォルトの名無しさん2011/11/07(月) 18:02:50.52
よく考えると確かにないですね
どうせ返り値ってポインタだし、仮想関数で勝手に切り替えてくれるのですから
基底クラスへのポインタが返ればそれにNVIを適用すれば十分なはずです
50 :デフォルトの名無しさん2011/11/07(月) 23:25:41.14
struct Base {};
struct Derived : Base {};

struct BaseObj { virtual Base & OverridedFunction(); };
struct DerivedObj { Derived & OverridedFunction(); };

DerivedObj object;


じゃあこういう状況?
51 :デフォルトの名無しさん2011/11/07(月) 23:27:19.72
>>50
そういう話
52 :デフォルトの名無しさん2011/11/07(月) 23:35:22.88
>>51
DerivedObjの型がわかってるなら仮想関数を使う必要性がないのでは?
まあべつに使ってもいいけどオーバーヘッド増えるからこうしたほうがいいでしょ

struct DerivedObj : BaseObj {
/*inline*/ Derived & NonOverrided();
virtual Derived & OverridedFunction() { return NonOverrided(); }
};

Derived d = object.NonOverrided();
53 :デフォルトの名無しさん2011/11/07(月) 23:40:32.75
>>52
親クラスほっといて、子クラス単品で使う分にはオーバヘッドはない。

DerivedHolder object;
Deriverd d = object.OverrideFunction();
(BaseHolder*)にobjectを突っ込んでるわけじゃないのでインライン展開される
55 :デフォルトの名無しさん2011/11/08(火) 23:57:43.27
classの継承でpublic継承はよく使うけどprivate継承とprotected継承はどんな時に使うの?
59 :デフォルトの名無しさん2011/11/09(水) 01:51:38.78
>>55
プライベートは「それを実装手段とする」
プロテクテッドは不明。

ってメイヤーが。
64 :デフォルトの名無しさん2011/11/09(水) 21:02:09.32
>>55
class Base
{
protected:
      virtual int Handle(void) = 0;
      static int PeekHandle( Base &base ) { return Handle(); }
};

struct Derived:private Base
{
       Derived( Base &base ){ int handle = PeekHandle( base );
};

privateならこういう使い方もある。
Derivedは他のBaseを覗き見るが、自分は見られないようにできる。
protected継承した場合は、その派生クラスがわざわざもう一回、
Baseを継承しなくて済むようになる。
60 :デフォルトの名無しさん2011/11/09(水) 02:00:18.67
private継承はあるクラスの内部処理に別のクラスのprotectedメンバを使いたいがpublicメンバは公開したくないときとかに使う、らしい
61 :デフォルトの名無しさん2011/11/09(水) 07:19:46.96
noncopyableの場合はnoncopyableにアップキャストしたくないからprivate継承する
メンバを公開しないだけじゃなく、
アップキャストとスライシングを禁止するために使える
62 :デフォルトの名無しさん2011/11/09(水) 09:57:08.59
非virtualデストラクタを持つクラスを継承するときにprotectedを使うらしい
63 :デフォルトの名無しさん2011/11/09(水) 10:36:30.86
>>62
private に比べて何がうれしいの?
65 :デフォルトの名無しさん2011/11/09(水) 21:49:59.60
>>63
公開したいメンバをpublicでusingすれば
あとはそのままアクセス制限を継承できるからじゃね?
まあさらに継承しない場合は関係ないだろうけど
66 :デフォルトの名無しさん2011/11/09(水) 23:49:04.92
>>65
ごめん private との違いが見えてこない。
67 :デフォルトの名無しさん2011/11/10(木) 00:52:32.65
>>65
そういや、あのusingって何のためにあるんだっけ?
単に 親クラス::メンバー; って書いても同じだよね。
69 :デフォルトの名無しさん2011/11/10(木) 01:04:18.25
>>66
そういやprotected継承だと孫クラスが、thisを親クラスを引数にとる関数に渡せるって点がある。
private継承だと、孫と親は同じオブジェクトだと解っててもキャストできない。
親クラスを取る関数に孫を渡したいが、外部からむやみに親にアクセスされたくない場合に多少つかえる。
71 :デフォルトの名無しさん2011/11/10(木) 01:14:06.20
>>69
protected データメンバ並みに要らんな。
72 :デフォルトの名無しさん2011/11/10(木) 01:14:32.49
>>69 C++ でおk
89 :デフォルトの名無しさん2011/11/10(木) 19:50:26.59
>>66
protectedメンバをprotectedメンバのままにしておきたい場合に
protected継承する事になる、ということ
private継承すると、protectedメンバをprotectedメンバのままにするには
protectedなとこで全部usingしないといけなくなる
68 :デフォルトの名無しさん2011/11/10(木) 00:55:15.03
派生クラスは継承したんじゃなかったんかいバカヤロー
に対するしどろもどろな顛末が using
70 :デフォルトの名無しさん2011/11/10(木) 01:10:10.38
>>68
ん? 親クラス::メンバー; じゃ孫からは、メンバーとみなされないってこと?
73 :デフォルトの名無しさん2011/11/10(木) 02:41:42.27
protectedが必要になった時点で何かおかしいから見直す
74 :デフォルトの名無しさん2011/11/10(木) 02:53:20.98
>>73
protectedデストラクタは必要だろ
87 :デフォルトの名無しさん2011/11/10(木) 17:40:12.71
>>85
>>74-75
77 :デフォルトの名無しさん2011/11/10(木) 09:15:07.29
protected は中途半端。
方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
78 :デフォルトの名無しさん2011/11/10(木) 12:35:07.45
>>77
そういうのをpublicにするの?おかしいだろう
派生クラスにだけ公開すると機能は明確だし。必要な時だけ使えばいいんだし
92 :デフォルトの名無しさん2011/11/10(木) 23:53:35.57
>>78
public にすれば機能が不明確になったり、必要でもないのに無理やり使わされたりするような
言い方だけど、そんなことはないよね。
93 :デフォルトの名無しさん2011/11/11(金) 00:13:50.03
>>77
そのネタは通じなかったみたいだな
94 :デフォルトの名無しさん2011/11/11(金) 00:29:47.00
>>77
乙女心は難しいよな
95 :デフォルトの名無しさん2011/11/11(金) 00:35:47.41
>>77
財産は子供にだけ渡したい。
私の財産はみんなの共有物じゃない。

中途半端?
継承なんだから、親子関係と強欲具合で考えればいいんだよ
96 :デフォルトの名無しさん2011/11/11(金) 00:40:12.46
>>95
知らない誰かがいくつでも勝手に追加するものを「子供」だなどと考えるのは無理があるだろう。
97 :デフォルトの名無しさん2011/11/11(金) 01:05:29.24
>>96
ファイルスコープ限定して子の制約は出来るが。
尤も。protectedの用途(protected継承に限らず)は、
子に抽象化関数を実装することを義務付けた上で
機能提供することだろうがな。
99 :デフォルトの名無しさん2011/11/11(金) 01:09:07.16
>>97
ファイルスコープ内を信用するなら public でもいいじゃん。
79 :デフォルトの名無しさん2011/11/10(木) 13:51:48.52
中途半端って、当たり前やん
もともと private と public しかなく、後付けで追加したトリビアなんだから
80 :デフォルトの名無しさん2011/11/10(木) 14:16:34.87
サブクラスには公開したいがサブサブクラスには見せたくない
でも継承をサブクラスに限定するノーコストの方法も無い
よってprotectedはゴミ
81 :デフォルトの名無しさん2011/11/10(木) 14:18:46.97
protectedはどうしてもそれしか方法が無いときに
仕方なく使うもの。汚いことを自覚した上で。
82 :デフォルトの名無しさん2011/11/10(木) 14:31:16.80
他に書き方があるからどうしてもっていうケースは存在しない
よってprotectedは生ゴミ
83 :デフォルトの名無しさん2011/11/10(木) 15:27:21.24
>>82
まあそうなんだけど、大人の事情でって事あるじゃん
85 :デフォルトの名無しさん2011/11/10(木) 17:37:38.18
protectedデストラクタは必要だろ
100 :デフォルトの名無しさん2011/11/11(金) 09:14:19.38
protectedよりfriendの方がましだわ
子には公開できて孫には公開しないとか簡単にできるし
protectedでは簡単に間違いが起こってしまう
102 :デフォルトの名無しさん2011/11/11(金) 14:29:00.39
friendはゴミ
103 :片山博文MZ ◆0lBZNi.Q7evd 2011/11/11(金) 16:15:13.72
>>102
友達できないタイプですね。
みんな友達になればアクセスが簡単。冗談だけど。
106 :デフォルトの名無しさん2011/11/11(金) 21:28:32.42
親クラスに付けるprotectedはともかく、
メンバーに付けるprotectedは、親クラスじゃなく
子クラスを守るための物だろ。
子が生成したバッファを親に参照させるとかの用途には
friendじゃ代用品にならない。
108 :デフォルトの名無しさん2011/11/11(金) 21:53:14.61
class Derived:public Base
{
      Channel channel;
public:
      Derived()
      {
           Bind( &channe l);
      }
};
Channel channel;
Derived object;
object.Bind( &channel ); //エラー

friendで似たことすると、
Channel channel;
Derived object;
Bind( &object, &channel ); //コンパイルが通ってアウト

そもそも用途が違う。どちらかが代用になるもんじゃない。
111 :デフォルトの名無しさん2011/11/11(金) 22:06:38.70
class Base
{
friend class Derived;
private:
void Bind(C * c);
};
class Derived: private Base
{
C c;
public:
Derived() { Bind(&c); }
};
112 :デフォルトの名無しさん2011/11/11(金) 22:08:29.14
>>111
子クラス制限してどうすんだよw
親を守ることが目的じゃないんぞ
114 :デフォルトの名無しさん2011/11/11(金) 22:11:50.18
>>111
Socket, File, Pipe, Mail, 派生が出来るたびに追加すんのかい
派生クラスがいくら出来ても問題ないのに
113 :デフォルトの名無しさん2011/11/11(金) 22:11:35.76
template <class Derived> class Base
{
friend class Derived;
void Bind(X & x);
};

class Derived: Base<Derived>
{
X x;
public:
Derived(void) { Bind(&x); }
};

これで親も子も完全に守られてるのでprotectedの出番はない
115 :デフォルトの名無しさん2011/11/11(金) 22:14:31.91
>>113
Base同士の互換性がなくなるな
116 :デフォルトの名無しさん2011/11/11(金) 22:14:35.18
>>114
>>113
118 :デフォルトの名無しさん2011/11/11(金) 22:19:59.05
>>113
バイナリ肥大するだけじゃん
friendに拘って何がしたいの?
117 :デフォルトの名無しさん2011/11/11(金) 22:19:35.82
class Base {
protected:
void Bind(C * pC);
};

class Derived: public Base {
C c;
public:
Derived(void) { Bind(&c); }
};

class Unko: public Base {
public:
static void Bind(Base & b, C * pC) { b.Bind(pC); }
};

Derived d;
C c;
Unko::Bind(d, &c);

あーあ、protected厨のせいで大事故だよ
friendにしとけばこんなことはなかったのにな
119 :デフォルトの名無しさん2011/11/11(金) 22:22:25.26
>>117
子が守られようとしてるのに、何で子に自殺させてんの?バカなの?
120 :デフォルトの名無しさん2011/11/11(金) 22:25:33.04
>>119
わかってねーな
自殺させちゃうカスグラマがどこに潜んでるかわからねーのが現場の怖いところだろうが
とにかくまずい事は簡単にはデキないようにすることが至上命令だ
122 :デフォルトの名無しさん2011/11/11(金) 22:27:41.70
>>120
困るのはUnkoなだけで、
他は困らんから大した問題じゃない。
131 :デフォルトの名無しさん2011/11/11(金) 23:16:47.29
>>129
>>117に対処できない半端な対応
friendには1歩及ばないな
132 :デフォルトの名無しさん2011/11/11(金) 23:21:54.95
>>131
Unkoからアクセスできなくなるわけだけど、言語仕様解ってんの?
133 :デフォルトの名無しさん2011/11/11(金) 23:26:02.15
>>132
適当なこと言うな
125 :デフォルトの名無しさん2011/11/11(金) 22:37:19.85
いやわかってねえよwww
ベースを根元まで熟知してないと安全に継承できないとかどんだけ馬鹿な設計なんだよ
128 :デフォルトの名無しさん2011/11/11(金) 22:45:12.25
自分が使えないからってprotectedの存在を拒否しなくてもいいのよ
129 :デフォルトの名無しさん2011/11/11(金) 22:45:15.58
派生先からアクセスできなくすることもできるが。

class Derived:public Base
{
      Channel channel;
      Base::Bind;
public:
      Derived()
      {
           Bind( &channe l);
      }
};
134 :デフォルトの名無しさん2011/11/11(金) 23:36:57.38
信じられないなら手元のコンパイラでコンパイルしてみたら?
135 :デフォルトの名無しさん2011/11/11(金) 23:43:48.77
参りました
これからはprotectedを使いまくります
protected最高ですね
protectedのない生活は今後考えられません
protectedを使わない奴は情弱ですね
136 :デフォルトの名無しさん2011/11/11(金) 23:47:18.14
誰も全てにprotected使えとは言ってないんだがねぇ
方法はいくつもあるのにシンプルに済むことを
ひとつの方法に拘って複雑にしなけりゃいい
138 :デフォルトの名無しさん2011/11/12(土) 09:27:49.77
-std=c++0xを指定した状態で

char* s;
s = {1,2,3,4}

が、エラー: assigning to an array from an initializer list になるのですが
以前のバージョンだと出ませんでした。
仕様が変わったのでしょうか



140 :デフォルトの名無しさん2011/11/12(土) 12:23:20.07
ありがとうございます。
似たような表記で書くにはどうすればいいですか?
144 :デフォルトの名無しさん2011/11/12(土) 13:03:01.81
文字列、配列リテラルを初期値とするポインタの宣言const付いてないとエラーにして欲しい
146 :デフォルトの名無しさん2011/11/12(土) 18:33:38.94
配列リテラルを初期値とするポインタの宣言なんて規格違反だぞ
文字列はできてたけどC++11で禁止された
147 :デフォルトの名無しさん2011/11/12(土) 20:39:39.30
教えて下さい

関数内で作られる、無名一時オブジェクトはどのメモリ領域に格納されるんでしょうか?
スタック、ヒープ/フリーストア、静的領域?

つまるところ、↓の f() と g() では、どっちが速いんでしょうか?

ttp://ideone.com/PJ75c
148 :デフォルトの名無しさん2011/11/12(土) 20:42:54.25
>>147
実装依存だがどちらもスタックになるだろう。
その前になぜ自分で測定しない?
150 :デフォルトの名無しさん2011/11/12(土) 20:47:56.91
>>147
無名オブジェクトはスタックに作られる。
同じか、fがムーブ可能な場合速くなる可能性がある
152 :デフォルトの名無しさん2011/11/12(土) 21:10:36.69
>>147
そのコードだと完全にコンパイラ次第。
同じコンパイル単位にある関数はinline指定子の有無を無視して
インライン展開するコンパイラが多い。
153 :デフォルトの名無しさん2011/11/12(土) 21:16:39.50
>>147
gでXをstatic constしといたらもっと早いんじゃね?とか思ったけどどうなんだろ
156 :1472011/11/12(土) 22:13:49.42
スタックに積まれるんですね

>>150
確かに、ムーブを考えると無名一時オブジェクトの方が、速くなる可能性がありますね
盲点でした

コンパイラの最適化と、ムーブに期待して、無名一時オブジェクトで書くことにします
皆さん、アドバイスありがとうございました
151 :デフォルトの名無しさん2011/11/12(土) 20:51:26.80
テンポラリを直接放り込んだほうが最適化しやすいし早くなるよ
158 :デフォルトの名無しさん2011/11/12(土) 22:23:20.31
期待するとかじゃなく、スタックトレースとかアセンブリみて確認しとけよ
159 :デフォルトの名無しさん2011/11/12(土) 22:27:18.96
そんなもん見たって環境代わったら同じにはならない
大まかな傾向だけ理解して書ける方が偉いわ
162 :デフォルトの名無しさん2011/11/12(土) 22:46:03.16
大まかな傾向を理解するために、実際の動作をしらべるんだろ。
理屈上そうなるから多分そうなるだろうじゃ根拠が薄いだろ。
165 :デフォルトの名無しさん2011/11/12(土) 23:40:59.79
あくまで規格票に従えよクソ

実験で何を調べようとしているのかの論点も違っていそうだな
本番ではなく「実験」では規格合致度に重きをおく

合致度の低いコンパイラや、合致度はそこそこでも現にバグを見つけたりしたとき
クソっていう対象がコンパイラな単純低次元はどっかいけ
目の前の現実への自分の対応をクソと謙虚に自省する人には助太刀いたすかって気にはなる
166 :デフォルトの名無しさん2011/11/12(土) 23:56:25.79
最適化はコンパイラの裁量だから、
コンパイラの動作を観察するしかねぇだろボケ
168 :デフォルトの名無しさん2011/11/13(日) 00:29:52.34
VCは糞だろ。
174 :デフォルトの名無しさん2011/11/13(日) 07:04:48.48
>>168
mfcが糞で、c++11に準拠する気がまるで無いだけで、コンパイラとしては速いコード吐く方


173 :デフォルトの名無しさん2011/11/13(日) 03:42:53.05
最適化がされるか否かはコンパイラによって違うだろうが、
そのコードが最適化され易いかどうかは共通だぞ
175 :デフォルトの名無しさん2011/11/13(日) 11:04:12.44
未だにMFCで新規開発してるところってあるんかね。
Qt触るとMFCが汚物過ぎて受け付けん。
176 :デフォルトの名無しさん2011/11/13(日) 11:21:03.59
MFCは設計が古いからだろうね。
マイクロソフトがまだテンプレートにもダイナミックキャストにも
否定的だった時代に作られたものらしいし。
178 :デフォルトの名無しさん2011/11/13(日) 15:32:48.49
MFCはしょうがないじゃん。Win32の薄いラッパーでしかないから。
179 :デフォルトの名無しさん2011/11/13(日) 15:46:00.90
COM統合してることを考えると薄いラッパーとは言えないのでは。
薄いどころかがっつりフレームワークだと思うけど。
183 :デフォルトの名無しさん2011/11/13(日) 16:57:00.85
>>179
ロクな枠組みが無いんだからフレームワークは言い過ぎ。
あくまでC++用ラッパーの域は出ないよ。
180 :デフォルトの名無しさん2011/11/13(日) 15:52:01.24
VS2010で、MFCプロジェクト作ってビルドしてみたらすごいことになってた。
MSはまだやる気まんまんじゃないか。
184 :デフォルトの名無しさん2011/11/13(日) 21:57:28.34
超初心者ですみません
vc++とかでプロジェクトの設定をする時に
includeのパスを通すのは分かるんですが
libにパスを通す意味ってなん何でしょうか
186 :デフォルトの名無しさん2011/11/13(日) 22:06:28.67
>>184
ヘッダファイルじゃなくてライブラリのディレクトリパスを指定する
188 :デフォルトの名無しさん2011/11/13(日) 22:10:06.49
>>186
ありがとうございます。
ライブラリのファイルを読んでくることの必要性というのは何なのでしょうか
includeは、
#include <stdio.h>
などでよく使うので馴染みがあるのですが
初心者ゆえライブラリというものをどういう時に使うのかが分からないのです。
191 :デフォルトの名無しさん2011/11/13(日) 22:43:09.25
>>188
ライブラリを使いたい時に使う、としか
DXライブラリでも使ってみれば?
192 :デフォルトの名無しさん2011/11/13(日) 22:50:05.42
>>188
コンパイルとリンクの区別がつかないと理解できないかもね
ヘッダーファイルはコンパイル時に必要になるもの。
ライブラリはリンク時に必要になるもの。

ヘッダーは宣言が書いてあり(そうとは限らないが)、ライブラリーにはその実装が記述されてる。
ヘッダーとライブラリーは直接関連付けられているものじゃないから、
どちらか片方指定したからといって、もう一方が自動で取り込まれることはない。
185 :デフォルトの名無しさん2011/11/13(日) 21:58:13.23
Win32 VCL WTL wxWidget Qt WinForms WPF Swing AWT
これらは使い方が分かるんだけど
MFCだけわけがわからない
187 :デフォルトの名無しさん2011/11/13(日) 22:06:42.39
>>185
これ読めば、大分分かるようになる

標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング
http://www.amazon.co.jp/gp/product/4881357042
193 :デフォルトの名無しさん2011/11/14(月) 00:15:18.58
>>187
その本昔持ってた
古い本だしもうMFCは使わんと思って
処分してしまったわ
189 :デフォルトの名無しさん2011/11/13(日) 22:10:57.61
ここで聞け
【初心者歓迎】C/C++室 Ver.76【環境依存OK
http://hibari.2ch.net/test/read.cgi/tech/1312621728/
190 :デフォルトの名無しさん2011/11/13(日) 22:18:07.28
>>189
すみません
ではそちらで質問させて頂きます
194 :デフォルトの名無しさん2011/11/14(月) 01:14:02.79
こういう話って厳密に言えば言語の話じゃないんだよな…
土台のシステムとやり取りする実行時環境とかリンカとかローダとかの
話を昔の人はわかってたから話省略してるんだけどこのへんの知識がないと
コンパイルエラーを潰すことは絶対にできない。多重定義とかそのへんのやつね。

自分もC++いじり始めた時スゲー苦労した。基本的にC++本に書いてないんだもの…
195 :デフォルトの名無しさん2011/11/14(月) 04:59:44.72
weak_ptr<Hoge> 型のメンバ変数に対するアクセッサを定義するばあい、
セッターの引数の型とゲッターの戻り値の型は何にすればいい?

現状、メンバ変数が shared_ptr であっても weak_ptr であっても
const shared_ptr<Hoge> & 型の引数を持つセッターで設定、
shared_ptr<Hoge> 型の戻り値で取得できるようにしている(this->pHoge.lock() を返している)んだけど、これってアリかな?
196 :デフォルトの名無しさん2011/11/14(月) 05:43:53.92
>>195
「メンバ変数に対するアクセッサ」なんて考えるんじゃなくて、
使う側から見て自然で使いやすいインターフェースを考えるんだ。

普通は weak_ptr を持つかどうかを使う側に意識させないほうが
いいんじゃないかな?
197 :デフォルトの名無しさん2011/11/14(月) 08:42:11.84
>>195
shared_ptrは所有物を返すために使い、
weak_ptrは参照するために使う。

値を返すのにweakは無いと思う。
有効かどうか解らない戻り値を
そこらじゅうでチェックすんのも効率悪いし。
199 :デフォルトの名無しさん2011/11/14(月) 10:02:54.72
>>195
うーん無いと思いますね…。
shared_ptrを返しますが、それは有効かもしれないし無効かもしれません。
十分注意してチェックして使ってくださいね。ってことになるでせふ。
それならそのままweak_ptrを返すほうがまだミスの恐れがなくていいと思うのだけど。
198 :デフォルトの名無しさん2011/11/14(月) 09:38:05.95
アクセッサの時点で負けだから設計からやり直しに決まってんだろ
200 :1952011/11/14(月) 12:28:24.78
うーん、具体例を挙げます

class HogeContainer
 : public enable_shared_from_this(HogeContainer) {
public:
 void AddElement(const shared_ptr<Hpge> & p) {
  p->SetOwner(shared_from_this());
  hoges.push_back(p);
 }
 void RemoveElement(const shared_ptr<Hpge> & p);
private:
 list<shared_ptr<Hpge>> hoges;
};

class Hoge {
 friend HogeContainer;
public:
 ? GetOwner();
private:
 void SetOwner(?);
 weak_ptr<HogeContainer> pOwner;
};

このばあいの?・?の型は何がよいのだろうか
但し、?の戻り値からshared_ptrを取得できることが条件
207 :デフォルトの名無しさん2011/11/15(火) 02:01:09.51
説明用のサンプルコードに突っ込みいれるのもなんだけど>>200を見る限りでは設計見直せと言いたくなるな。

・HogeContainerはshared_ptrを介してHogeを所有してるがそれは他の何かにもHogeの所有(共有)を許すということだ。
とすると複数のHogeContainerが単一のHogeを所有することもありえるがHogeのOwnerには一つしかなれない。

・そもそもHogeからHogeを所有してるHogeContainerが直接わかる事に意味はあるのか?
HogeContainerからHogeを解放したいとかの用途ならHogeに専用の関数を個別に用意すべきではないか?
209 :1952011/11/15(火) 02:42:46.47
>>207
>・HogeContainerはshared_ptrを介してHogeを所有してるが、(ry
 いや、それは当然のごとくHogeContainer.RemoveElement(...)とHoge.SetOwner(...)内の処理で調整するだろ
 void SetOwner(pNewOwner) {
  if (NULL != this->pOwner) {
   this->pOwner->RemoveElement(this);
  }
  this->pOwner = pNewOwner;
 }
 的な感じで。

>・そもそもHogeからHogeを所有してる(ry
 ツリー構造でノードが持つGetParent()に意味は無いのかと問いたい
213 :1952011/11/15(火) 09:46:46.27
>>211
そこら辺は要考慮だが、イテレータを使用している最中にコンテナの要素を削除して問題あるのはvectorぐらいだし、
そもそもフラグを使用しても今度はいつコンテナから要素を削除するのか問題になる

>>212
要素!=要素の管理者であっても、違っていても、どちらも親(管理者)が欲しい時はあるんじゃないか?
前者は、例えばC#の話になるが、DataTableクラスはDataSetプロパティ(属するDataSet、つまりは親を取得する)がある訳で
後者は自分の例でのHogeクラスを削除して、HogeContainerクラスに置き換えたものになる

だがちょっと待ってほしい。自分が質問した内容は>>200な訳で、
? = const shared_ptr<Hoge> &
? = shared_ptr<Hoge>
は問題ないということで宜しいか?
214 :デフォルトの名無しさん2011/11/15(火) 09:56:16.53
>>213
ぶっちゃけそんな細かいところどうでもいいから好きにすればいいよ
201 :デフォルトの名無しさん2011/11/14(月) 12:43:27.95
寿命の関係や返り値で得たポインタを他のクラスに所有されても良いのかダメなのかによって異なる
202 :1952011/11/14(月) 23:14:19.76
>>201
?の戻り値から得たshared_ptrをどこかで長期的に保存(共有)しても構わない
どのみち、weak_ptrを返してもそれを制限する術は無いだろうし
203 :デフォルトの名無しさん2011/11/14(月) 23:19:56.99
>>202
あんた自身の意見がよくわからん。
shared_ptr を返すことで何か不満なのか?
204 :1952011/11/15(火) 00:18:39.79
>>203
shared_ptrを返す自分のコードに賛成できないというレスがあるので、
というか設計が間違っているという意見あるので、そういった意見の内容を知りたいです。
205 :デフォルトの名無しさん2011/11/15(火) 00:38:13.43
>>204
どこのスレから来たの?
206 :デフォルトの名無しさん2011/11/15(火) 00:44:09.06
>>204
shared_ptr に問題があるとしているのは >199 だけだな。
ヌルを返したくないなら例外投げるなりすればチェック漏れも無いんだから、
あんまり有用な意見だとは思わないね。

設計が〜っていうのは、先に実装ありきでインターフェースを後から考えてるのが
ダメっていう一般的な話。具体的なコードを指して言ってるんじゃない。たぶん。
211 :デフォルトの名無しさん2011/11/15(火) 08:30:09.48
勝手に離脱するギミックは最初はクールに見えるが後で面倒が多いことに気がつく
イテレータ回してるときに抜けられるとコンテナの種類によってはバグになるし
生存フラグを使う方法のほうがいいよ。ダサイけど
212 :デフォルトの名無しさん2011/11/15(火) 08:56:50.10
> ツリー構造でノードが持つGetParent()に意味は無いのかと問いたい
それは個々の要素自体がコンテナの管理者でもある場合で要素と要素の管理者が異なる場合とは違う。
STLコンテナだとイテレータから前後の要素はわかってもコンテナ自体はわからないだろ。
215 :デフォルトの名無しさん2011/11/15(火) 10:37:22.61
本筋と違うと話だというならそれはそれで

> 要素!=要素の管理者であっても、違っていても、どちらも親(管理者)が欲しい時はあるんじゃないか?
そういう時があることは否定はしない。
しかしコンテナ自体(管理者)を操作(コンテナから要素の値のコピーや参照を取得)する権利があるものと
取得した値を利用するだけの権利しかないものとをはっきり分離して使い分けたほうが良いときも多い。
 container c;
 fuga(c.firstnode());
みたいな時にfugaにコンテナを操作する権利(コンテナそのものや他の要素の削除なんかも自由自在)を
与えることになり得る設計は一般的にあまり望ましくないだろう。
216 :デフォルトの名無しさん2011/11/15(火) 10:48:15.64
他のオブジェクトが所有しているオブジェクトを取得して、
それに対してアレコレするってダサいと思う
219 :1952011/11/15(火) 11:43:14.12
>>215
> コンテナ自体(管理者)を操作(コンテナから要素の値のコピーや参照を取得)する権利があるものと
取得した値を利用するだけの権利しかないものとをはっきり分離して使い分けたほうが良いときも多い。
そこら辺は使い分ける。問題ない
>>200の、本筋の質問のための例では非constではないOwnerへの参照を取得できるようになっているだけだ

>>216
その説明だと"ダサい"に当てはまる範囲が大きすぎね?
217 :デフォルトの名無しさん2011/11/15(火) 10:56:09.69
ファクトリーパターンのこと?
218 :デフォルトの名無しさん2011/11/15(火) 11:17:39.88
>>217
違うと思うな
223 :デフォルトの名無しさん2011/11/15(火) 17:45:23.69
コンテナなのに内部データ見せないで何するんだよカスwww
225 :デフォルトの名無しさん2011/11/15(火) 18:04:10.17
タスクシステムです
238 :デフォルトの名無しさん2011/11/16(水) 00:54:35.52
>>225
いまだにそんな珍妙なもん作ろうとしてるやつがいるのか。驚きだわ。
226 :デフォルトの名無しさん2011/11/15(火) 18:28:11.47
>200のコードはあくまでも説明のためのサンプルだよね?
実際に使うのがあの設計だったらいくらなんでも拙いだろ
228 :デフォルトの名無しさん2011/11/15(火) 18:37:04.83
C++で動的確保した配列を解放する場合って、

delete [] test;

って書き方でいいですよね?
このtestっていうのは、あるクラスを動的確保した配列名なんですが、間違ってますか?

もしかして自分で作ったクラスはこの解放の仕方使えないとかですか?
リークしてるのは、crtdbg使って調べました
231 :デフォルトの名無しさん2011/11/15(火) 20:05:57.15
>>228
これみて思い出した。
GCCで明示的にデストラクタを呼び出したオブジェクトに
再度アクセスしたら落ちた。
デストラクタでメモリー解放とかしてなかったんだけど
なんで落ちたかな。
昔の事なんで状況をはっきり思い出せん。
230 :デフォルトの名無しさん2011/11/15(火) 18:40:43.72
ちゃは☆
このクラスをラップしてるクラスを解放してませんでした☆
忘れてください☆
232 :デフォルトの名無しさん2011/11/15(火) 21:22:08.73
ここで聞いていいか分からないんですが、質問させて下さい。
VC++2010か2008のソリューションファイルやプロジェクトファイルごと
誰かに配布した場合、そのファイルからユーザ名とかがばれる可能性ってありますか?
233 :デフォルトの名無しさん2011/11/15(火) 21:32:51.03
プロジェクトのpathにユーザー名等があれば、笑われるだろうな。
234 :デフォルトの名無しさん2011/11/15(火) 22:00:17.97
実行可能ファイルにもユーザー名入ってるから気にすんな
235 :デフォルトの名無しさん2011/11/15(火) 22:27:18.87
>>234
試しにexeの中サーチしてみたけど入ってないみたいだけど?
237 :デフォルトの名無しさん2011/11/16(水) 00:29:18.57
239 :デフォルトの名無しさん2011/11/16(水) 01:02:11.35
誘導されてきました。

質問です。

以下のようなコードを書きました。。 
ttp://ideone.com/n4aAH ;

ランダム内容のファイルを吐くだけのコードです。
これの乱数の初期化コードにstdlibの乱数をつかっているのですが、今風だとどういう初期化がいいんでしょうか。

このようにしたのは、ある程度乱数をコントロールして吐かせたいと思ったからですが、今時stdlibの乱数を使うのは無いだろうとおもったんです。

どう修正すればいいかお知恵をお貸しください。
あと、なぜそうなのかをご教示くだされば幸いです。
240 :2392011/11/16(水) 01:04:38.55
末尾に空白が入ってしまいました。
ttp://ideone.com/n4aAH
254 :デフォルトの名無しさん2011/11/16(水) 04:45:04.34
>>253
奥村の人か。この人のアルゴリズム本持ってる!!でも、読み解けては無い!
まー、それはいいとして。

>>240 のコードはVC10EEでは普通に実行できるのよ。
MSのことだから、何かがズレてるのだろうけど。
で、自分はMS環境だから自分の用事は済んだんだ。

でも、紹介してくれてありがとう!!ちょっと読んでみるよ。
241 :デフォルトの名無しさん2011/11/16(水) 01:11:11.01
別に修正する必要無いね。
242 :2392011/11/16(水) 01:12:50.43
>>241
なぜですか?
243 :デフォルトの名無しさん2011/11/16(水) 01:16:56.88
>>242
rand は今でも変わらず動くし、同じ動作をする新しいインターフェースは用意されていないから。
244 :デフォルトの名無しさん2011/11/16(水) 01:21:17.71
>>243
線形合同法などは色々不具合が指摘されていますが、
乱数を初期化するための乱数としては問題ないという判断ですか?
245 :デフォルトの名無しさん2011/11/16(水) 01:32:23.23
>>244
判断っていうか、実際に使う乱数は MT から取り出してるんだから
線形合同法の問題は関係無いでしょ。

そういう意味では seed_seq の生成にわざわざ rand を使っている意味も不明。
std::vector<uint_least32_t> Seeds(1, 0) で初期化するのと意味的に同じじゃない?
246 :デフォルトの名無しさん2011/11/16(水) 01:38:12.30
>>245
ある程度の質を壊さず、1変数で多様でランダムな内容を吐きたかったのですが、
同じ数字の羅列で初期化しても、質を壊さないで乱数が取れるのでしょうか?
それならそれで非常に助かるのですけど。

MT自体を本格的に触ったのが今日はじめてなので感覚がつかめてないのです。
249 :デフォルトの名無しさん2011/11/16(水) 02:01:14.91
>>246
試せよ。

seed_seq を使えば適当にビットを引っ掻き回した値で初期化されるから、
与えた初期値から想像できるような単純な結果にはならないはず。
http://msdn.microsoft.com/ja-jp/library/ee462311.aspx
250 :デフォルトの名無しさん2011/11/16(水) 02:21:32.40
>>249
シード生成用なのか、なんか色々やってますね。ふむふむ。
って、ん・・・??
for (k = 0; k < n; ++k) first[k] = 0x8b8b8b8b
これをやってるっていうことは、初期値がどのような値にもかかわらず、
定数で初期化されて、ランダム要因は配列の長さだけになってる気がします。

ちゃんと読めてないけど、割りと納得できました。
杞憂だったんだと思って割りきってみます。

回答者の方。非常に勉強になりました。
ありがとうございました!!
失礼します。
247 :デフォルトの名無しさん2011/11/16(水) 01:38:53.60
外部からSeedわたす意味がなくなってるな
248 :デフォルトの名無しさん2011/11/16(水) 01:46:11.70
>>247
それはstdlibのrand()を使うことに対してですか?
253 :デフォルトの名無しさん2011/11/16(水) 04:30:04.35
boostのメルセンヌツイスターでも使っとけよ
エラーが出てるのは使い方が間違ってるぞ

それかン簡単に済ませたいのならアルゴリズム辞典の乱数の改良とか

http://oku.edu.mie-u.ac.jp/~okumura/algo/archive/

の中の

algo.lzhをDLし、中のimprove.cを使うとか、整数の一様乱数
whrnd.cとかkrnd.cとか
255 :254==2392011/11/16(水) 04:57:22.52
奥村の人のコードは紹介してもらったやつを見た限りだと、
ちゃんと区切りがあってC++のクラス化しやすそうだ。

乱数をクラスにするとすごい便利なんだよな。ゲームとかゲームとかゲームとか。

今日はもう寝るので明日余裕があったらもうちょっと読んでみます。。
256 :デフォルトの名無しさん2011/11/16(水) 06:17:57.70
ideone.comは一部のboostにしか対応してないからな
コンパイルエラーになったんだろ
257 :デフォルトの名無しさん2011/11/16(水) 11:39:44.29
クラスの共通設定をファイルから読み込む場合にファイル名って決め打ちにしますか?

class Hoge {
static bool initialized;
static CommonData commonData;
static void Load(void) {
if(initialized) return;
file f("Hoge.dat"); // 〜
if(succeeded) initialized = true;
else throw except("init error");
}
public:
Hoge(void) { Load(); }
};

class Fuga {
static bool initialized;
static CommonData cd;
public:
static bool Load(file & f) {
// 〜
if(succeeded) initialized;
return succeeded;
}
};

Fuga(void) { if(!initialized) throw except("not ready"); } };

Hogeの方は初期化の面倒さや初期化忘れもありませんが、ファイル名が競合するかもしれないという不安があります
面倒な部分がカプセル化されててOOPっぽい雰囲気もあります
Fugaの方は初期化忘れや初期化順の混乱とかがおこるかもしれませんが、ファイル名はアプリケーションで指定できるので競合しません
どっちがいいんでしょうか
265 :デフォルトの名無しさん2011/11/16(水) 20:17:45.08
>>257
下みたいなのはよくつかう。ただしグローバルにはしない。
設定ファイル名は実行ファイルの名前使っとくのが無難。

class Fuga
{
     int settingA;
     int settingB;
     int settingC;
public:
     Fuga( const boost::property_tree::ptree &tree );
     void Restore( Window& );
};

// ptreeみたいな物で一回取り込んで設定をリストアするオブジェクトに展開しとくと楽。
boost::property_tree::ptree config;
read_xml( std::istream( ModuleName() + ".xml"), config );
Fuga configurator( config );

Window window;
configurator.Restore( window );
259 :デフォルトの名無しさん2011/11/16(水) 19:30:32.47
そもそも、設定なんかをグローバルで共有したりなんかしない。
261 :デフォルトの名無しさん2011/11/16(水) 19:54:35.74
>>259
幼稚園からやり直せ
262 :デフォルトの名無しさん2011/11/16(水) 19:58:36.91
>>261
I/Oや副作用中心なわけでもなく
再利用性が下がるばっかりなのにバカじゃねぇの。
263 :デフォルトの名無しさん2011/11/16(水) 20:02:23.70
>>262
アホですなぁ
264 :デフォルトの名無しさん2011/11/16(水) 20:04:09.60
再利用するものは部品化して、設定は外部から与えるが、
再利用するわけもないものまでそんな事するのは無駄なだけ
266 :デフォルトの名無しさん2011/11/16(水) 20:19:03.74
>>264
設定自体は使い捨てなんだよ。
最利用するのはロジック部。
設定がロジックに入れ込むと取り外して再利用するのが難しくなる。
269 :デフォルトの名無しさん2011/11/16(水) 21:07:39.60
>>266
再利用を見越したものは当然そうだろう
そういう物はそもそもライブラリ化しておく
271 :デフォルトの名無しさん2011/11/16(水) 22:17:25.74
>>269

>そういう物はそもそもライブラリ化しておく

何を持ってライブラリと書いてるのか解からんが、
仮にライブラリを他のプログラムと共有するコードだとすると、
再利用できるからってライブラリに突っ込めんだろ。

ブラウザのタブやら、モデリングツールのビュー、DTMツールのビュー
そういったビュー系のオブジェクトをライブラリ化することはあまりない。
そのビュー自体がプログラムのアイデンティテであるし、拡張の対象になるから
枯れたものとしてライブラリに追加するのは難しい。
ビューの他にもシーケンス制御のノードとかコマンド系オブジェクトも同じ傾向にある。
270 :デフォルトの名無しさん2011/11/16(水) 22:17:11.96
ぐふっ。
string でも wstring でも食っちまうんだぜ?的なカスタムの cout、ofstream を作ろうと一念勃起したんだけど
アルゴリズムに渡したり汎用マニピュレータを挿入したりできるようになるためには
template< charT, char_traits< charT > > ... の形になってないといけなくて、
それはつまり標準の特殊化をせよということで、じゃあとりあえず fstream でもと思ったら
それは basic_ofstream の特殊化であり、 basic_stream であり basic_ios の特殊化であり
そもそも最低限 char_traits の特殊化が必要な気配でありなんであり…もう、頭がフットーしそうだよおっっ。

なんか、良い文献知りませんか(´・ω・`)
272 :デフォルトの名無しさん2011/11/16(水) 23:19:14.29
>>270
Boost.Iostream あたりで楽にならんのかな?
276 :デフォルトの名無しさん2011/11/16(水) 23:56:39.02
>>272
わかりました、ソース読んでみます。どもども。(´・ω・`)
282 :デフォルトの名無しさん2011/11/17(木) 13:35:10.63
>>270
クラスを自作するなら、
operator<< の中で reinterpret_cast すれば終わりじゃね?
273 :デフォルトの名無しさん2011/11/16(水) 23:27:30.76
ライブラリとして作るだけで
別に共用する必要は無い
改造して再利用するにしても、分離されてると色々と楽よ
277 :デフォルトの名無しさん2011/11/17(木) 00:43:49.70
>>273
.libか.dllにするって言ってる?
274 :デフォルトの名無しさん2011/11/16(水) 23:30:39.32
それはライブラリじゃなくてオブジェクトコードじゃないか?
279 :デフォルトの名無しさん2011/11/17(木) 01:50:18.16
修正
> 処理の初めにweak_ptr.lock()を呼び出して、・・・
処理の初めに"全ての要素の"weak_ptr.lock()を呼び出して
280 :デフォルトの名無しさん2011/11/17(木) 07:10:33.55
最初から std::container<boost::shared_ptr<Type>> に出来ない理由があるのなら
それでいいんじゃない?
283 :デフォルトの名無しさん2011/11/18(金) 00:12:17.86
>>280-281
レスありがとう
とりあえずこのまま進めてみるよ
284 :デフォルトの名無しさん2011/11/18(金) 16:33:51.11
返り値のテンポラリが生成されるタイミングって
返り値の構築→スコープ抜けるの順番でいいの?
例えば
Obj func() {
try { Obj obj; return obj }
catch(...) { /*...*/; }
}
と書いてreturn時のコピーコンストラクタで例外が発生したらキャッチされると保証されてる?
288 :デフォルトの名無しさん2011/11/18(金) 20:50:07.17
>>284
仕様が気になるなら仕様見たら?
285 :デフォルトの名無しさん2011/11/18(金) 19:47:27.97
普通は戻り値最適化が行われるから
コピーコンストラクタ自体動かないので
あまり考えた事無いな・・・
286 :デフォルトの名無しさん2011/11/18(金) 20:09:37.07
デバッグでは戻り値最適化は恐らくカットされるので真面目に考えた方が良さそう
289 :デフォルトの名無しさん2011/11/18(金) 21:08:45.26
前やってみたらデバッグでも戻り値最適化はされてたような
さらに昔にやったときはされなかった気もするが
290 :デフォルトの名無しさん2011/11/18(金) 21:15:44.25
とりあえず、gccでは関数内のcatchに制御が移るみたい

ideoneコンパイル終わらない。。
ttp://ideone.com/QRPa5
294 :デフォルトの名無しさん2011/11/18(金) 22:21:56.39
>> 6.6.3
>> (略)
>> A return statement can involve the construction and copy or move of a temporary object (12.2).
これはreturnに書いた式の評価とは別の話で関数の返却値となる一時オブジェクトについての話とみるのが自然だろう。
296 :デフォルトの名無しさん2011/11/20(日) 12:23:13.94
class Hoge {
  Hoge(Piyo * pPiyo = NULL)
   : pPiyo(pPiyo) {}
  void SetPiyo(Piyo * pPiyo) { this->pPiyo = NULL; }
  bool IsValid() { return p != NULL; }
  void Fuga() {
   assert(this->pPiyo != NULL); // これ
   ...
   this->pPiyo->FugaFuga();
   ...
  }

  Piyo * pPiyo; // nullable
};

上記の assert() に価値はありますか?
298 :デフォルトの名無しさん2011/11/20(日) 13:27:50.82
>>296-297
それだけの内容で判断するのは無理。

しかし↓こっちのスレならなんとかしてくれるかもしれない。
http://hibari.2ch.net/test/read.cgi/tech/1187922645/
303 :デフォルトの名無しさん2011/11/21(月) 16:10:26.31
>>296
NULLがセットできたり、IsValid()があるってことは
無効という状態がありうる、もしくは容認する、とオレが使う側だったら考えるが
Hoge::Fuga()呼び出したらエラーも返さずにabortするってことだよね?
一貫性が無く他人がHogeを使う事を考えていない設計だね
304 :デフォルトの名無しさん2011/11/21(月) 17:01:56.79
>>303
> Hoge::Fuga()呼び出したらエラーも返さずにabortするってことだよね?
それはリリース時の動作です
>>296 では、デバッグ時に assert() が呼び出されます
Fuga() は google C++ スタイルガイドでいうところの、サフィックスに "OrDie" を付ける関数となります
299 :デフォルトの名無しさん2011/11/20(日) 18:29:08.39
SetPiyo()にNULL渡すアホがいる可能性が排除できるなら要らないかと
300 :デフォルトの名無しさん2011/11/20(日) 18:46:21.72
NULLを入れられる設計なのだから
assertじゃなく、NULLなら何もしないか例外を投げるのが普通じゃ
まあ、速度的な要請からassertにしてるのなら仕方が無いが
301 :デフォルトの名無しさん2011/11/20(日) 18:58:46.34
assert するなら設定時点でヌルを蹴るべきだし、そうしてないのなら assert はおかしい。
302 :デフォルトの名無しさん2011/11/21(月) 03:39:11.45
レスさんくす

>>298
・初期値が NULL(Hoge(Piyo * pPiyo = NULL))であること
・SetPiyo(Piyo * pPiyo) が NULL を渡されることを認めていること
・IsValid() が、メンバ変数 pPiyo が NULL 代入を許可していることを前提としていること
・メンバ変数 pPiyo が NULL 代入を許可していること
これらのソースをご確認ください

>>299
SetPiyo() に NULL を渡すことは許可されています

>>300
速度的な問題で、リリースモードでは pPiyo != NULL のチェックをしない予定です

>>301
Hoge クラス内で pPiyo の先を参照した地点(this->pPiyo->FugaFuga())で、
デバッグモードであれば落ちた位置が分かれば十分であり、
リリースモードであれば abort されてしまっても構いません
305 :デフォルトの名無しさん2011/11/21(月) 17:25:22.92
bool Fuga()にしてpPiyoがぬるぽならfalse返す仕様にすればいい
そうすりゃ動かなくても戻り値チェックしてないお前が悪いで通る
307 :デフォルトの名無しさん2011/11/21(月) 18:50:49.47
std::vector<Klass> v(N);
for(int i(0); i != N; ++i) {
v[i].init();
}
309 :デフォルトの名無しさん2011/11/21(月) 20:31:09.39
>>307-308
ありがとうございます。
安全対策としてコンテナに実体を入れたくないんです。
と思ったがこれ以上メモリ確保しないならこれでいいかも、いやよくねーよ?
http://codepad.org/JBC4Abvr
311 :デフォルトの名無しさん2011/11/21(月) 21:05:56.98
Klassにちゃんとコピーコンストラクタと代入演算子を定義してないからそうなる
312 :デフォルトの名無しさん2011/11/21(月) 21:27:51.64
すまない。
別にコンテナに実体を入れるかポインタを入れるか、
コピーコンストラクタがとか聞きたかったわけじゃなかったんだ

俺規約としてコンテナにはポインタをいれることは絶対だったから、
実体入れるのは、頭になくて新鮮で、何で実体入れないんだと考えてたのが309

実際聞きたかったことは,、push_backとか禁止したvectorないのってことです
321 :デフォルトの名無しさん2011/11/22(火) 00:01:47.32
>>312
> 実際聞きたかったことは,、push_backとか禁止したvectorないのってことです
中身を変更しないか変更するときに毎回const_castする気があるならconst vector。

const vector<int> v(10);
const_cast<int&>(v[0]) = 1;
const_cast<int&>(*(v.begin() + 1)) = 2;
313 :デフォルトの名無しさん2011/11/21(月) 21:34:09.74
boost::arrayじゃダメ?
314 :デフォルトの名無しさん2011/11/21(月) 21:34:37.21
どうでもいいがCじゃなくKなのが気になる。
意味するところは解からんでもないがClassと書いて困ることも無いだろうに。
315 :デフォルトの名無しさん2011/11/21(月) 22:03:04.88
>>312
配列そのままじゃ駄目なの?
begin、endの代わりにpArray、pArray+Nでどうにかなんないのかな

>>314
Kとlass(若い女性、娘、少女)で小娘って意味だろうきっと
316 :デフォルトの名無しさん2011/11/21(月) 22:04:54.97
こういう場合はboost::ptr_vectorが便利そうだな
ポインタがコンテナから消えると自動的にポインタの指すクラスのデストラクタを
呼び出してくれる
318 :デフォルトの名無しさん2011/11/21(月) 22:38:57.49
>>313
むしろboost::arrayがいいです。
クラスメンバにarray<T>とかサイズを後回しで宣言して使えるなら、使いたいです。

>>314
なぜklassの理由。何かから真似た。rubyの実装でこんな風に書いてあったような

>>315
実の目的はリファクタリングすることなのです。
newの仕方がうんこなので、まとめてnew[]するリファクタリングなんですが
vectorに放り込めばインターフェイス統一されてて楽なのです。、

>>316
ぐぐってみます

皆さんありがとうございました。
320 :デフォルトの名無しさん2011/11/21(月) 23:10:51.88
>>318
まずは用語を適切に扱いなさい
317 :デフォルトの名無しさん2011/11/21(月) 22:09:47.36
ソート用の参照配列だろ?
実態のコンテナとポインタのコンテナ2つ用意するのが堅実
319 :デフォルトの名無しさん2011/11/21(月) 23:03:21.38
AutoToolsで困ってます。

Cygwin1.7.5でMakeしたところ、ライブラリをテストするための実行ファイル生成のところで、以下のようなエラーになります。

libtool: link: cannot find the library `/usr/lib/gcc/i686-pc-cygwin/4.3.2/libstdc++.la' or unhandled argument `/usr/lib/gcc/i686-pc-cygwin/4.3.2/libstdc++.la'

手順としては以下のとおりです。
aclocal -I config
autoheader
automake --foreign --add-missing --copy
autoconf
./configure
make

/usr/lib/gcc/i686-pc-cygwin/ 以下の内容は次のとおりです。
$ ls -F /usr/lib/gcc/i686-pc-cygwin/
3.4.4/ 4.3.4/

各ツールのバージョンは以下のとおりです。
GNU automake 1.9.6
GNU Autoconf 2.65
GNU Make 3.81

configureあたりがgccのバージョンをご認識しているかと思うのですが、
どうしたらよいのでしょうか?
323 :デフォルトの名無しさん2011/11/22(火) 11:36:33.62
文字列とポインタの事で質問です

#include <iostream>

using namespace std;

int main()
{
    char* c = "ABC";
    cout << c << '\n';
}

cは"ABC"の先頭要素のアドレスが入ると思うのですが、
cを出力した時にABCが出るのは何故なのでしょうか
339 :デフォルトの名無しさん2011/11/22(火) 21:41:44.47
size_tも処理系依存じゃん
同じ処理系依存でもvoid*の方がフォーマットはともかくアドレス
表記で有ることが保証されてる情報落ちが無い分マシといってるだけ
まぁ、>>323 にsize_tにキャストはやめなといってる理由だから
詳しい子は好きにしたらいい
324 :デフォルトの名無しさん2011/11/22(火) 12:01:07.67
streamにchar*を受けたら文字列を出力する<<演算子がオーバーロードされてるはず
蛇足だけど文字列リテラルはconst char*で受けたほうが良い
325 :デフォルトの名無しさん2011/11/22(火) 12:08:42.65
むしろ何が出て欲しい?
そこでアドレスが出て欲しい人って居るか?

という規定
326 :デフォルトの名無しさん2011/11/22(火) 12:12:31.13
アドレスが出ないなんて神への冒涜だ
文字列が出したければstringでも使ってろカス
327 :デフォルトの名無しさん2011/11/22(火) 12:18:58.25
横槍だけど、すると整数型にキャストしたりするとポインタのアドレスになったりするのか
329 :デフォルトの名無しさん2011/11/22(火) 12:29:21.00
ちゃんと size_t で受けるんだぞ
331 :デフォルトの名無しさん2011/11/22(火) 13:28:22.61
>>329
アウトだよ
330 :デフォルトの名無しさん2011/11/22(火) 12:35:19.21
まぁvoidポインタにするだけでアドレス値は表示できる気が
332 :3232011/11/22(火) 13:57:35.55
そういう風に決められてるんだなということはなんとなく分かりました
ありがとうございました
333 :デフォルトの名無しさん2011/11/22(火) 20:56:19.11
size_tを進めてるヤツがいるがアドレス表示したいんならconst void*へキャストしろ。
size_tじゃアドレス出力用のフォーマットで出力しない。
334 :デフォルトの名無しさん2011/11/22(火) 21:01:44.72
ポインタの表示は処理系依存
どんな環境でも整数として表示したいならsize_tかoffset_tにキャストして表示しなさい
336 :デフォルトの名無しさん2011/11/22(火) 21:24:11.74
整数として表示したら見づらいだけだろ
現実問題、処理系依存だろうとポインタに最適化されてる
void*表示のほうが見やすい
そもそもsize_tが32bit、ポインタ64bitの環境じゃアドレスが欠ける。
352 :デフォルトの名無しさん2011/11/23(水) 07:19:58.48
>>336
>そもそもsize_tが32bit、ポインタ64bitの環境じゃアドレスが欠ける。
そんなことあるの?
353 :デフォルトの名無しさん2011/11/23(水) 08:18:33.70
>>352
64bitポインタ環境でsize_tが32bitとかかなり無意味だよな
355 :デフォルトの名無しさん2011/11/23(水) 11:07:35.55
>>353
連続した2^32+1以上の領域の確保を
コンパイル時エラー&メモリ確保エラーにするなら
そういう仕様でもおかしくはない
356 :デフォルトの名無しさん2011/11/23(水) 11:34:34.72
>>355
286のような集積度か低い頃のセグメンテーションなMPUだとそうかもしれないけど、64bitアドレスが可能なMPUではメリット無くないか
371 :デフォルトの名無しさん2011/11/23(水) 19:02:51.63
>>352
Nintendo 64とか、AMD64以前のコンパイラだとぼちぼち見る
338 :デフォルトの名無しさん2011/11/22(火) 21:33:40.77
ポインタの表示は処理系依存だと何度言えば
自分で出力の仕方くらい決めさせてくれ

それに規格的には%pに渡すにはvoid*へのキャストが必須だから
大した差は無い(元からvoid*な場合以外)
340 :デフォルトの名無しさん2011/11/22(火) 21:45:20.32
整数型にしたいならintptr_tかuintptr_tにキャストするべきだけど
この2つはoptionalなので存在しない処理系もある
というかそもそもポインタを整数型にキャストできる保証もない
359 :デフォルトの名無しさん2011/11/23(水) 14:04:51.66
>>340
std::uintmax_tなら必須だぜ
341 :デフォルトの名無しさん2011/11/22(火) 21:50:13.79
処理系依存というか、例えばgccで先頭に0xが付くとか不快なんだよね
intptr_tやuintptr_tがあるならそれを使いたいけど今のところある環境ばかりじゃないしな・・・
343 :デフォルトの名無しさん2011/11/22(火) 22:07:22.77
>>341
そこまで拘るんならカスタムマニュピレーターでも作ったほうが早くね
342 :デフォルトの名無しさん2011/11/22(火) 22:03:14.76
ptrdiff_t使えよド素人共が
344 :デフォルトの名無しさん2011/11/22(火) 22:09:08.61
>>342
符号付きの時点でイヤ
345 :デフォルトの名無しさん2011/11/22(火) 22:10:08.08
>>344
頭だいじょうぶ?
347 :デフォルトの名無しさん2011/11/22(火) 22:38:47.87
ptrdiff_tはアドレスオフセットを格納するのに十分なサイズと決まっている
ptrdiff_tで何も問題は起こらない
348 :デフォルトの名無しさん2011/11/22(火) 23:21:41.78
ptrdiff_tは同一オブジェクト内のオフセットだから
メモリ空間が分割されていたり単一プログラムが扱える範囲に制限があったりして
あまり大きなオブジェクトを扱えない環境では
ptrdiff_tがintptr_tより小さくてもおかしくない
354 :デフォルトの名無しさん2011/11/23(水) 08:28:02.14
お前らアホばっかやな。仕様なんかどうでもいいんだよ、C++なんだからさ
仕様調べてる暇があったらパパッとメタプログラミングで最適なサイズを求めればいいだろう
357 :デフォルトの名無しさん2011/11/23(水) 11:37:37.64
ないよ
もしそうならそういう仕様もありうるという話をしただけで
メリットがあるという話はしていない
358 :デフォルトの名無しさん2011/11/23(水) 13:56:15.81
C++標準ではintptr_tを使うという考えなんだから、素直に書けば↓だろ

#if intptr_tが使えない
namespace std { typedef intptr_t 処理系依存; }
#endif

処理系依存の所は変な技使わずlong longとかsize_tでも入れときゃいい
360 :デフォルトの名無しさん2011/11/23(水) 14:16:00.36
uintmax_tがポインタの整数表現を格納するに十分だとは限らないし
uintptr_tが定義されない環境ではuintmax_tがuintptr_tに必要な大きさを持っていないと考えるほうが自然なんじゃないか
361 :デフォルトの名無しさん2011/11/23(水) 14:23:26.66
http://codepad.org/aPp8eYYd
環境依存しないアドレスの最大値ってどうやって取得するの?
numeric_limitsはリンク先のように意味ないし
362 :デフォルトの名無しさん2011/11/23(水) 14:34:14.44
ふむふむ。その様な環境ではポインターの値を保持する整数型が存在しないのですな。

>>361
numeric_limits<void *>の定義は static constexpr T max() noexcept { return T(); }
だからね。uintptr_tに変換して~0の値を見るしかないんでは?
363 :デフォルトの名無しさん2011/11/23(水) 14:37:53.70
規格上~0がその符号なし整数型の最大値であるとは限らない
365 :デフォルトの名無しさん2011/11/23(水) 15:02:50.69
3.9.1 Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2n where n is the number
of bits in the value representation of that particular size of integer.
確かにuintptr_tは符号無しではあるがunsignedと宣言されているわけではないな
366 :デフォルトの名無しさん2011/11/23(水) 15:38:58.97
そういう意味じゃなくて、sizeof (unsigned int) が例えば4だからと言っても
32bitフルに使わないといけないわけじゃないって事じゃないの
30bitしか使わなくても別に規格上問題は無い
368 :デフォルトの名無しさん2011/11/23(水) 16:04:39.71
>>366
それを環境依存せずに取得できると思う方がおかしいぜ。
ちなみにWindowsはエディションによって搭載できるメモリが異なるが、
実行環境に合わせた表示までしたいの?
367 :デフォルトの名無しさん2011/11/23(水) 15:40:53.37
~0uなら最大値だろうけど~0は符号付きの値だから
符号無しに変換してどうこうは保証されないってことか
372 :デフォルトの名無しさん2011/11/23(水) 19:30:27.70
そもそもアドレス値の最大知りたいって、どんな状況で必要なんだ?
374 :デフォルトの名無しさん2011/11/23(水) 19:50:55.67
>>372
アロケーター書くときとか
375 :デフォルトの名無しさん2011/11/23(水) 19:57:59.77
>>374
アロケーター書くのにどうしてアドレス値の最大が必要になるのかkwsk
376 :デフォルトの名無しさん2011/11/23(水) 20:11:37.53
size_t ってアドレス空間をカバーできる型なんだとばかり思ってたよ
382 :デフォルトの名無しさん2011/11/23(水) 22:13:46.93
>>376
いちおうptr_diff_t ってのはあるんだけどね
377 :デフォルトの名無しさん2011/11/23(水) 20:17:45.32
farとnearポインターがあった時点で
size_tにメモリー空間をカバーしろと仕様に書くのは無理だった訳で。
今でも、x86系のI/Oメモリー空間は別だし、どうやってもポインターサイズと
メモリー空間を対応付けるのは難しいよね。
378 :デフォルトの名無しさん2011/11/23(水) 22:03:41.68
初心者です、お願いします。


新規にフォームアプリケーションプロジェクトを作成すると
左のソリューションエクスプローラーの中に、
「ソースファイル」と「ヘッダーファイル」があります。

map関数を使いたいのですが、
#include <map>は「stdafx.h」に書けばいいですか?

また、
「Debug::WriteLine」を使いたいので「using namespace System::Diagnostics;」と書きたいのですが、
「stdafx.h」に書けばいいですか?
383 :デフォルトの名無しさん2011/11/23(水) 22:13:58.76
>>378
stdafx.h に書いておくとなんだかの理由で(プリコンパイルヘッダ関連だったかな)
処理が速くなりますよみたいな事がどっかに書いてあった気がするけど
よほど遅いマシン/巨大プロジェクトを扱ってるのでない限りそのヘッダを必要するソース
に書いて良いですね.経験上.
384 :デフォルトの名無しさん2011/11/23(水) 22:17:24.53
>>383
処理が早くなるって、通常実行時って言うよりはコンパイル速度が早くなる可能性があるだけでは?
387 :デフォルトの名無しさん2011/11/23(水) 22:25:45.11
>>378
mapを使うクラスのヘッダーファイルでinclude すればいい
ライブラリ等の変更する頻度が低くて良く使うヘッダーファイルをstdafxに追加するとコンパイルが劇的に速くなる
なお、両方に書いても問題ないよ
379 :デフォルトの名無しさん2011/11/23(水) 22:09:48.25
初心者過ぎてなんだかめんどくさいから説明はしないが
どちらもソースファイルに書けば使えるようになる

http://hibari.2ch.net/test/read.cgi/tech/1268613679/
次からはこっちできけ
380 :デフォルトの名無しさん2011/11/23(水) 22:10:24.32
>map関数を使いたいのですが、
>#include <map>は「stdafx.h」に書けばいいですか?

関数じゃなくてクラステンプレートだよね?
使うとこでインクルードしてもいいけど、よく使いそうだし stdafx.h でいいと思われ

>「Debug::WriteLine」を使いたいので「using namespace System::Diagnostics;」と
>書きたいのですが、
>「stdafx.h」に書けばいいですか?

C++では通常ヘッダファイルでusingはおすすめ出来ないが
C++/CLIの流儀だとどうなのかねえ・・・
俺はC++の通常の流儀に従って関数内でusingしてるけど
C++/CLIスレで聞いた方がいいと思う
381 :デフォルトの名無しさん2011/11/23(水) 22:12:31.10
>>380は、
「ヘッダファイル内では」関数内でのみusingという事ね
385 :デフォルトの名無しさん2011/11/23(水) 22:18:13.48
よくインクルードする奴はstdafx.hに書いておくと
何度も書かなくて便利というのもあるので
一概に速度だけの問題でもない
386 :デフォルトの名無しさん2011/11/23(水) 22:18:47.71
この文脈では処理=コンパイルでしょ
388 :デフォルトの名無しさん2011/11/23(水) 22:28:33.80
>>386
はいそのつもりでしたが誤解を招く表現でしたね
389 :デフォルトの名無しさん2011/11/23(水) 22:37:34.60
gccのプリコンパイルドヘッダークソおせぇ。
通常コンパイルで1分掛かるヘッダーをプリコンパイルにしてもやっぱり1分掛かる。
やっぱテンプレートだとプリコンパイルは無意味なんかね。
392 :デフォルトの名無しさん2011/11/23(水) 22:46:47.94
標準ライブラリは基本的にstdafx.hに突っ込んでるな
変更なんてあり得ないし、なにかとどこかで使うことになるし
394 :デフォルトの名無しさん2011/11/24(木) 00:07:52.55
毎回プリコンパイルって何だ
プリコンパイルは1回だけだぞ
396 :デフォルトの名無しさん2011/11/24(木) 00:20:40.37
ソースコード修正しただけで1分掛かる。
ヘッダーは変更しとらんよ。
398 :デフォルトの名無しさん2011/11/24(木) 03:32:02.69
テンプレートって使用された分の関数をコンパイル前に自動で作ってくれるってだけなんですか?
400 :デフォルトの名無しさん2011/11/24(木) 03:52:59.36
>>398
関数だけじゃなくてクラスも対象だし、コンパイル「前」じゃないし、
「だけ」といってもその恩恵は計り知れないけどな。
404 :デフォルトの名無しさん2011/11/26(土) 10:43:17.92
継承できるけどインスタンスはひとつに限られるクラスってどうやって記述すればいいんでしょうか
シングルトンって継承できないですよね?
405 :デフォルトの名無しさん2011/11/26(土) 10:47:29.60
>>404
使いどころはあるの?
407 :デフォルトの名無しさん2011/11/26(土) 17:01:44.47
class crood{
public:
 int& X(){return _x;}
 int& Y(){return _y;}
 int X()const{return _x;}
 int Y()const{return _y;}
private:
 int _x,_y;
};

crood tmp;
tmp.X()=200;
tmp.Y()=-100;

int tmpx=tmp.X();//tmpx=200
上のような書き方でやればgetXとかsetXとか書かなくてすむけど単純な代入しか出来ないですよね?

tmp.Y()=-150;

とかしたときに

tmp.Y()が0になるように出来ませんか?
※マイナスの値が代入された時は0を代入する。
409 :デフォルトの名無しさん2011/11/26(土) 17:13:44.03
>>407
Y を int& じゃなくて、別のclassにすればできる。
でもねぇ、これは思想が違うとしか。
414 :デフォルトの名無しさん2011/11/26(土) 22:32:34.97
>>407
脇道だが、座標系を表すオブジェクトのXとYなんて書き換えられる必要ないだろ。
書き換え自体は、オブジェクトの内部で完結してりゃ十分じゃん。
それと、X、Yと定義しているパターンはよくあるけど、関数ポインターが無いと
XとYの入れ替え指示ができないので、OOとしてはあんまり良くない。
412 :デフォルトの名無しさん2011/11/26(土) 17:32:57.95
http://codepad.org/RjlPqJs6
別クラスってーとこんな感じか?
便利そうな、そうでもないような…
413 :デフォルトの名無しさん2011/11/26(土) 17:33:39.45
>getXとかsetXとか書かなくてすむけど
これじゃないの?
マクロ書いた方がまだマシな気もする
415 :デフォルトの名無しさん2011/11/26(土) 22:36:59.77
数学ベクトルはメンバ丸出しが最善手って常識だろ
417 :デフォルトの名無しさん2011/11/26(土) 22:44:41.37
>>415
今は、SSEやGPGPUもあるしそういう時代でもない。
419 :デフォルトの名無しさん2011/11/27(日) 00:41:12.91
>>415
uBLASとかBlitz++とかマジもんの数学ライブラリは添字アクセスなんけど
どこの常識なんだろうか・・・。
423 :デフォルトの名無しさん2011/11/27(日) 01:05:04.86
>>419
その添字アクセスはサイズを動的にするための犠牲であって
添字アクセスが優れているから採用したわけではない
416 :デフォルトの名無しさん2011/11/26(土) 22:40:17.29
VC++の$(OutDir)の値を変更するのはどこ?/OUTはどこでどう使うの?

どうせ、スレ違いというだろうけど
418 :デフォルトの名無しさん2011/11/26(土) 22:45:28.92
>>416
解ってんならVSのスレに行けよ
444 :デフォルトの名無しさん2011/11/27(日) 01:57:45.92
>>416
> VC++の$(OutDir)の値を変更するのはどこ?
使わなきゃいいだろ。
420 :デフォルトの名無しさん2011/11/27(日) 00:57:57.68
uBLASとかは汎用的な処理かつでかい行列ではまあまあ有効なんだよ
でも3DCGとかじゃただの構造体がベスト
まとまった数学操作はすべて関数で用意して環境別に中身を切り替える
常識です
422 :デフォルトの名無しさん2011/11/27(日) 01:03:29.80
そんなんDirect Xぐらいだろ
424 :デフォルトの名無しさん2011/11/27(日) 01:08:22.38
>>422
少なくともJavaと.NETは構造体的になっているようだが
428 :デフォルトの名無しさん2011/11/27(日) 01:12:06.77
>>424
数学系に独立してるわけじゃなく
X11やWin API引きずってるもんな。仕方ない。
425 :デフォルトの名無しさん2011/11/27(日) 01:08:52.87
構造体の相対参照も、添字参照も速度は変わらんしな、何が犠牲なんだろ?
427 :デフォルトの名無しさん2011/11/27(日) 01:10:51.69
>>425
本気で言ってるなら病院
429 :デフォルトの名無しさん2011/11/27(日) 01:13:17.57
>>427
x86系の命令と、インライン展開された状態知ってて言ってるの?
430 :デフォルトの名無しさん2011/11/27(日) 01:13:22.01
>>425
見やすさとか書きやすさかなぁ?
433 :デフォルトの名無しさん2011/11/27(日) 01:19:28.79
2か3に次元固定ならXYZ使うのが自然だろうし
任意のN次元を扱うクラスなら添え字が自然だろう。
どちらか片方が常識と言われると、アホと言いたくなる

とりあえず>>429は病院池
435 :デフォルトの名無しさん2011/11/27(日) 01:26:43.53
>>433
お前話の脈絡がめちゃくちゃだぞ
>>425の話と全然繋がってないじゃん
426 :デフォルトの名無しさん2011/11/27(日) 01:10:37.19
32bit時代だとthisはレジスタ渡しだから
構造体よりはクラスの方が良さそう
64bit時代だと普通の引数も4つまでレジスタ渡しだから
引数多い関数でもなければ差はないね
431 :デフォルトの名無しさん2011/11/27(日) 01:14:23.93
2次元なのに3次元目を指定するとかの間違いはトラップできるよね
それだけだど
432 :デフォルトの名無しさん2011/11/27(日) 01:15:48.97
どっちがいいかは実測してから議論しなさいって学校で教わったよね
434 :デフォルトの名無しさん2011/11/27(日) 01:24:21.69
速度は実際測っても差はないし、実測の問題じゃないと思うけど?
それより中身を直に晒すと参照とか使えないのがキツイ。

iterator x,y;
Vector( iterator x, iterator y ):x( x ), y( y ){}
int X( void ) const { return *x;}
int Y( void ) const { return *y;}
operator += ( const Vector &vector )
{
       *x += X();
       *y += Y();
}

こういう委譲スタイルが使えない。
437 :デフォルトの名無しさん2011/11/27(日) 01:29:59.03
>>434
なにそのキモイコード
438 :デフォルトの名無しさん2011/11/27(日) 01:32:06.80
>>434
>中身を直に晒すと参照とか使えない
日本語でお願いします
439 :デフォルトの名無しさん2011/11/27(日) 01:34:11.25
>>437
GPUやSSE用の頂点配列の1要素を、
単体のベクトルに委譲するコード。
最近似たようなのをちょくちょく見かけるね。
440 :デフォルトの名無しさん2011/11/27(日) 01:35:31.15
>>438
中身丸出しってのはこれのこと
>数学ベクトルはメンバ丸出し
441 :デフォルトの名無しさん2011/11/27(日) 01:37:43.87
とりあえず>>434は病院池
442 :デフォルトの名無しさん2011/11/27(日) 01:39:18.21
>>439
要素分けて参照させる必要あるの?
ベクトル単位で参照したほうがいいだろ
443 :デフォルトの名無しさん2011/11/27(日) 01:47:26.67
>>442
SSEだと、ベクトル集合の演算は、次元毎に加算したほうがやりやすいんだよ。

例えば適当に書くけどこんな感じ
float x[128], y[128];
*( (*__m128) x ) += (__m128){ 1, 1, 2, 2 };
*( (*__m128) y ) += (__m128){ 1, 1, 2, 2 };
445 :デフォルトの名無しさん2011/11/27(日) 01:59:34.60
もっと根本的な事を書かないと何故参照が必要か説明不足か。

SSEArray<2> model(100);
model += Vector<2>(10, 20);
model[0] += Vector<2>(10, 20);

元々、SSE用のベクトル集合があって、
ベクトル集合全てに加算する場合と、
1要素に対し加算する場合がある。

SSE用のベクトル集合の内部は>>443の用に
内部で次元毎に別れて格納されてる。

そのままでは、1要素のベクトル演算には使えないから、
一旦ベクトル集合の1要素を参照するベクトルオブジェクトに
委譲してやる必要があるわけ。
446 :デフォルトの名無しさん2011/11/27(日) 02:10:02.90
ary.add(idx, v2(1, 2));
でいいよ
へんなアダプタかませてカッコつける必要性皆無
451 :デフォルトの名無しさん2011/11/27(日) 17:58:04.04
ifs.get(buf, sz, '\n'); // read before delimiter '\n'
if(!ifs)
 if(ifs.eof()) break;
 else ifs.clear();
if(strlen(buf) < sz - 1) ifs.seekg(1, std::ios::cur); // skip delimiter
std::cout << buf << std::endl;
453 :デフォルトの名無しさん2011/11/27(日) 18:15:44.28
>>451 さん!
出来ました!!
ありがとうございます!!!
455 :デフォルトの名無しさん2011/11/29(火) 21:54:49.93
if(x.isNantoka()) {
x.doKantoka();
}
的なコードを見やすくするために
x.isNantoka() && x.doKantoka();
って書くのっておかしいですか?
469 :デフォルトの名無しさん2011/11/30(水) 00:04:57.08
>>455
なぜ見やすいコードを見にくいコードに置き換えようとしているのかが分からない
473 :デフォルトの名無しさん2011/11/30(水) 00:15:58.93
>>455
C++で&&とあったら評価の途中の副作用でなく結果のbool値のほうを注目するから一般的ではないだろうな
459 :デフォルトの名無しさん2011/11/29(火) 22:25:29.03
自分だったら、
if (x.IsXxx() == true) x.DoXxx();

と、一行で書けるときはそうする。
475 :デフォルトの名無しさん2011/11/30(水) 02:50:40.40
>>459 論理定数との等値比較を書いていいのは小学生まで。
460 :デフォルトの名無しさん2011/11/29(火) 22:36:52.53
英語文法的には
if hoge and fuga or piyo.
hogeであるならばfugaでなければpiyoってなるからすごいわかりやすいんだけどね
462 :デフォルトの名無しさん2011/11/29(火) 23:09:44.84
nullガードとは別の話だろー
Perlでは見ない事も無い書き方だけど
C/C++的には正直読み辛い
464 :デフォルトの名無しさん2011/11/29(火) 23:39:22.25
C++はNULLないしfalseだと処理をすっ飛ばす
コンディション変数ってもんも有るんだがね。
NULLガードが見づらいって人は、コンディション変数も嫌いかもね。

// こういうヤツ
if( X x = a.ToX() ) return x;
465 :デフォルトの名無しさん2011/11/29(火) 23:52:05.65
読み辛いって言ってんのはこれだぞ
x.isNantoka() && x.doKantoka();
466 :デフォルトの名無しさん2011/11/30(水) 00:00:34.48
>>465
いや解ってるよ。コンディション変数が苦手な人と趣向が同じだよねって言ってるの。
467 :デフォルトの名無しさん2011/11/30(水) 00:02:39.64
本来の使い方から逸脱してるから
趣向が同じ訳ではないと思うの
468 :デフォルトの名無しさん2011/11/30(水) 00:04:28.24
そういやショートサーキット( &&, || ) による分岐は無しだわ。
オーバーロードに気づかなかったら、ショートサーキットが効かず事故る。
470 :デフォルトの名無しさん2011/11/30(水) 00:05:42.47
オーバーロードはまあ罠だよね
でも&&や||のオーバーロードってそんなあるかな?
472 :デフォルトの名無しさん2011/11/30(水) 00:12:35.19
オーバーロードするとしたら、遅延評価か2論理値以外を使いたい時になんのかな。
474 :デフォルトの名無しさん2011/11/30(水) 01:48:20.04
どっちが先に評価されるかは決まってるんだっけ
476 :デフォルトの名無しさん2011/11/30(水) 02:51:27.40
>>474
決まってるよ
477 :デフォルトの名無しさん2011/11/30(水) 08:21:47.37
すみません
VB でいう MyBase、C# でいう base は C++ では何になるのでしょうか。

継承クラスの子メンバで、親のメンバを明示して実行させたいのですが。
this だと自分自身を指しますよね?
479 :デフォルトの名無しさん2011/11/30(水) 08:53:46.38
>>477
多重継承できるC++では明示的に親を示すキーワードはない。
500 :デフォルトの名無しさん2011/12/01(木) 00:14:45.78
>>477
MSに依存したものであれば、__superというキーワードが使える。
http://msdn.microsoft.com/ja-jp/library/94dw1w7x.aspx
478 :デフォルトの名無しさん2011/11/30(水) 08:27:43.85
親クラスの名前::呼び出したいメンバ
484 :デフォルトの名無しさん2011/11/30(水) 19:35:05.37
>>477
>>478のやりかたで正しい。
480 :デフォルトの名無しさん2011/11/30(水) 10:54:29.73
struct B1 { void f(); };
struct B2 { void f(); };
struct D: B1, B2 { void f(); };

D d;
d.B1::f(); // B1のf
d.B2::f(); // B2のf
d.f(); // Dのf
482 :デフォルトの名無しさん2011/11/30(水) 12:34:42.48
>>480
それって隠蔽されてる関数を無理矢理引っ張り出す書式だよな
親を指すポインタはdynamic_castを使って2個作るしかない事には変わりがない
485 :デフォルトの名無しさん2011/11/30(水) 19:36:26.08
>>482
別に無理矢理じゃないだろ。
多重継承で衝突した時の基本的な対処法じゃん。
486 :デフォルトの名無しさん2011/11/30(水) 19:37:06.33
>>482
static_castで十分ですけど
483 :デフォルトの名無しさん2011/11/30(水) 12:52:54.30
template <class T> struct Interface {
T * p ;
Interface(T * p) : p(p) { }
void f() { p->T::f() ; }
} ;

struct D: B1, B2 {
Interface<B1> base1() { return this; }
Interface<B2> base2() { return this; }
void f();
};

D d;
d.base1().f() // B1のf
d.base2().f() // B2のf
d.f() // Dのf
487 :デフォルトの名無しさん2011/11/30(水) 19:38:13.33
>>483
オーバーライドする気がないならstatic_castの方がマシ。
489 :デフォルトの名無しさん2011/11/30(水) 20:14:24.23
>>487
オーバーライドしててもstatic_castっていうか暗黙のダウンキャストで十分ですけど
491 :デフォルトの名無しさん2011/11/30(水) 20:23:32.23
>>489
base1やbase2が別のクラスのオブジェクトを返す場合は困るってこと。
493 :デフォルトの名無しさん2011/11/30(水) 21:26:10.52
>>483
済みません

Interface<B1> base1() { return this; }

こういう場合ってメンバ関数の返却値でInterfaceの引数付きコンストラクタを
呼び出していますが、これって規格票のどこに説明がありますか?

初めて見たのでこういう書き方が出来るなら便利です

今までローカル変数に代入してから返していました
490 :デフォルトの名無しさん2011/11/30(水) 20:18:53.94
アップキャストだろ
ダウンキャストを暗黙でやられたら大変なことに
494 :デフォルトの名無しさん2011/11/30(水) 21:31:58.27
その分だと explicit コンストラクタすら知らないんじゃないのかね
規格の前に入門書読みなさい
495 :デフォルトの名無しさん2011/11/30(水) 21:34:39.66
explicitは知っています
ロベールと詳説C++を読んだけどどこにも書いてありません
JISの規格にも関数の返却値でコンストラクタを初期化する内容が
ちょっと見つからなかったもんで
496 :デフォルトの名無しさん2011/11/30(水) 21:44:24.07
コピーコンストラクターってあるだろ、
あれの引数の型を、自分の型とは関係ない型にしてるだけ。
変換コンストラクターという。
497 :デフォルトの名無しさん2011/11/30(水) 21:45:22.88
返却値で暗黙変換が出来ないと思ってたなら無駄なことしてたね
498 :デフォルトの名無しさん2011/11/30(水) 21:47:46.05
std::string hoge() { return "hoge"; }
とか普通にやるよね
499 :デフォルトの名無しさん2011/11/30(水) 21:52:06.13
>>496-497
ありがとうございます
これでかなり書き方が変わります

>>498
それは無意識のうちにやっていました
良く考えるとそれも変換コンストラクタなんですね
501 :デフォルトの名無しさん2011/12/01(木) 00:24:46.14
コミュ障かよ。仮にも第三次産業で飯食ってんだから
質問者が何を要求してるか考えろよ。

>継承クラスの子メンバで、親のメンバを明示して実行させたいのですが。
502 :デフォルトの名無しさん2011/12/01(木) 00:38:00.12
>>501
質問の日本語がまずおかしい
505 :デフォルトの名無しさん2011/12/01(木) 08:06:33.61
Qみたいな事言ってんなよ
カネカネキンコはプログラム板から出てけよ
507 : ◆QZaw55cn4c 2011/12/02(金) 03:50:03.42
>>505
Qって何です?
509 :デフォルトの名無しさん2011/12/03(土) 16:03:49.21
僕と契約して(徹夜で)プログラムを作ってよ!
510 : ◆QZaw55cn4c 2011/12/03(土) 16:06:58.67
512 :デフォルトの名無しさん2011/12/05(月) 17:35:13.81
初期化の話だけど、組み込み型も括弧を使った形式の方がいいの?

int a = 100;

int a(100);

変わりが無いのであれば、後者の方で統一してしまいたいんだが、どうだろうか
514 :デフォルトの名無しさん2011/12/05(月) 18:09:59.76
struct foo{
static const int bar = 100; //できる
static const int baz(100); //できない
}
516 :デフォルトの名無しさん2011/12/05(月) 18:48:28.45
じゃあ後者で統一しようか
でも他の人のソース見ても後者を使用している人って居ないんだよな

>>514
そんなことより静的イニシャライザが欲しい
524 :デフォルトの名無しさん2011/12/05(月) 20:33:51.33
>>516
どうなるか解ってると思うが、参考までに。

Type function()
{
      return Type();
}

void function()
{
      return void();
}

int function()
{
       return int();
}
525 :デフォルトの名無しさん2011/12/05(月) 21:09:40.69
>>524
解ってない

return Type(); → デフォコン呼ばれたType型オブジェクトが返される
return void(); → 予想: わかんない
return int(); → 予想: int型の不定値が返される
529 :デフォルトの名無しさん2011/12/05(月) 22:22:09.46
>>525
テンプレートで問題が起きないように、
関数型キャストは、全て何らかの初期化になっている。
定数で初期化するより、君が使おうとしてる、関数型キャストの方が
汎用性がたかいんだよ。
530 :デフォルトの名無しさん2011/12/05(月) 23:43:49.82
>>527
return int(); が 0 を返すってマジかYO。というかマジだった
ローカル変数の初期値は不定値なのに、これは0に初期化されるのか
なんか不思議な感じがするんだけど、この仕様に理由があったりするの?

>>529
static const int baz(100) ←これ
・・・が関数型キャストと呼ばれているの?
それはそうと、自分もテンプレートを作成している際にこれを使った方が色々と都合が良いと思ったんだよね

template <typename T>
T Func() {
 T a = 100; // 代入したいんじゃない
 T b(100); // 初期化したいんだ
}
533 :デフォルトの名無しさん2011/12/06(火) 01:52:16.33
>>530
int n = int();
関数型キャストと言ったのはこっちの事。
言うには言ったけど間違ってたと思う。
int n = int( 100 );ってのは関数型キャストで間違いない。
int()だと多分デフォコンが正しいんだろう。
519 :デフォルトの名無しさん2011/12/05(月) 19:39:50.94
class Hoge {
 static PrintHogeAndPiyo()
 {
  print(..., statics.hoge, statics.piyo);
 }

 class StaticFields {
  StaticFields()
   : hoge(0),
    piyo(23) {}

  int hoge;
  const int piyo;
 };

 static StaticFields statics;
};

ドヤァ・・・
520 :デフォルトの名無しさん2011/12/05(月) 19:49:20.02
>>519
これは酷い
522 :デフォルトの名無しさん2011/12/05(月) 20:09:49.41
CRTPにするとき仮想関数使ったらあんま意味ないのはわかるけど
ほかになんか気をつけなきゃいけないことってある?
527 :デフォルトの名無しさん2011/12/05(月) 21:14:28.89
デフォこん
何も返らない
0
531 :デフォルトの名無しさん2011/12/06(火) 00:48:26.83
POD型のデフォルトコンストラクタ呼び出しは0初期化
そして非explicitコンストラクタの場合
> T a = 100; // 代入したいんじゃない
> T b(100); // 初期化したいんだ
このふたつは等価だから

template <typename T>
void func(){T t = T();}
と書けばTがPODでも初期化できる
534 :デフォルトの名無しさん2011/12/06(火) 07:17:27.76
>>531
等価じゃないよ
T a = 100; は T(int) が public でも
コピーコンストラクタが private なら外では使えない
(たとえコピーコンストラクタの実行が最適化で省略されるとしても)
537 :デフォルトの名無しさん2011/12/06(火) 18:33:48.41
つまりコピーコンストラクタをprivateにつっ込まない限り、その2つの処理は等価
どちらの記法を使うかは勝手ということか

>>533
なるほど
関数型キャストでは検索に引っかからなかったが、「T型の値 <= T(違う型の値)」がそれなのは理解した

>>534-536
環境: vs2005

class Hoge {
public:
 Hoge(int) {}
private:
 Hoge(const Hoge &) {}
};

Hoge h1 = 100; // ok
Hoge h2(100); // ok
//Hoge h3 = Hoge(100); // error C2248
//Hoge h4(Hoge(100)); // error C2248
536 :デフォルトの名無しさん2011/12/06(火) 11:48:08.93
T a = 100;
T b(T(100));
これなら等価かな?関数宣言と見なされてエラーになっちゃう?
538 :デフォルトの名無しさん2011/12/06(火) 19:31:00.93
コピーコンストラクタをprivateにする事は往々にしてあるので(C++11だと=deleteか)
意外と等価なケースばかりではないのよね
540 :デフォルトの名無しさん2011/12/06(火) 20:49:33.23
stdintがまだない環境で
指定のビット幅を持つ整数型を得るにはどうすればいいですか?
542 :デフォルトの名無しさん2011/12/06(火) 21:18:10.45
ちょっと伺いたいのですが。。
stlにbitset<>(固定ビット数指定)がありますが、
可変ビットを指定出来るにはまだ先になるの?

やっぱりまだboostを使わなきゃならないのかな?
543 :デフォルトの名無しさん2011/12/06(火) 21:26:13.45
入れようともしてないんじゃないのかな
ビットフラグって予め意味が決められてるから
可変にしても仕方が無いとか
拡張性を考えるとそうとも限らないとは思うけど
544 :デフォルトの名無しさん2011/12/06(火) 21:29:40.15
自分は多倍長整数試作したときにあるといいなーと思った。論理演算を実装したかったからね。
まーポシャったけど。
547 :デフォルトの名無しさん2011/12/06(火) 21:45:06.52
>>544
作ったけど別に必要なかったような
除算だけが難しかった
548 :デフォルトの名無しさん2011/12/06(火) 21:48:33.76
>>547
その時は基数がなにかとか殆どわからなくて言語に依存してたからビット演算を自前で実装出来なかったんだ・・・。Orz
545 :デフォルトの名無しさん2011/12/06(火) 21:32:15.27
ビット演算したいだけならstdintよりbitsetのほうが良いのかな
速さは殆ど変わらないよね?
549 :デフォルトの名無しさん2011/12/07(水) 16:38:05.24
メンバ関数のconstって論理的にオブジェクトの内容が変化しないときに付けるのか
メモリの書き換えが起こらないときに付けるのかどっちが一般的なんですか?
pImplイディオムを使うときや関数オブジェクトを作る時などにすごく悩みます
550 :デフォルトの名無しさん2011/12/07(水) 16:49:16.89
>>549
メンバ変数の書き換えが起きない時
556 :デフォルトの名無しさん2011/12/07(水) 21:39:53.83
>>549
結果をキャッシュして、キャッシュがあればそれを返す、というような場合は、
キャッシュ変数を mutable にして、メンバ関数を const にするような事はある
551 :デフォルトの名無しさん2011/12/07(水) 17:50:04.43
便乗
 const char *hage;
の const 対象はポインタだけだよね?

 hage = new_hage;   ← NG??

ちなみに
 strcpy((char *)hage, 'hage!');
は通るよね、どう理解したらいいんだい
552 :デフォルトの名無しさん2011/12/07(水) 17:55:04.32
>>551
ポインタ先の書き換えであってポインタ自体は書き換えていい
あとCスタイルのキャストはconstは外れる
555 :デフォルトの名無しさん2011/12/07(水) 20:34:49.43
>>551
仕様を知りたいわけじゃないなら、
コンパイルしてみたらええがな。
今時、その辺が仕様からズレてる
コンパイラも無いぞ。
553 :デフォルトの名無しさん2011/12/07(水) 19:35:21.06
? char * hage1;
 このポインタが指している変数の変更: 可能
 このポインタの変更: 可能

? const char * hage2;
 このポインタが指している変数の変更: *不可能*
 このポインタの変更: 可能

? char * const hage3 = &betsuno_hage;
 このポインタが指している変数の変更: 可能
 このポインタの変更: *不可能*

? const char * const hage4 = &betsuno_hage;
 このポインタが指している変数の変更: *不可能*
 このポインタの変更: *不可能*
554 :デフォルトの名無しさん2011/12/07(水) 19:45:05.40
>>553
おお、初めて知った

ついでに質問だけど、ある変数を途中からconst扱いにってできる?
557 :デフォルトの名無しさん2011/12/07(水) 22:15:00.64
>>554
無理・・・と考えていい

int x;
if (!tryGetX(..., &x)) { return false; }

こういう状況はよくあるよね。この地点でxを固定したい
558 :デフォルトの名無しさん2011/12/07(水) 22:39:50.01
>>557
無理なのかーまあ途中からconstで変数増やせばできるといえばできるが

一旦定義してfor文で回した後は固定したいとかよくあるよね
559 :デフォルトの名無しさん2011/12/07(水) 22:51:24.86
C++なんだから例外使えばいいよ

int tryGetX_(...) {
int x;
if(tryGetX(..., &x)) return x; else throw exception;
}

try {
const int x(tryGetX_(...));
...
}
catch(...) {
return false;
}
571 :デフォルトの名無しさん2011/12/08(木) 13:04:58.90
>>588
>>559-564といった感じで上手い方法は無い

ループ内の処理が長いのであれば、その部分をinline関数として抜き出して、その関数の戻り値をconstで受け取ればいい
ループ内の処理が短かったり、inline展開されるか不安であれば、我慢して非constで使う
最適化を気にしているのであれば、ローカル変数がconst/非constであることはそれにほぼ関与しないから問題ない

まぁ、throwされた時のコストを気にすべき環境では例外は使わないかな
560 :デフォルトの名無しさん2011/12/07(水) 22:53:42.48
tryGetの類いは例外を避ける為に作られる関数なんだから
例外使えば良いよってのはない
562 :デフォルトの名無しさん2011/12/07(水) 23:17:49.31
bool is_success;

const int x = GetX( &is_success );
if( is_success ){}
else {}

throw使いたくないなら引数に判定を持ってくるぐらいしかないだろ
563 :デフォルトの名無しさん2011/12/07(水) 23:29:48.15
なんだかんだ言って例外が一番スマートだね
例外が駄目だっていう人も殆どはただの好みの問題で拒否ってるだけだし
564 :デフォルトの名無しさん2011/12/07(水) 23:39:44.89
if( !IsXNull() ) return;
cont int x = GetX(); // 結局ここでIs〜で取りこぼした分は例外にしなきゃならん。無駄。
566 :デフォルトの名無しさん2011/12/08(木) 10:15:05.17
他の言語は知らんけどCプラプラでメソッドってあまり存在価値無くないですか?
例えばbeginメソッドとか書いても結局使うのはブーストのbegin関数(かそれを真似した関数)を通して使いますよね
テンプレートを使うと特に顕著です
テンプレート型のオブジェクトのメソッドをコールするときは必ずメソッドをコールするだけの関数を通して呼びます
利用者側がカスタマイズする時に助かるからです
でもこんなことなら最初から関数にすればいいのではないでしょうか?
569 :デフォルトの名無しさん2011/12/08(木) 12:49:44.32
>>566
仮想関数どうすんの?
570 :デフォルトの名無しさん2011/12/08(木) 13:01:14.63
>>566
>例えばbeginメソッドとか書いても結局使うのはブーストのbegin関数(かそれを真似した関数)を通して使いますよね
>テンプレートを使うと特に顕著です
>テンプレート型のオブジェクトのメソッドをコールするときは必ずメソッドをコールするだけの関数を通して呼びます
boostのbeginは配列とコンテナに同じインターフェースを設けるためだよ
意味不明な理由でインターフェース増やしまくる馬鹿はおまえだけ
573 :デフォルトの名無しさん2011/12/08(木) 23:45:25.75
>>566
>でもこんなことなら最初から関数にすればいいのではないでしょうか?
すればいいんじゃね。
仮想関数との透過的扱いが不要だと思うんなら、全てfriendにするなり好きにしたらいいんじゃね。
いつの日か多重メソッドに対応するものができたら得するかもしれん。

 どうでもいいが、C++は、Smalltalkの様にメッセージとメソッドが別れてないから、
メンバー関数のことをメソッドとは言わん。Javaみたいな恥ずかしいことを書くな。
579 :デフォルトの名無しさん2011/12/09(金) 00:19:12.79
>>573
>メンバー関数のことをメソッドとは言わん。Javaみたいな恥ずかしいことを書くな。

しらんがな、MS に言ってくれよ。
http://msdn.microsoft.com/ja-jp/library/bb3b0dfs.aspx
581 :デフォルトの名無しさん2011/12/09(金) 00:22:53.14
>>579 自己解釈だらけのMSなんか相手にすんなよ。
コンパイラからファイルフォーマットから余計な拡張ばっかしやがる
企業なんて追いかけても無駄。数年後にはまた用語が変わる。
583 :デフォルトの名無しさん2011/12/09(金) 02:25:01.38
>>581
むしろMFCは変わってないからメソッドのままなんだよ。数年どころか20年間メソッドのままだよ
標準化されたところは標準の用語になってる
585 :デフォルトの名無しさん2011/12/09(金) 07:35:34.29
>>583

引っ張りたくないが、ソースはどこだよ。
http://msdn.microsoft.com/en-us/library/f33y54z5(v=vs.80).aspx

用語なんてどうでもいいじゃんってのは、
「見た目が同じだから、クラスを全部構造体って言えばいいじゃん」
と言われるのと同じ感覚なんだが、言い訳しかしないしどうでもいいや、好きにすりゃいい。
572 :デフォルトの名無しさん2011/12/08(木) 13:37:08.33
ループするなら関数呼び出しも例外もコストなんか気にしないのが普通
574 :デフォルトの名無しさん2011/12/08(木) 23:49:36.31
くだらない言葉遊びですね
オモシロクナイですよ、それ
580 :デフォルトの名無しさん2011/12/09(金) 00:19:58.76
>>574
言葉以前に構造が全然違う。
メンバー関数は、関数と関数ポインターでしか無いが、
メッセージ&メソッドは、メッセージをキーに対応するメソッドを探し出す。
さらには、転送やら、未対応メッセージに対しデフォルトメソッド起動やら
高機能かつ重い。
587 :デフォルトの名無しさん2011/12/09(金) 08:59:07.19
>>580
ちげーよバカ
メソッドはオブジェクトのもつ手続きという以上の意味はない
C++のメンバ関数もメソッドで正解なんだよ
お前の言ってるメソッドはメソッドの実装の一つでしかないといことに気がつけモンキー
603 :デフォルトの名無しさん2011/12/09(金) 22:19:47.75
>>587
適当なことを言うな。ProcedureでしかなかったSimulaのVirtual Procedureに対し、
Message送信と処理が分離しており区別する必要があったSmalltalkが導入した語句だ。
Smalltalk, Objects, and Designでも買って読んでみろ。
605 :デフォルトの名無しさん2011/12/09(金) 22:24:47.20
>>603
お前が馬鹿だろこのアンポンタン
言葉ってのは時代の流れに乗って変化していくものなんだよ
現代でメソッドっていったらオブジェクトの手続き部分以上の意味はない
607 :デフォルトの名無しさん2011/12/09(金) 22:34:01.41
>>605
お前はJavaでもRubyでもつかってろって
Smalltalkと対立関係があり、逆にObjective-C++として
近親関係でもあるC++だとMethodはSmalltalkと
Objective-CのMethodを指すんだよ。
575 :デフォルトの名無しさん2011/12/08(木) 23:52:13.21
Simulaを侮蔑するのはやめろ!!!
578 :デフォルトの名無しさん2011/12/09(金) 00:02:23.76
>>575
SimulaはProcedureじゃん
576 :デフォルトの名無しさん2011/12/08(木) 23:58:21.17
用語もまともに使い分けられんクズはJavaなりC#なりRubyなり巣にカエレ
577 :デフォルトの名無しさん2011/12/08(木) 23:58:52.51
言葉遊びが面白くないのなら最初から正確な表現を心掛けるんだな
582 :デフォルトの名無しさん2011/12/09(金) 00:40:21.29
概念としてはほぼ同じと見れるし、
構造をはっきりと意識して使い分けるならば違うとも見れるわけだし、
目くじらたてる必要はないよな
584 :デフォルトの名無しさん2011/12/09(金) 03:16:26.48
「他の言語の言葉をここで使う必要は無い」
「とりあえず通じてるからいい」
系のレスを途中まで書いては見たものの、かなり低レベルなことに気付いて全部消した
おなかすいた
586 :デフォルトの名無しさん2011/12/09(金) 08:50:04.91
クラスと構造体はどこが違うの?
あおりじゃなくまじで教えて?
589 :デフォルトの名無しさん2011/12/09(金) 09:34:06.75
>>586
まず、その「クラス」と「構造体」の定義をした方がいいと思うよ。
C++ の class と struct の話なのか、一般的なクラスと構造体の概念の話なのかで
答えが変わってくるから。
591 :デフォルトの名無しさん2011/12/09(金) 11:28:12.70
>>586
知ってるくせに()
588 :デフォルトの名無しさん2011/12/09(金) 09:31:55.67
class A{
private:

struct A{
public:

それぞれ、ブロックの最初にprivateとpublicが暗黙に書かれてると思えばおk
592 :デフォルトの名無しさん2011/12/09(金) 12:19:36.98
たとえばIDを返すことを強要したい場合、以下のようにインターフェイスを設けるべきだと言われますが、
class IItem {
public:
  virtual ID GetID() const = 0;
  virtual ~IItem() {}
};

このような場合、分かりきっている実装は含めたほうがよくないでしょうか。
class IItem {
public:
  virtual ID GetID() const { return id; }
  virtual ~IItem() { id_.Release; }
protected:
  IItem(ID id) : id_(id) {}
private:
  ID id_;
};

また調べているうちにNVIパターンというものを知りました。
class IItem {
public:
  ID GetID() const { return DoGetID(); }
  virtual ~IItemA() {}
private:
  virtual ID DoGetID() const = 0;
};

他言語ではインターフェイスは純粋な仮想関数を含むクラスという制限がありますが
その制限のない、というかインターフェイスという概念のないC++において、実装を含むクラスをインターフェイスと呼べるのでしょうか。
またインターフェイスという仕様に沿うために、実装を完全に派生クラスに移譲する設計をしているのか、
基底クラスに実装を含めたほうがいいと考えられるようなものでも、あえてそうしない理由があるのか、教えてください。
606 :デフォルトの名無しさん2011/12/09(金) 22:30:24.62
>>592
メンバーの実装強要は置いといて、
データメンバーの無い、仮想関数を持ったクラスは親に持っておくべき。
2個めの実装を持ったクラスをつくってもいいが、そのクラスは親に、
データメンバーの無いクラスを持っておいておいたほうがよい。

君のIItemを継承したクラスがidを必ずしも必要とするとは限らないからね。
IItemの子クラスが、メンバー変数に、IDを取得できるオブジェクトをもっていて、
IDをGetIDから返す際は、そのオブジェクトに問い合わせるって実装を作ったら、
IItemのidは死荷重になる。IDがポインタで表現されてるとかだと、大した量でも無いが、
GUIDみたいな物だと、IItemを配列に突っ込んだ時、死荷重の割合が増大する。
594 :デフォルトの名無しさん2011/12/09(金) 12:54:07.73
インターフェースで定義してしまうとインターフェースを2つ継承してるときにちょっと困る時がある
http://codepad.org/Pdq237yc
http://codepad.org/prvKp2Ql
前にCOMの真似してvirtual AddRef/Releaseを使ってみようとしてハマった記憶があるよ
派生クラスにほとんど共通で書きなおすのがめんどい機能を提供したいなら
struct BasicFunctions {
ID GetID(void) const { return id_; }
void SetID(ID id) { id_ = id; }
private:
ID id_;
};

struct ItemEx : IItem {

596 :デフォルトの名無しさん2011/12/09(金) 15:09:51.43
いや、ほんと、ループって重い処理なんだね。
素数判定で思い知った。
目的のインデックスに達するまでループするのと
乗算やmodを使ってインデックスを直接割り出すのとで
対して速度違わねーだろと思ってたのに
10億回も呼び出されるとなると軽く1秒とか2秒の差になるのな^^

そりゃ、日本のゲームが海外のゲームみたいな
綺麗な画面、華麗な動き、活き活きとしたキャラクターを描けないわけだ。
604 :デフォルトの名無しさん2011/12/09(金) 22:22:27.05
>>596
んな事をするバカは日本にも稀だ。
ループのコストについても履き違えてる。
609 :デフォルトの名無しさん2011/12/10(土) 00:23:12.66
>>596
活き活きを履き違えてるな。活き活きさせるにはループ内で迅速に関連変数を書き換えないといけない。で、描画する。
その根本の動作はモーションキャプチャで撮ってきてたりするが、
結局どのタイミングで関連変数を書き換えて反映するかの一点しかない。

動きというものがループで生成される画像の連続なんだぞ?
597 :デフォルトの名無しさん2011/12/09(金) 16:54:54.45
class HogeItem : public Item { ... };

class Foo
{
 virtual shared_ptr<Item> GetItem() const;
};

class Bar : public Foo
{
 // ?
 virtual shared_ptr<HogeItem> GetItem() const { return this->pItem; }

 // ?
 virtual shared_ptr<Item> GetItem() const { return this->pItem; }
 virtual shared_ptr<HogeItem> GetX() const { return this->pItem; }

 shared_ptr<HogeItem> pItem;
};

shared_ptrを戻り値としたばあい共変性が保てないんだな
?が無理だと知ったんだけど、?の方法を取るしかないの?
あと、?のGetX(仮)関数の名前はどんなのがいいだろう?
598 :デフォルトの名無しさん2011/12/09(金) 17:57:37.03
>>597
GetXはvirtualにする意味ないだろ
599 :デフォルトの名無しさん2011/12/09(金) 18:33:02.52
インターフェースクラスをテンプレートクラスとして定義して
型を指定して継承って可能?
608 :デフォルトの名無しさん2011/12/10(土) 00:15:43.03
まぁあれだ。メンバ関数をメソッドと呼んだり、基底クラスをスーパークラスとか呼んだりする人は
Javaから流れてきた連中でたいていはとんでもないプログラムを書いてプロジェクトを荒らす^^
JavaとC++がまったく別物だということに無頓着なことが多い。弱る。
611 :デフォルトの名無しさん2011/12/10(土) 09:26:21.24
>>608
もういいから老人は放射能で早く死ねよ
612 : ◆QZaw55cn4c 2011/12/10(土) 11:02:51.05
>>608
new/delete が癌ですかね?それともポインタ?
613 :デフォルトの名無しさん2011/12/10(土) 11:15:38.84
規格で決まってる名前なんだからしょうがないだろ。
C++にはメソッドとかスーパークラスなんて名称はない。
ちなみにメンバ変数なんてのもないし、戻り値なんてのものない。

…通じるからいいじゃん、という意見なら賛成だ
614 :デフォルトの名無しさん2011/12/10(土) 12:06:20.30
何でfunctionよりmethodが使われるようになったのかね
戻り値の型がvoidなものもfunctionと呼ぶのが気持ち悪かったのだろうか
615 :デフォルトの名無しさん2011/12/10(土) 15:55:15.52

bool型のポインタを返すfunc()という関数内で、ポインタの配列ptrを作成し、
同じくfunc()関数内で作成したaという配列のアドレスを代入しました。

その結果、「func ここから〜func ここまで」、を見る限りptrはaのポインタとなっているようです。

このfunc関数でptr[0]を返し、main関数内のmain_aに代入したところ、アドレスは一緒なのに何故か中身が全て0になってしまうのです。(bool型ということが関係しているようで、bool*をint*にするとmain_aでも正常にポインタとして機能してくれます。)

そして、質問なのですが、bool型でも*main_aを正しく表示させるにはどうしたらいいのでしょうか。
ソースと出力結果は次に書きます。
616 :6152011/12/10(土) 15:56:21.12
-------------------ソース------------------------------
#include <iostream>
using namespace std;
bool* func(){
bool* ptr[5];
bool a[5]={1,0,1,1,0};
cout<<"func ここから"<<endl;
for (int n=0;n<5;n++){
ptr[n]=&a[n];//aのアドレスを入れる
cout<<"ptr: "<<ptr[n]<<" *ptr: "<<*ptr[n]<<endl;
}
cout<<endl;
for (int n=0;n<5;n++){
cout<<" &a: "<<&a[n]<<" a: "<<a[n]<<endl;//出力
}
cout<<"func ここまで\n"<<endl;
return ptr[0];
}
int main(){


bool* main_a;
main_a=func();

cout<<"main内"<<endl;
for (int n=0;n<5;n++){
cout<<"&main_a: "<<main_a+n<<" *main_a: "<<*(main_a+n)<<endl;//アドレスとその中身を出力
}
return 0;
}
617 :6152011/12/10(土) 15:57:23.76
------------出力結果-------------------
func ここから
ptr: 002AF9AC *ptr: 1
ptr: 002AF9AD *ptr: 0
ptr: 002AF9AE *ptr: 1
ptr: 002AF9AF *ptr: 1
ptr: 002AF9B0 *ptr: 0

&a: 002AF9AC a: 1
&a: 002AF9AD a: 0
&a: 002AF9AE a: 1
&a: 002AF9AF a: 1
&a: 002AF9B0 a: 0
func ここまで

main内
&main_a: 002AF9AC *main_a: 0 //アドレスが一致しているのに値が異なっている・・・型がおかしい?
&main_a: 002AF9AD *main_a: 0
&main_a: 002AF9AE *main_a: 0
&main_a: 002AF9AF *main_a: 0
&main_a: 002AF9B0 *main_a: 0

連投すみませんがよろしくお願いします。
618 :デフォルトの名無しさん2011/12/10(土) 16:02:11.43
main_aが参照しているのは関数内のローカル変数aなんだから
ローカル変数が破壊された後は、その中身がどうなってるかなんて
神の味噌汁だよ。
624 :6152011/12/10(土) 16:29:54.23
>>618-621
ありがとうございます!
なるほど。破棄されるんですね。警告はでませんでした・・・

破棄されないようにするにはstatic使えば大丈夫ですよね。


本題とは関係ないのですが、
なぜbool*を全部int*に置き換えてやった場合はmain内でもうまくいったのでしょうか?
たまたまですかねw
619 :デフォルトの名無しさん2011/12/10(土) 16:02:42.28
ローカル変数のアドレスを返してるんだからおかしくなるに決まってる
621 :デフォルトの名無しさん2011/12/10(土) 16:17:04.05
int * func() {
 int a = 100;
 return &a;
} // この地点で変数 a は破棄される

なので、このようにして
int * b = func();
戻り値として取得した、"破棄された a" を指すポインタ b は何をさしているのか分からない

というか警告出ないのか?
623 :デフォルトの名無しさん2011/12/10(土) 16:29:09.76
最終的に実現したいのは任意の入れ子になったvectorの表示です。
とりあえず2次元からと思い、以下のコードを作りましたが何も表示せず終了してしまいます。問題点を教えてください。
再帰以外の手法でも構いません。

http://ideone.com/Z8vSR


と投稿しようとしたら、ideoneがエラー表示してくれてるのに気付いて(iが未初期化だった)ひとまず再帰での表示は解決しました。
なので、むしろ他の手法についてうかがいたいです。
625 :デフォルトの名無しさん2011/12/10(土) 17:08:27.56
>>623
同じ発想をちょっと整理してみたYO

#include <vector>
#include <iostream>
#include <memory>
#include <algorithm>
#include <iterator>

template< typename T, template< typename E, typename A = std::allocator< E > > class C >
std::ostream &operator <<( std::ostream &os, C< T > c ) {
for ( C< T >::const_iterator i = c.begin(); i != c.end(); ++i ) os << *i;
return os;
};

int main(){
using namespace std;

vector< int > v(3,1);
cout << "コンテナ出力" << v << endl;
vector< vector< int > > u(3, vector<int>(2,2));
cout << "入れ子ンテナ出力" << u << endl;
vector< vector< vector < int > > > w(3, vector< vector< int > >(2, vector< int >( 3, 3 ) ) );
cout << "入れ入れ子ンテナ出力" << w << endl;

}
653 :デフォルトの名無しさん2011/12/11(日) 06:07:02.85
>>625
おお……<<をオーバーロード!
シンプルで良いですね。ありがとうございます。
int以外を突っ込んだときの問題も解決されていてありがたい限りです。
626 :デフォルトの名無しさん2011/12/10(土) 18:09:35.81
全くの初心者というか知識が全くないんですが
ウイルスの処理とか自分でしてみたいのと
ゲームとか作れるようになりたいんですが
どんな勉強をすればいいんですか?
高くてもいいんでおすすめの本とかを教えてくれると嬉しいです
627 : ◆QZaw55cn4c 2011/12/10(土) 18:37:33.97
>>626
ウィルス技術は本にはならないだろう。チェルノブイリウィルス(CIH) とかのソースはもしかすると手に入るかもしれない、win95/98/me限定だが。もっとも手が後ろに回る覚悟が必要。
628 :デフォルトの名無しさん2011/12/10(土) 18:59:30.44
>>627
すいません
言い方がいけなかったです
ウイルス対策のソフトとかを使わないで自分のパソコンに入ってきた
やつをなんとかしたいだけです

あとパソコン自体に詳しくなりたいんですが
何を学べばいいかよくわからなくて
あとは上の通りです
629 :デフォルトの名無しさん2011/12/10(土) 19:01:27.71
>>626
>ウイルスの処理とか自分でしてみたいのと

ウィルスを作りたいのか、ウィルスを処理するプログラムを作りたいのか?

いずれにしろ、>>627 の言うように公的な本はないと思う。

あと下記Q3〜6 あたりに目を通しておいた方がいいよ。
http://www.moj.go.jp/content/000073750.htm
630 :デフォルトの名無しさん2011/12/10(土) 19:08:03.48
>>629
ああ、処理する方か。
何とかする方法は、ウィルス毎に違うからウィルス毎に対策するしかない。
個人では事実上無理だと思う。

金をかけたくないだけならフリーの物を入れればいいし、どうしても何とかしたいなら
VMWare / Virtual PC とかの仮想化ソフト上でいろいろやって、ウィルスに感染したら
がっさり捨てると言うのが現実的。

> あとパソコン自体に詳しくなりたいんですが

何のために? パソコンと言っても、いろんな要素があるから、方向ぐらい決めないと
誰もアドバイスできないと思うよ。
631 :デフォルトの名無しさん2011/12/10(土) 19:20:17.02
>>629 >>630
ありがとうございます
>>630
何をやりたいとかというのが漠然としてまして...
というか
なんといったらいいかわからないというか
強いて言うならゲームとかを作ってみたいです
あとロボットとかのプログラミングとかをしたり
そういうことがしたいです
632 :デフォルトの名無しさん2011/12/10(土) 19:30:03.20
>>631
とりあえず検索をすることを勧める

ゲーム プログラミング

これで検索してからにしな
633 :デフォルトの名無しさん2011/12/10(土) 19:35:21.19
>>632
すまないありがとう

あと
聞きたいんですけど
イラスト用のソフトとかってどうやって作ってるんですか
これも
それを学べばできるようになりますか
636 :デフォルトの名無しさん2011/12/10(土) 20:07:07.45
>>631
ゲームはプログラミングとしてあまりに広大な幅を持っているから、
どれからはじめれば・・・というのは悩み所だな
とはいえ成果が目に見てわかりやすい2d,3dプログラミングは楽しいと思う
glfw+OpenGLとか結構お手軽に始められるし。
637 :デフォルトの名無しさん2011/12/10(土) 20:15:16.24
>>636
ありがとうございます

この二つは上はわかるような気がしますが
したのglfw+OpenGLというのが全くわからないです

おすすめのサイトや本などを教えてくれると嬉しいです
640 :デフォルトの名無しさん2011/12/10(土) 20:22:03.31
>>633
GUIはC++だと敷居が高くなりがちだし、
C#あたりで始めたほうが挫折しにくいかと
641 :デフォルトの名無しさん2011/12/10(土) 20:38:53.04
>>640
分かりました
じゃあまずそのC#っていうのから学んでみます
とりあえず本を買ってそれに沿って学んできます
少し調べたんですが猫でもわかるってやつでいいですかね

あと誰か>>636お願いします
642 :デフォルトの名無しさん2011/12/10(土) 20:44:01.41
>>641
ググればどちらも一番上にあるぞ
643 :デフォルトの名無しさん2011/12/10(土) 20:46:10.20
>>642
マジですか(-_-;)
644 :デフォルトの名無しさん2011/12/10(土) 20:50:10.44
>>642
続けてすいません
glfw+OpenGLってググッたら一番上が英語で全くわからなかったです(-_-;)
634 :デフォルトの名無しさん2011/12/10(土) 19:37:40.41
画像を扱うという点では共通した部分も少なくないと言えなくもない
635 :デフォルトの名無しさん2011/12/10(土) 19:42:10.34
個人的には、ロボットとかの動くものの方が面白いと思う。

※ 個人の感想です。
638 :デフォルトの名無しさん2011/12/10(土) 20:15:37.29
ペイントレベルなら習作で作れると思う
GUIの入門書でも大体あると思う(全部にあるとは言わんが)
645 :デフォルトの名無しさん2011/12/10(土) 20:50:51.58
お前は個別に検索するとか一番上以外も見るとか
日本語のページを検索とかできないのかw
646 :デフォルトの名無しさん2011/12/10(土) 20:53:09.30
>>645
個別ってどこできるんですか!?
647 :デフォルトの名無しさん2011/12/10(土) 20:55:11.28
>>646
glfwとOpenGL別々に検索かけろよ
自分で調べる癖付けないとゲームつくろうなんて夢のまた夢だぞ
648 :デフォルトの名無しさん2011/12/10(土) 20:58:46.97
>>647
すいません(-_-;)
+も普通に名前に含まれてて繋がってるのかと思ってました

649 :デフォルトの名無しさん2011/12/10(土) 22:02:41.12
OpenGLの解説というとGLUTを使った説明だけで終わるサイトが多いのはなんでだ?
実用的なプログラム書こうとしたら、WGLまでおしえなきゃ如何だろ。
DirectXに人が流れる一因じゃないか?
650 :デフォルトの名無しさん2011/12/10(土) 22:05:26.77
>>649
たのんだ
654 :デフォルトの名無しさん2011/12/11(日) 11:16:08.04
>>649
OpenGLはWindows以外で使われる事が多いし〜
WindowsならDirectX使う方が楽だし〜
652 :デフォルトの名無しさん2011/12/10(土) 22:19:37.93
XならXGL、ツールキットがあるならそれのバインドインターフェース。
MacならCocoaでバインド。委細は違えど、どの環境でも要るだろ。
655 :デフォルトの名無しさん2011/12/11(日) 17:10:20.95
shared_ptrの最適化についてなんだが・・・

virtual void Hoge::Func()
{
 const boost::shared_ptr<Piyo> sp(this->pPiyo);
 Piyo* const p(sp.get()); // "ここ"

 p->SetX(1);
 p->SetY(3);
 p->Print();
}

上記の"ここ"がないとアセンブリが長くなるんだけど、なぜなんだ?
658 :デフォルトの名無しさん2011/12/11(日) 17:59:32.94
>>656
でもオーバーロードは
T * operator-> () const // never throws
{
 BOOST_ASSERT(px != 0);
 return px;
}
これだけで、BOOST_ASSERTは非デバッグ時に最適化で削除される
それでもshared_ptr::pxに関する最適化がされないものなの?

>>657
使われない部分は作成されないのは理解しているけど、>>655の例ではそれはどの部分ですか?
667 :デフォルトの名無しさん2011/12/11(日) 19:34:49.92
>>659
コンパイラはvc2005。最適化に関する設定はデフォ
operator->自体のinlin展開はされているんだ。
ただ、>>655のとおり、sp->SetX(1) イコール p->SetX(1)にならない理由が知りたい

http://codepad.org/KeVHGvt0
"== Func4" と書かれているものは最適化の結果、Func4として展開されている
656 :デフォルトの名無しさん2011/12/11(日) 17:37:58.57
boost::shared_ptrがoperator ->をオーバーロードしてチェックなどの処理をはさんでいるから。
657 :デフォルトの名無しさん2011/12/11(日) 17:43:07.20
テンプレートは使わない部分は実体化されないってルールの帰結ですね。
659 :デフォルトの名無しさん2011/12/11(日) 18:12:07.27
じゃあオーバーロードされた関数がinline化されてないだけじゃね。
どのコンパイラ使ってるか知らんけどMSVCならデフォだとinline指定に関わらずinline展開するかどうかコンパイラが勝手に判断するし。
660 :デフォルトの名無しさん2011/12/11(日) 18:14:52.99
100%インライン化されるからと言って
関数の実体が作られないわけじゃないんじゃないの
多重定義を防ぐために、オブジェクトファイル内で
多重定義があっても無視する属性を付与しておく必要があるだろうし

実験してみたらどうよ
675 :デフォルトの名無しさん2011/12/11(日) 20:09:54.29
>>667
いいから>>660実験してみたらどうよ
676 :デフォルトの名無しさん2011/12/11(日) 21:00:14.35
>>675
e?実験する内容が分からないぞ。具体的な実験内容を教えてくれ
最適化した後はoperator->(のオーバーロード)のcallは見つからないのは確かだが
679 :デフォルトの名無しさん2011/12/11(日) 21:20:35.86
>>676
それはインライン化された事を確認しただけ
インライン化されたものとは別に、
インライン化されていない関数の実体が存在するかチェックすべし
661 :デフォルトの名無しさん2011/12/11(日) 18:48:08.78
クラスの設計について質問したいんだが、
AってクラスとBってクラスがあります。
それぞれ、privateメンバとして、xとy座標を持っています。

BクラスからAクラスの座標を取得してあれこれしたい場合、
どういう設計が一番いいと思いますか?

思いついたのは、Aクラスの座標を静的メンバにして、
publicのstatic関数を作って、Bから取得する、という方法しか思いつきませんでした。

でもこれかなり変な設計な気がします。
何かアドバイス下さい。
664 :デフォルトの名無しさん2011/12/11(日) 19:02:47.07
>>661
>BクラスからAクラスの座標を取得してあれこれしたい場合、

これがまずいような気がするんだが。

そのあれこれの処理をAクラス側に持たせるわけにはいかんのか?

できないなら素直にBに座標を読み出すメンバ関数作ればいいだけじゃないの?
665 :デフォルトの名無しさん2011/12/11(日) 19:17:42.36
>>664
あれこれっていう説明が悪かったですね。
単純に座標を取得して、AとBとの角度を出したかったんです。

でもAとBは完全に独立したクラスなので、
それぞれのクラスをメンバとして持たせたくなかったんです。
第三のクラスを作って、そこからAとBクラスの座標を関数で取得して、
角度を計算することはできるんですが、それではその値は第三のクラスしか取得できません。
その角度をBクラス内で利用したかったので困ってました。

やっぱりこの場合はBクラスのメンバとしてAクラスのオブジェクトを持たせ、
そいつから関数呼び出して取得するしかないですよね。

何かお互いに独立したクラスなのに、お互いをメンバに持つのがなんか気持ち悪いんですよね。
662 :デフォルトの名無しさん2011/12/11(日) 18:52:15.22
両方シングルトンにしてお互いにオブジェクトを持つと良いよ
663 :デフォルトの名無しさん2011/12/11(日) 18:56:00.70
>>662
はぁ〜。なるほど。
頭いいですね。
ありがとうございました。

他にもいい方法があれば書いてくれると嬉しいです
666 :デフォルトの名無しさん2011/12/11(日) 19:19:34.36
ついでにもう一つアドバイス下さい。
このAとBの当たり判定をする場合は、
第三のクラス内で当たり判定すべきか、それともA/Bどちらかのクラス内でするべきかどっちがいいと思いますか?
671 :デフォルトの名無しさん2011/12/11(日) 19:49:01.04
>>666
AとBの親クラスで当たり判定X::Conflict( a, b );
674 :デフォルトの名無しさん2011/12/11(日) 19:55:37.52
>>671-672
なるほどー
やっぱり当たり判定は親クラスの方が良さそうですね。

当たり判定用の座標は親クラスからなら、
A/Bクラスのpublic関数を呼び出して取得できるので大丈夫そうです。

角度をBクラス内で利用するには、Aクラスのオブジェクトをメンバとして持たせるしかなさそうですね。

皆さんありがとうございました!
677 :デフォルトの名無しさん2011/12/11(日) 21:19:22.96
>>674
当たり判定して何したいの?
衝突したいだけなら、判定単品はいらないと思うけど。

double 弾.衝突( 障壁[i] );
double 衝突( 障害物 &障害物 )
{
      // 判定から、衝突の振る舞いまで、障害物にまかせる。
      ベクター += 障害物.破壊衝突( 衝撃量 , this->座標 );
      return ベクター.ノルム();
}
668 :デフォルトの名無しさん2011/12/11(日) 19:35:40.67
別のクラスを作って座標を渡して結果を得るべき
673 :デフォルトの名無しさん2011/12/11(日) 19:51:45.19
>>669
なるほど
すごい参考になりました。ありがとうございます。

>>668
座標を取得するところまでは、お互いのクラスをメンバとして持たせて取得するってことですか?
当たり判定は他のクラスの関数に座標を渡してやれってことですか?

ん〜もうちょっと考えてみます。
669 :デフォルトの名無しさん2011/12/11(日) 19:36:31.84
まったく抽象的でわからん話だが、
仮にクラスAをインベーダー、クラスBを砲台としよう^^

インベーダーと砲台の衝突判定は、砲台に聞けばいい。
「おまえはインベーダーと衝突しているか?」ってね。
砲台は各インベーダーに自分の位置情報を渡して
「おまえは俺と衝突しているのか?」と聞くに違いない。

情報を要求してはいけない。
情報を与え指示するのだ。

角度もそうだ。角度の情報を画面に表示するのでもなければ、
その「角度」は何か必要な動作のために「情報」に過ぎないはず。
情報を要求してはいけない。動作を指示せよ。

ぬんぱら。
670 :デフォルトの名無しさん2011/12/11(日) 19:39:06.84
>>669
衝突判定は、弾にやらせた方がいいんじゃね?
678 :デフォルトの名無しさん2011/12/11(日) 21:20:24.59
>>670
シューティングゲームだったら弾じゃなくて機体のほうがいいと思う
空間登録と1つに対する判定のコストは平均して定数とすると弾と機体の数がそのまま計算コストのオーダーになる
ふつうは弾のほうが多いから弾で判定するのは良くないだろう(まあ弾同士がぶつかるとかだとどっちみち必要だけど)
681 :デフォルトの名無しさん2011/12/11(日) 21:25:08.33
>>678
マジレスしてくれてありがとう。
でも、今の話には弾は関係なかったりするんだな。

インベーダーと砲台の関係なので。
672 :デフォルトの名無しさん2011/12/11(日) 19:50:47.53
衝突判定ライブラリとかだと
? broad-phase で交差する可能性のあるペアを集めて、
? narrow-phase で物体同士の交差判定を行う

つまり、衝突判定は第3者が行う
680 :デフォルトの名無しさん2011/12/11(日) 21:22:36.87
手で書ける程度の有限個の定数だったら
switchをifで書いてもぜんぜん差はないよね?
682 :デフォルトの名無しさん2011/12/11(日) 21:45:06.05
>>680
switch で書ける物は
switch で書いた方が可読性は高いと思うよ
1つの変数の値で分岐してるんだな、というのが一目でわかるので
プログラムは人間も読む物なので、文脈も考えて書くと良いよ
683 :デフォルトの名無しさん2011/12/11(日) 21:53:48.72
>>680
測ってみりゃいいのに。
684 :デフォルトの名無しさん2011/12/11(日) 21:57:26.64
switchでかける個数に限界があるから気を付けたほうがいい
686 :デフォルトの名無しさん2011/12/11(日) 22:13:28.23
>>684
マジで。switchなんか殆ど使わんから初めて知った。
256個ぐらいか?
687 :デフォルトの名無しさん2011/12/11(日) 22:29:49.11
視認性的な意味のような気がする。あれは基本、スコープ付きgotoだし。
689 :デフォルトの名無しさん2011/12/11(日) 22:57:00.28
別にgotoじゃねぇよ。
処理スタックを下降はできても遡れるようには出来てない。
処理スタックを破壊するgoto化しないように制限は掛けてある。
691 :デフォルトの名無しさん2011/12/12(月) 00:42:23.56
boolをcharにキャストしようとしてもできないんだけどこれは仕様?
693 :6912011/12/12(月) 00:51:26.24
ミスって書きこんでしまいました。さーせん

bool型のをchar型に変換してprintfで出力したらおかしくなったんだけどどうにかならないですかね。

int main(){
bool a=1;
printf("%c",(char)a);
return 0;
}

出力: 』 が上下逆転したような文字が・・・

もしかしてcharの1(%c での1)って%dの1じゃないってことですかね?(わかりにくくてすみません)
694 :デフォルトの名無しさん2011/12/12(月) 00:56:39.29
int i = 1;と
char c = '1';は違うってことはわかるよね?
695 :デフォルトの名無しさん2011/12/12(月) 00:59:36.04
>>694
やっぱ違うんですか・・0~9の数字は一緒だと思ってましたw

boolの1をキャストしてcharでも1と表示させるにはどうすればいいですかね
696 :デフォルトの名無しさん2011/12/12(月) 01:05:56.72
ttp://codepad.org/sREkV689
1と表示するだけならこれだけでいいだろ
charでもっていう意味がわからない
数値の1を文字の'1'にしたいってことか?
697 :デフォルトの名無しさん2011/12/12(月) 01:09:56.71
>>696
レスさんくす!

それがprintfではなくて、文字を描画する関数に渡すのでchar型にしないといけないんです。おうふ。
699 :デフォルトの名無しさん2011/12/12(月) 01:34:48.05
>>697
これで変換できるハズだが。
char ToChar(bool n)
{
    return '0' + n;
}
698 :デフォルトの名無しさん2011/12/12(月) 01:12:43.99
ttp://codepad.org/e0LnV7ry
sprintfは覚えといたほうがいい
700 :デフォルトの名無しさん2011/12/12(月) 01:42:41.15
>>698
ありがとう!!

今アドバイス通りsprintfでやっていたんですが、

int main(){

bool b[5]={0,1,0,1,1};
char c[5]="";
for (int i=0;i<5;i++){
sprintf_s(&c[i],'1', "%d", b[i]);
}

printf("%s",c);
return 0;
}

これでやっていたらコンパイルはできてもエラー
(Debug Error! Run-Time Check Failure #2 -Stack around the variable 'b' was corrupted)

がでてしまって停止してしまいました。
結構色々見直したつもりなのですが、何がだめなのでしょうか。。(調べてもわかりませんでした。)

bがイったってのはわかるのですが、それがどういう原因によるものなのかがわからなかったので知恵を貸して下さい。
(何度もすみません)

マイクロソフト ワイヤレス ブルートラック マウス Arc Touch Mouse RVF-00006
マイクロソフト ワイヤレス ブルートラック マウス Arc Touch Mouse RVF-00006