C++相談室 part92

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
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
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
4デフォルトの名無しさん:2011/11/04(金) 02:00:25.16
5デフォルトの名無しさん:2011/11/04(金) 02:01:09.37
6デフォルトの名無しさん:2011/11/04(金) 02:20:57.01
■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/
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
8デフォルトの名無しさん:2011/11/05(土) 12:49:24.51
落ちるぞ。
9デフォルトの名無しさん:2011/11/05(土) 19:50:36.17
>>1
おつ
10デフォルトの名無しさん:2011/11/05(土) 20:34:16.48
11デフォルトの名無しさん:2011/11/05(土) 23:55:51.53
びよーんすぽすぽがどうした?
12デフォルトの名無しさん:2011/11/06(日) 01:51:28.66
禿は女の尿を飲み続けると改善するらしい
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
英語英語がたがた抜かすな。
コードは世界共通だ。
恐れることはない。
17デフォルトの名無しさん:2011/11/07(月) 00:09:55.73
むしろコード読んでから解説読んでフムフムするんだ
18デフォルトの名無しさん:2011/11/07(月) 00:56:46.36
そうそう
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関数で再定義する以外に方法ある?
20デフォルトの名無しさん:2011/11/07(月) 01:56:02.79
exAでBをoverrideしなきゃいいんじゃね。
てか、親classから派生classの関数を呼び出す処理は往々にして糞だ。
21デフォルトの名無しさん:2011/11/07(月) 01:59:16.20
ネーミングセンスがないな
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
25デフォルトの名無しさん:2011/11/07(月) 07:58:56.01
これってNVIだよね
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
そのコードでどんな動作を期待してて何がどう変なんだ?
28デフォルトの名無しさん:2011/11/07(月) 10:19:48.84
うんこコードの量産を期待して頭が変です
29デフォルトの名無しさん:2011/11/07(月) 10:22:07.44
>>26
duplicate()がスマートポインタを返す設計で使えるかも?
30デフォルトの名無しさん:2011/11/07(月) 11:04:13.01
C++11 の変更点をまとめた専門書ってありますか?
31デフォルトの名無しさん:2011/11/07(月) 11:04:28.61
>>27
仮想関数ならb->putでDerivedの方のput()を呼び出してくれるんじゃないのかい
32デフォルトの名無しさん:2011/11/07(月) 11:20:23.17
設計直せでFA
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を呼び出す事でした
勘違いしてたようです
35デフォルトの名無しさん:2011/11/07(月) 12:59:21.63
あーこれでもだめですね
二重にNVIを使わないといけないのか

#include <cstdio>

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->duplicate()->put();
d->duplicate()->put();

delete d;
delete b;
}
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;
}
37デフォルトの名無しさん:2011/11/07(月) 13:01:48.66
>>30
MayersがPDF売ってるよ
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は継承に関して不変だからムリだな
おとなしく仮想関数をインターフェースにしたほうがいいと思うよ
41デフォルトの名無しさん:2011/11/07(月) 17:19:16.29
何がしたいのかわからん
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
もしもしなのでちょっと読んだだけだけど、これは単にそれっぽく隠蔽しただけなのでは……
仮想関数使った共変と振る舞いが一致しない場合があると思うんだけど


あと
>隠蔽(オーバーロード)
ってのは確実に誤りだな
44デフォルトの名無しさん:2011/11/07(月) 17:43:46.05
やっぱりですね
ありがとうございました
45デフォルトの名無しさん:2011/11/07(月) 17:56:36.65
共変返り値ってあって嬉しかったこと一度もないんだけどどんなときに使うの?
46デフォルトの名無しさん:2011/11/07(月) 18:02:50.52
よく考えると確かにないですね
どうせ返り値ってポインタだし、仮想関数で勝手に切り替えてくれるのですから
基底クラスへのポインタが返ればそれにNVIを適用すれば十分なはずです
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なんでしょ?
だったら別にわざわざオーバーライドした関数呼ぶ必要ないじゃん
49デフォルトの名無しさん:2011/11/07(月) 23:23:58.61
紛らわしいけど、objectは全然違う型。
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を突っ込んでるわけじゃないのでインライン展開される
54デフォルトの名無しさん:2011/11/07(月) 23:43:42.36
なるほどなっとくした
55デフォルトの名無しさん:2011/11/08(火) 23:57:43.27
classの継承でpublic継承はよく使うけどprivate継承とprotected継承はどんな時に使うの?
56デフォルトの名無しさん:2011/11/09(水) 00:03:13.46
boost::noncopyableはprivate継承する
他はあまり見ないな
57デフォルトの名無しさん:2011/11/09(水) 01:20:06.02
boost::operatorsもprivateでOKだっけ?
どういう原理か知らないけど。
58デフォルトの名無しさん:2011/11/09(水) 01:25:44.27
friendは継承しないから
59デフォルトの名無しさん:2011/11/09(水) 01:51:38.78
>>55
プライベートは「それを実装手段とする」
プロテクテッドは不明。

ってメイヤーが。
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 に比べて何がうれしいの?
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を継承しなくて済むようになる。
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って何のためにあるんだっけ?
単に 親クラス::メンバー; って書いても同じだよね。
68デフォルトの名無しさん:2011/11/10(木) 00:55:15.03
派生クラスは継承したんじゃなかったんかいバカヤロー
に対するしどろもどろな顛末が using
69デフォルトの名無しさん:2011/11/10(木) 01:04:18.25
>>66
そういやprotected継承だと孫クラスが、thisを親クラスを引数にとる関数に渡せるって点がある。
private継承だと、孫と親は同じオブジェクトだと解っててもキャストできない。
親クラスを取る関数に孫を渡したいが、外部からむやみに親にアクセスされたくない場合に多少つかえる。
70デフォルトの名無しさん:2011/11/10(木) 01:10:10.38
>>68
ん? 親クラス::メンバー; じゃ孫からは、メンバーとみなされないってこと?
71デフォルトの名無しさん:2011/11/10(木) 01:14:06.20
>>69
protected データメンバ並みに要らんな。
72デフォルトの名無しさん:2011/11/10(木) 01:14:32.49
>>69 C++ でおk
73デフォルトの名無しさん:2011/11/10(木) 02:41:42.27
protectedが必要になった時点で何かおかしいから見直す
74デフォルトの名無しさん:2011/11/10(木) 02:53:20.98
>>73
protectedデストラクタは必要だろ
75デフォルトの名無しさん:2011/11/10(木) 02:55:37.00
継承の話だろ
76デフォルトの名無しさん:2011/11/10(木) 03:05:35.65
それなら必要ない
77デフォルトの名無しさん:2011/11/10(木) 09:15:07.29
protected は中途半端。
方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
78デフォルトの名無しさん:2011/11/10(木) 12:35:07.45
>>77
そういうのを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
まあそうなんだけど、大人の事情でって事あるじゃん
84デフォルトの名無しさん:2011/11/10(木) 16:51:43.31
頭隠して尻隠さずとでも言うところか
85デフォルトの名無しさん:2011/11/10(木) 17:37:38.18
protectedデストラクタは必要だろ
86デフォルトの名無しさん:2011/11/10(木) 17:39:30.31
継承の話だろカス
87デフォルトの名無しさん:2011/11/10(木) 17:40:12.71
88デフォルトの名無しさん:2011/11/10(木) 17:44:06.95
protectedデストラクタ厨必死だなww
89デフォルトの名無しさん:2011/11/10(木) 19:50:26.59
>>66
protectedメンバをprotectedメンバのままにしておきたい場合に
protected継承する事になる、ということ
private継承すると、protectedメンバをprotectedメンバのままにするには
protectedなとこで全部usingしないといけなくなる
90デフォルトの名無しさん:2011/11/10(木) 20:05:20.15
はいはい
91デフォルトの名無しさん:2011/11/10(木) 21:07:08.16
ばぶー
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継承に限らず)は、
子に抽象化関数を実装することを義務付けた上で
機能提供することだろうがな。
98デフォルトの名無しさん:2011/11/11(金) 01:07:46.81
ラララララーラララーララ・・・
99デフォルトの名無しさん:2011/11/11(金) 01:09:07.16
>>97
ファイルスコープ内を信用するなら public でもいいじゃん。
100デフォルトの名無しさん:2011/11/11(金) 09:14:19.38
protectedよりfriendの方がましだわ
子には公開できて孫には公開しないとか簡単にできるし
protectedでは簡単に間違いが起こってしまう
101デフォルトの名無しさん:2011/11/11(金) 13:21:00.13
子作りするときだけ公開するところ
102デフォルトの名無しさん:2011/11/11(金) 14:29:00.39
friendはゴミ
103片山博文MZ ◆0lBZNi.Q7evd :2011/11/11(金) 16:15:13.72
>>102
友達できないタイプですね。
みんな友達になればアクセスが簡単。冗談だけど。
104デフォルトの名無しさん:2011/11/11(金) 16:29:07.03
('ω`)…
105デフォルトの名無しさん:2011/11/11(金) 19:32:10.07
template <class F> class SystemForF
{
friend class F;
void DangerousMethod(void);
};

class Hoge : SystemForF<Hoge>
{
public:
void Func(void) { ...; DangerounsMethod(); ...; }
};

//Good!


template <class F> class SystemForF
{
protected:
void DangerousMethod(void);
};

class Hoge : SystemForF<Hoge> { ...; };

class ViciousClass : SystemForF<ViciousClass>
{
public:
SystemForF<ViciousClass>::DangerousMethod;
};

// Oh my god!!

106デフォルトの名無しさん:2011/11/11(金) 21:28:32.42
親クラスに付けるprotectedはともかく、
メンバーに付けるprotectedは、親クラスじゃなく
子クラスを守るための物だろ。
子が生成したバッファを親に参照させるとかの用途には
friendじゃ代用品にならない。
107デフォルトの名無しさん:2011/11/11(金) 21:32:12.81
protected厨はほんとにしつこいな
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 ); //コンパイルが通ってアウト

そもそも用途が違う。どちらかが代用になるもんじゃない。
109デフォルトの名無しさん:2011/11/11(金) 21:59:28.35
コンパイルが通るように書くからだろアホ
110デフォルトの名無しさん:2011/11/11(金) 22:01:02.20
friendでコンパイル通らないように同じ事を書いてみろよ
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
親を守ることが目的じゃないんぞ
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の出番はない
114デフォルトの名無しさん:2011/11/11(金) 22:11:50.18
>>111
Socket, File, Pipe, Mail, 派生が出来るたびに追加すんのかい
派生クラスがいくら出来ても問題ないのに
115デフォルトの名無しさん:2011/11/11(金) 22:14:31.91
>>113
Base同士の互換性がなくなるな
116デフォルトの名無しさん:2011/11/11(金) 22:14:35.18
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にしとけばこんなことはなかったのにな
118デフォルトの名無しさん:2011/11/11(金) 22:19:59.05
>>113
バイナリ肥大するだけじゃん
friendに拘って何がしたいの?
119デフォルトの名無しさん:2011/11/11(金) 22:22:25.26
>>117
子が守られようとしてるのに、何で子に自殺させてんの?バカなの?
120デフォルトの名無しさん:2011/11/11(金) 22:25:33.04
>>119
わかってねーな
自殺させちゃうカスグラマがどこに潜んでるかわからねーのが現場の怖いところだろうが
とにかくまずい事は簡単にはデキないようにすることが至上命令だ
121デフォルトの名無しさん:2011/11/11(金) 22:26:00.03
Unkoを書いたヤツがバカなだけなのにな
122デフォルトの名無しさん:2011/11/11(金) 22:27:41.70
>>120
困るのはUnkoなだけで、
他は困らんから大した問題じゃない。
123デフォルトの名無しさん:2011/11/11(金) 22:30:37.56
class Unko: public Derived
{
C c;
public:
Unko(void){ Bind(&c); }
};

どうすんだこれprotectedとか危険過ぎる
124デフォルトの名無しさん:2011/11/11(金) 22:34:49.63
Unkoは解っててやってんだろ
125デフォルトの名無しさん:2011/11/11(金) 22:37:19.85
いやわかってねえよwww
ベースを根元まで熟知してないと安全に継承できないとかどんだけ馬鹿な設計なんだよ
126デフォルトの名無しさん:2011/11/11(金) 22:41:36.92
バカを救う必要はない
127デフォルトの名無しさん:2011/11/11(金) 22:43:56.82
だな
protectedなんて使うバカは放置が最善策だわ
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);
      }
};
130デフォルトの名無しさん:2011/11/11(金) 23:06:42.03
friend厨沈黙
詰んだな
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
適当なこと言うな
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使えとは言ってないんだがねぇ
方法はいくつもあるのにシンプルに済むことを
ひとつの方法に拘って複雑にしなけりゃいい
137デフォルトの名無しさん:2011/11/12(土) 04:56:57.68
顔の赤さに免じて許してやれよ
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 になるのですが
以前のバージョンだと出ませんでした。
仕様が変わったのでしょうか



139デフォルトの名無しさん:2011/11/12(土) 09:57:16.49
左様
140デフォルトの名無しさん:2011/11/12(土) 12:23:20.07
ありがとうございます。
似たような表記で書くにはどうすればいいですか?
141デフォルトの名無しさん:2011/11/12(土) 12:48:44.36
std::initializer_list<char> a;
a = { 1, 2, 3 };
142デフォルトの名無しさん:2011/11/12(土) 12:48:54.72
char *s = {'\1', '\2', '\3', '\4'};
143デフォルトの名無しさん:2011/11/12(土) 13:00:45.74
char *s = "\x1\x2\x3\x4";
144デフォルトの名無しさん:2011/11/12(土) 13:03:01.81
文字列、配列リテラルを初期値とするポインタの宣言const付いてないとエラーにして欲しい
145デフォルトの名無しさん:2011/11/12(土) 18:09:26.37
gccは以前から警告
VCは提案却下
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
実装依存だがどちらもスタックになるだろう。
その前になぜ自分で測定しない?
149デフォルトの名無しさん:2011/11/12(土) 20:43:59.82
スタック
150デフォルトの名無しさん:2011/11/12(土) 20:47:56.91
>>147
無名オブジェクトはスタックに作られる。
同じか、fがムーブ可能な場合速くなる可能性がある
151デフォルトの名無しさん:2011/11/12(土) 20:51:26.80
テンポラリを直接放り込んだほうが最適化しやすいし早くなるよ
152デフォルトの名無しさん:2011/11/12(土) 21:10:36.69
>>147
そのコードだと完全にコンパイラ次第。
同じコンパイル単位にある関数はinline指定子の有無を無視して
インライン展開するコンパイラが多い。
153デフォルトの名無しさん:2011/11/12(土) 21:16:39.50
>>147
gでXをstatic constしといたらもっと早いんじゃね?とか思ったけどどうなんだろ
154デフォルトの名無しさん:2011/11/12(土) 22:01:28.16
さあ
155デフォルトの名無しさん:2011/11/12(土) 22:09:38.52
飲み込んでくれィ
156147:2011/11/12(土) 22:13:49.42
スタックに積まれるんですね

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

コンパイラの最適化と、ムーブに期待して、無名一時オブジェクトで書くことにします
皆さん、アドバイスありがとうございました
157デフォルトの名無しさん:2011/11/12(土) 22:14:27.39
うむ、下がってよし
158デフォルトの名無しさん:2011/11/12(土) 22:23:20.31
期待するとかじゃなく、スタックトレースとかアセンブリみて確認しとけよ
159デフォルトの名無しさん:2011/11/12(土) 22:27:18.96
そんなもん見たって環境代わったら同じにはならない
大まかな傾向だけ理解して書ける方が偉いわ
160デフォルトの名無しさん:2011/11/12(土) 22:42:36.42
マシン語くらい使えろよ、頼むから
161デフォルトの名無しさん:2011/11/12(土) 22:45:47.83
お前の頼み聞いて得することなんて一つもないしなぁ
162デフォルトの名無しさん:2011/11/12(土) 22:46:03.16
大まかな傾向を理解するために、実際の動作をしらべるんだろ。
理屈上そうなるから多分そうなるだろうじゃ根拠が薄いだろ。
163デフォルトの名無しさん:2011/11/12(土) 23:28:01.59
あほか。C++のコードを実験で理解するな。
あくまで規格表に従えよ。

でないとVCみたいなクソコンパイラのクソ独自仕様に惑わされて
可搬性のない(次のアップデートで反故にされかねない)クソコードを量産する
クソプログラマになっちまうぞ、クソ。っていうかクソVCをクソ捨てればクソ済むんだけどね/(^o^)\
164デフォルトの名無しさん:2011/11/12(土) 23:32:25.25
クソクソうるせーよクソ野郎
165デフォルトの名無しさん:2011/11/12(土) 23:40:59.79
あくまで規格票に従えよクソ

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

合致度の低いコンパイラや、合致度はそこそこでも現にバグを見つけたりしたとき
クソっていう対象がコンパイラな単純低次元はどっかいけ
目の前の現実への自分の対応をクソと謙虚に自省する人には助太刀いたすかって気にはなる
166デフォルトの名無しさん:2011/11/12(土) 23:56:25.79
最適化はコンパイラの裁量だから、
コンパイラの動作を観察するしかねぇだろボケ
167デフォルトの名無しさん:2011/11/13(日) 00:12:09.68
ご機嫌ななめってるときにピエロしか選択肢はないと割り切るポリシーだな
168デフォルトの名無しさん:2011/11/13(日) 00:29:52.34
VCは糞だろ。
169デフォルトの名無しさん:2011/11/13(日) 01:03:35.76
で、オススメのコンパイラはどれなんだ?
170デフォルトの名無しさん:2011/11/13(日) 01:04:54.55
clang++
171デフォルトの名無しさん:2011/11/13(日) 01:43:51.90
VCがクソならおまえらでVCを超えるコンパイラ作ってくれ
172デフォルトの名無しさん:2011/11/13(日) 02:17:20.69
俺gccのコミッターだからキリッ
173デフォルトの名無しさん:2011/11/13(日) 03:42:53.05
最適化がされるか否かはコンパイラによって違うだろうが、
そのコードが最適化され易いかどうかは共通だぞ
174デフォルトの名無しさん:2011/11/13(日) 07:04:48.48
>>168
mfcが糞で、c++11に準拠する気がまるで無いだけで、コンパイラとしては速いコード吐く方


175デフォルトの名無しさん:2011/11/13(日) 11:04:12.44
未だにMFCで新規開発してるところってあるんかね。
Qt触るとMFCが汚物過ぎて受け付けん。
176デフォルトの名無しさん:2011/11/13(日) 11:21:03.59
MFCは設計が古いからだろうね。
マイクロソフトがまだテンプレートにもダイナミックキャストにも
否定的だった時代に作られたものらしいし。
177デフォルトの名無しさん:2011/11/13(日) 11:42:03.36
古いプロジェクトを継続してるところは使ってたりする
178デフォルトの名無しさん:2011/11/13(日) 15:32:48.49
MFCはしょうがないじゃん。Win32の薄いラッパーでしかないから。
179デフォルトの名無しさん:2011/11/13(日) 15:46:00.90
COM統合してることを考えると薄いラッパーとは言えないのでは。
薄いどころかがっつりフレームワークだと思うけど。
180デフォルトの名無しさん:2011/11/13(日) 15:52:01.24
VS2010で、MFCプロジェクト作ってビルドしてみたらすごいことになってた。
MSはまだやる気まんまんじゃないか。
181デフォルトの名無しさん:2011/11/13(日) 16:22:46.42
WTLとは何だったのか
182デフォルトの名無しさん:2011/11/13(日) 16:32:00.37
便利だよね
183デフォルトの名無しさん:2011/11/13(日) 16:57:00.85
>>179
ロクな枠組みが無いんだからフレームワークは言い過ぎ。
あくまでC++用ラッパーの域は出ないよ。
184デフォルトの名無しさん:2011/11/13(日) 21:57:28.34
超初心者ですみません
vc++とかでプロジェクトの設定をする時に
includeのパスを通すのは分かるんですが
libにパスを通す意味ってなん何でしょうか
185デフォルトの名無しさん:2011/11/13(日) 21:58:13.23
Win32 VCL WTL wxWidget Qt WinForms WPF Swing AWT
これらは使い方が分かるんだけど
MFCだけわけがわからない
186デフォルトの名無しさん:2011/11/13(日) 22:06:28.67
>>184
ヘッダファイルじゃなくてライブラリのディレクトリパスを指定する
187デフォルトの名無しさん:2011/11/13(日) 22:06:42.39
>>185
これ読めば、大分分かるようになる

標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング
http://www.amazon.co.jp/gp/product/4881357042
188デフォルトの名無しさん:2011/11/13(日) 22:10:06.49
>>186
ありがとうございます。
ライブラリのファイルを読んでくることの必要性というのは何なのでしょうか
includeは、
#include <stdio.h>
などでよく使うので馴染みがあるのですが
初心者ゆえライブラリというものをどういう時に使うのかが分からないのです。
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
すみません
ではそちらで質問させて頂きます
191デフォルトの名無しさん:2011/11/13(日) 22:43:09.25
>>188
ライブラリを使いたい時に使う、としか
DXライブラリでも使ってみれば?
192デフォルトの名無しさん:2011/11/13(日) 22:50:05.42
>>188
コンパイルとリンクの区別がつかないと理解できないかもね
ヘッダーファイルはコンパイル時に必要になるもの。
ライブラリはリンク時に必要になるもの。

ヘッダーは宣言が書いてあり(そうとは限らないが)、ライブラリーにはその実装が記述されてる。
ヘッダーとライブラリーは直接関連付けられているものじゃないから、
どちらか片方指定したからといって、もう一方が自動で取り込まれることはない。
193デフォルトの名無しさん:2011/11/14(月) 00:15:18.58
>>187
その本昔持ってた
古い本だしもうMFCは使わんと思って
処分してしまったわ
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は無いと思う。
有効かどうか解らない戻り値を
そこらじゅうでチェックすんのも効率悪いし。
198デフォルトの名無しさん:2011/11/14(月) 09:38:05.95
アクセッサの時点で負けだから設計からやり直しに決まってんだろ
199デフォルトの名無しさん:2011/11/14(月) 10:02:54.72
>>195
うーん無いと思いますね…。
shared_ptrを返しますが、それは有効かもしれないし無効かもしれません。
十分注意してチェックして使ってくださいね。ってことになるでせふ。
それならそのままweak_ptrを返すほうがまだミスの恐れがなくていいと思うのだけど。
200195:2011/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:
 A GetOwner();
private:
 void SetOwner(@);
 weak_ptr<HogeContainer> pOwner;
};

このばあいの@・Aの型は何がよいのだろうか
但し、Aの戻り値からshared_ptrを取得できることが条件
201デフォルトの名無しさん:2011/11/14(月) 12:43:27.95
寿命の関係や返り値で得たポインタを他のクラスに所有されても良いのかダメなのかによって異なる
202195:2011/11/14(月) 23:14:19.76
>>201
Aの戻り値から得たshared_ptrをどこかで長期的に保存(共有)しても構わない
どのみち、weak_ptrを返してもそれを制限する術は無いだろうし
203デフォルトの名無しさん:2011/11/14(月) 23:19:56.99
>>202
あんた自身の意見がよくわからん。
shared_ptr を返すことで何か不満なのか?
204195:2011/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 だけだな。
ヌルを返したくないなら例外投げるなりすればチェック漏れも無いんだから、
あんまり有用な意見だとは思わないね。

設計が〜っていうのは、先に実装ありきでインターフェースを後から考えてるのが
ダメっていう一般的な話。具体的なコードを指して言ってるんじゃない。たぶん。
207デフォルトの名無しさん:2011/11/15(火) 02:01:09.51
説明用のサンプルコードに突っ込みいれるのもなんだけど>>200を見る限りでは設計見直せと言いたくなるな。

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

・そもそもHogeからHogeを所有してるHogeContainerが直接わかる事に意味はあるのか?
HogeContainerからHogeを解放したいとかの用途ならHogeに専用の関数を個別に用意すべきではないか?
208デフォルトの名無しさん:2011/11/15(火) 02:23:46.06
ほげほげうるさいわ
209195:2011/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()に意味は無いのかと問いたい
210デフォルトの名無しさん:2011/11/15(火) 05:45:16.78
まあがんばれ
211デフォルトの名無しさん:2011/11/15(火) 08:30:09.48
勝手に離脱するギミックは最初はクールに見えるが後で面倒が多いことに気がつく
イテレータ回してるときに抜けられるとコンテナの種類によってはバグになるし
生存フラグを使う方法のほうがいいよ。ダサイけど
212デフォルトの名無しさん:2011/11/15(火) 08:56:50.10
> ツリー構造でノードが持つGetParent()に意味は無いのかと問いたい
それは個々の要素自体がコンテナの管理者でもある場合で要素と要素の管理者が異なる場合とは違う。
STLコンテナだとイテレータから前後の要素はわかってもコンテナ自体はわからないだろ。
213195:2011/11/15(火) 09:46:46.27
>>211
そこら辺は要考慮だが、イテレータを使用している最中にコンテナの要素を削除して問題あるのはvectorぐらいだし、
そもそもフラグを使用しても今度はいつコンテナから要素を削除するのか問題になる

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

だがちょっと待ってほしい。自分が質問した内容は>>200な訳で、
@ = const shared_ptr<Hoge> &
A = shared_ptr<Hoge>
は問題ないということで宜しいか?
214デフォルトの名無しさん:2011/11/15(火) 09:56:16.53
>>213
ぶっちゃけそんな細かいところどうでもいいから好きにすればいいよ
215デフォルトの名無しさん:2011/11/15(火) 10:37:22.61
本筋と違うと話だというならそれはそれで

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

>>216
その説明だと"ダサい"に当てはまる範囲が大きすぎね?
220デフォルトの名無しさん:2011/11/15(火) 11:55:30.03
あー、確かに広すぎた。
221片山博文MZ:2011/11/15(火) 13:29:45.45
ふふふ、諸君はわたくしに勝てるかな。。。
222デフォルトの名無しさん:2011/11/15(火) 16:21:07.57
ダサいちゅーか基本として内部データ見せちゃだめだわな。
223デフォルトの名無しさん:2011/11/15(火) 17:45:23.69
コンテナなのに内部データ見せないで何するんだよカスwww
224デフォルトの名無しさん:2011/11/15(火) 18:02:28.65
そもそも何で今更オレオレコンテナを作ろうとしてんのさ
225デフォルトの名無しさん:2011/11/15(火) 18:04:10.17
タスクシステムです
226デフォルトの名無しさん:2011/11/15(火) 18:28:11.47
>200のコードはあくまでも説明のためのサンプルだよね?
実際に使うのがあの設計だったらいくらなんでも拙いだろ
227デフォルトの名無しさん:2011/11/15(火) 18:29:56.32
じゃあお前らだったらどうするの?
228デフォルトの名無しさん:2011/11/15(火) 18:37:04.83
C++で動的確保した配列を解放する場合って、

delete [] test;

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

もしかして自分で作ったクラスはこの解放の仕方使えないとかですか?
リークしてるのは、crtdbg使って調べました
229デフォルトの名無しさん:2011/11/15(火) 18:40:41.27
主はvectorを使いなさいとおっしゃった
230デフォルトの名無しさん:2011/11/15(火) 18:40:43.72
ちゃは☆
このクラスをラップしてるクラスを解放してませんでした☆
忘れてください☆
231デフォルトの名無しさん:2011/11/15(火) 20:05:57.15
>>228
これみて思い出した。
GCCで明示的にデストラクタを呼び出したオブジェクトに
再度アクセスしたら落ちた。
デストラクタでメモリー解放とかしてなかったんだけど
なんで落ちたかな。
昔の事なんで状況をはっきり思い出せん。
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の中サーチしてみたけど入ってないみたいだけど?
236デフォルトの名無しさん:2011/11/16(水) 00:13:40.99
デバッグビルドならありうる
237デフォルトの名無しさん:2011/11/16(水) 00:29:18.57
238デフォルトの名無しさん:2011/11/16(水) 00:54:35.52
>>225
いまだにそんな珍妙なもん作ろうとしてるやつがいるのか。驚きだわ。
239デフォルトの名無しさん:2011/11/16(水) 01:02:11.35
誘導されてきました。

質問です。

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

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

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

どう修正すればいいかお知恵をお貸しください。
あと、なぜそうなのかをご教示くだされば幸いです。
240239:2011/11/16(水) 01:04:38.55
末尾に空白が入ってしまいました。
ttp://ideone.com/n4aAH
241デフォルトの名無しさん:2011/11/16(水) 01:11:11.01
別に修正する必要無いね。
242239:2011/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自体を本格的に触ったのが今日はじめてなので感覚がつかめてないのです。
247デフォルトの名無しさん:2011/11/16(水) 01:38:53.60
外部からSeedわたす意味がなくなってるな
248デフォルトの名無しさん:2011/11/16(水) 01:46:11.70
>>247
それはstdlibのrand()を使うことに対してですか?
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
これをやってるっていうことは、初期値がどのような値にもかかわらず、
定数で初期化されて、ランダム要因は配列の長さだけになってる気がします。

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

回答者の方。非常に勉強になりました。
ありがとうございました!!
失礼します。
251デフォルトの名無しさん:2011/11/16(水) 03:13:20.53
スターどっきりかよ
252デフォルトの名無しさん:2011/11/16(水) 03:23:56.57
どこにスターがいたのかと・・・。
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とか
254デフォルトの名無しさん:2011/11/16(水) 04:45:04.34
>>253
奥村の人か。この人のアルゴリズム本持ってる!!でも、読み解けては無い!
まー、それはいいとして。

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

でも、紹介してくれてありがとう!!ちょっと読んでみるよ。
255254==239:2011/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の方は初期化忘れや初期化順の混乱とかがおこるかもしれませんが、ファイル名はアプリケーションで指定できるので競合しません
どっちがいいんでしょうか
258デフォルトの名無しさn:2011/11/16(水) 15:56:36.13
クラス Hoge のオブジェクトの生成はいつか。グローバル ?
Fuga::Load() をいつ呼び出すのか ?
そもそも、Hoge と Fuga には「ファイル名を内側で用意する/外から与える」のほかにも
差があるよん。
259デフォルトの名無しさん:2011/11/16(水) 19:30:32.47
そもそも、設定なんかをグローバルで共有したりなんかしない。
260デフォルトの名無しさん:2011/11/16(水) 19:34:43.37
またその話か
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
再利用するものは部品化して、設定は外部から与えるが、
再利用するわけもないものまでそんな事するのは無駄なだけ
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 );
266デフォルトの名無しさん:2011/11/16(水) 20:19:03.74
>>264
設定自体は使い捨てなんだよ。
最利用するのはロジック部。
設定がロジックに入れ込むと取り外して再利用するのが難しくなる。
267265:2011/11/16(水) 20:22:01.70
std::istreamは要らん。間違えた。
268デフォルトの名無しさん:2011/11/16(水) 20:26:34.58
factory f; f.load("config.lua");
hoge h(f.make());
269デフォルトの名無しさん:2011/11/16(水) 21:07:39.60
>>266
再利用を見越したものは当然そうだろう
そういう物はそもそもライブラリ化しておく
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 の特殊化が必要な気配でありなんであり…もう、頭がフットーしそうだよおっっ。

なんか、良い文献知りませんか(´・ω・`)
271デフォルトの名無しさん:2011/11/16(水) 22:17:25.74
>>269

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

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

ブラウザのタブやら、モデリングツールのビュー、DTMツールのビュー
そういったビュー系のオブジェクトをライブラリ化することはあまりない。
そのビュー自体がプログラムのアイデンティテであるし、拡張の対象になるから
枯れたものとしてライブラリに追加するのは難しい。
ビューの他にもシーケンス制御のノードとかコマンド系オブジェクトも同じ傾向にある。
272デフォルトの名無しさん:2011/11/16(水) 23:19:14.29
>>270
Boost.Iostream あたりで楽にならんのかな?
273デフォルトの名無しさん:2011/11/16(水) 23:27:30.76
ライブラリとして作るだけで
別に共用する必要は無い
改造して再利用するにしても、分離されてると色々と楽よ
274デフォルトの名無しさん:2011/11/16(水) 23:30:39.32
それはライブラリじゃなくてオブジェクトコードじゃないか?
275デフォルトの名無しさん:2011/11/16(水) 23:53:11.52
なんでやねん
276デフォルトの名無しさん:2011/11/16(水) 23:56:39.02
>>272
わかりました、ソース読んでみます。どもども。(´・ω・`)
277デフォルトの名無しさん:2011/11/17(木) 00:43:49.70
>>273
.libか.dllにするって言ってる?
278デフォルトの名無しさん:2011/11/17(木) 01:47:51.32
std::container<boost::weak_ptr<Type>>型のコンテナがあって、その中身1つごとに複数回アクセスする処理があるんだけど、
weak_ptr.lock()を呼び出すタイミングはどうしたらいい?
その度に呼び出していたら速度的に損だし、分岐も増えて、嫌だ

処理の初めにweak_ptr.lock()を呼び出して、取得したshared_ptr<Type>を他のdequeとかにつっ込んで、それに対して処理を行い、
処理が終わったそのdequeなりを空にする
こんな方法は間違ってないんだろうか
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>> に出来ない理由があるのなら
それでいいんじゃない?
281デフォルトの名無しさん:2011/11/17(木) 08:48:44.67
生存してほしい期間に合わせてlockする
282デフォルトの名無しさん:2011/11/17(木) 13:35:10.63
>>270
クラスを自作するなら、
operator<< の中で reinterpret_cast すれば終わりじゃね?
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時のコピーコンストラクタで例外が発生したらキャッチされると保証されてる?
285デフォルトの名無しさん:2011/11/18(金) 19:47:27.97
普通は戻り値最適化が行われるから
コピーコンストラクタ自体動かないので
あまり考えた事無いな・・・
286デフォルトの名無しさん:2011/11/18(金) 20:09:37.07
デバッグでは戻り値最適化は恐らくカットされるので真面目に考えた方が良さそう
287デフォルトの名無しさん:2011/11/18(金) 20:19:19.10
function try blockでないのが気になってしょうがない
288デフォルトの名無しさん:2011/11/18(金) 20:50:07.17
>>284
仕様が気になるなら仕様見たら?
289デフォルトの名無しさん:2011/11/18(金) 21:08:45.26
前やってみたらデバッグでも戻り値最適化はされてたような
さらに昔にやったときはされなかった気もするが
290デフォルトの名無しさん:2011/11/18(金) 21:15:44.25
とりあえず、gccでは関数内のcatchに制御が移るみたい

ideoneコンパイル終わらない。。
ttp://ideone.com/QRPa5
291デフォルトの名無しさん:2011/11/18(金) 21:25:55.97
ぐは。。ideoneと手元の環境で、結果が違う…
ttp://ideone.com/6Ylmh
292デフォルトの名無しさん:2011/11/18(金) 21:44:20.61
戻り値最適化されてるだけじゃん
293デフォルトの名無しさん:2011/11/18(金) 22:02:46.96
-fno-elide-constructorsしろよ
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に書いた式の評価とは別の話で関数の返却値となる一時オブジェクトについての話とみるのが自然だろう。
295デフォルトの名無しさん:2011/11/19(土) 16:23:24.81
ふ〜ん
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() に価値はありますか?
297デフォルトの名無しさん:2011/11/20(日) 12:24:29.26
誤:void SetPiyo(Piyo * pPiyo) { this->pPiyo = NULL; }
正:void SetPiyo(Piyo * pPiyo) { this->pPiyo = pPiyo; }
298デフォルトの名無しさん:2011/11/20(日) 13:27:50.82
>>296-297
それだけの内容で判断するのは無理。

しかし↓こっちのスレならなんとかしてくれるかもしれない。
http://hibari.2ch.net/test/read.cgi/tech/1187922645/
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 されてしまっても構いません
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" を付ける関数となります
305デフォルトの名無しさん:2011/11/21(月) 17:25:22.92
bool Fuga()にしてpPiyoがぬるぽならfalse返す仕様にすればいい
そうすりゃ動かなくても戻り値チェックしてないお前が悪いで通る
306デフォルトの名無しさん:2011/11/21(月) 18:46:55.84

std::vector<Klass*> v;
v.reserve(N);
Klass *pArray = new T[N];
for(int i=0; i<N; ++i){
pArray[i].init();
v.push_back(&pArray[i]);
}


//開放
delete [] v[0];
v.clear();
v.swap(v);

コンテナのインターフェイスを使いたいんですが、この使い方であってますか?
本当は、これ以上動的にメモリを確保することがないのでpush_backとか禁止したいのです。
継承するとか委譲を使って、ラップするしかないでしょうか?
307デフォルトの名無しさん:2011/11/21(月) 18:50:49.47
std::vector<Klass> v(N);
for(int i(0); i != N; ++i) {
v[i].init();
}
308デフォルトの名無しさん:2011/11/21(月) 19:45:54.64
v.swap( std::vector<Klass>() );
309デフォルトの名無しさん:2011/11/21(月) 20:31:09.39
>>307-308
ありがとうございます。
安全対策としてコンテナに実体を入れたくないんです。
と思ったがこれ以上メモリ確保しないならこれでいいかも、いやよくねーよ?
http://codepad.org/JBC4Abvr
310デフォルトの名無しさん:2011/11/21(月) 20:35:12.09
意味が分からないよ
311デフォルトの名無しさん:2011/11/21(月) 21:05:56.98
Klassにちゃんとコピーコンストラクタと代入演算子を定義してないからそうなる
312デフォルトの名無しさん:2011/11/21(月) 21:27:51.64
すまない。
別にコンテナに実体を入れるかポインタを入れるか、
コピーコンストラクタがとか聞きたかったわけじゃなかったんだ

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

実際聞きたかったことは,、push_backとか禁止したvectorないのってことです
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が便利そうだな
ポインタがコンテナから消えると自動的にポインタの指すクラスのデストラクタを
呼び出してくれる
317デフォルトの名無しさん:2011/11/21(月) 22:09:47.36
ソート用の参照配列だろ?
実態のコンテナとポインタのコンテナ2つ用意するのが堅実
318デフォルトの名無しさん:2011/11/21(月) 22:38:57.49
>>313
むしろboost::arrayがいいです。
クラスメンバにarray<T>とかサイズを後回しで宣言して使えるなら、使いたいです。

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

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

>>316
ぐぐってみます

皆さんありがとうございました。
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のバージョンをご認識しているかと思うのですが、
どうしたらよいのでしょうか?
320デフォルトの名無しさん:2011/11/21(月) 23:10:51.88
>>318
まずは用語を適切に扱いなさい
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;
322デフォルトの名無しさん:2011/11/22(火) 00:05:21.27
下手の考え休むに似たり、とはよく言ったものだ
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が出るのは何故なのでしょうか
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
横槍だけど、すると整数型にキャストしたりするとポインタのアドレスになったりするのか
328デフォルトの名無しさん:2011/11/22(火) 12:21:02.97
なるよ
329デフォルトの名無しさん:2011/11/22(火) 12:29:21.00
ちゃんと size_t で受けるんだぞ
330デフォルトの名無しさん:2011/11/22(火) 12:35:19.21
まぁvoidポインタにするだけでアドレス値は表示できる気が
331デフォルトの名無しさん:2011/11/22(火) 13:28:22.61
>>329
アウトだよ
332323:2011/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にキャストして表示しなさい
335デフォルトの名無しさん:2011/11/22(火) 21:18:35.82
size_tにしてprintfで表示するのが一番手っ取り早い
336デフォルトの名無しさん:2011/11/22(火) 21:24:11.74
整数として表示したら見づらいだけだろ
現実問題、処理系依存だろうとポインタに最適化されてる
void*表示のほうが見やすい
そもそもsize_tが32bit、ポインタ64bitの環境じゃアドレスが欠ける。
337デフォルトの名無しさん:2011/11/22(火) 21:27:30.93
printfで出力すんなら%pでsize_tへのキャストなんかいらんだろ
338デフォルトの名無しさん:2011/11/22(火) 21:33:40.77
ポインタの表示は処理系依存だと何度言えば
自分で出力の仕方くらい決めさせてくれ

それに規格的には%pに渡すにはvoid*へのキャストが必須だから
大した差は無い(元からvoid*な場合以外)
339デフォルトの名無しさん:2011/11/22(火) 21:41:44.47
size_tも処理系依存じゃん
同じ処理系依存でもvoid*の方がフォーマットはともかくアドレス
表記で有ることが保証されてる情報落ちが無い分マシといってるだけ
まぁ、>>323 にsize_tにキャストはやめなといってる理由だから
詳しい子は好きにしたらいい
340デフォルトの名無しさん:2011/11/22(火) 21:45:20.32
整数型にしたいならintptr_tかuintptr_tにキャストするべきだけど
この2つはoptionalなので存在しない処理系もある
というかそもそもポインタを整数型にキャストできる保証もない
341デフォルトの名無しさん:2011/11/22(火) 21:50:13.79
処理系依存というか、例えばgccで先頭に0xが付くとか不快なんだよね
intptr_tやuintptr_tがあるならそれを使いたいけど今のところある環境ばかりじゃないしな・・・
342デフォルトの名無しさん:2011/11/22(火) 22:03:14.76
ptrdiff_t使えよド素人共が
343デフォルトの名無しさん:2011/11/22(火) 22:07:22.77
>>341
そこまで拘るんならカスタムマニュピレーターでも作ったほうが早くね
344デフォルトの名無しさん:2011/11/22(火) 22:09:08.61
>>342
符号付きの時点でイヤ
345デフォルトの名無しさん:2011/11/22(火) 22:10:08.08
>>344
頭だいじょうぶ?
346デフォルトの名無しさん:2011/11/22(火) 22:15:23.90
ptrdiff_tじゃsize_tと大差ないだろ
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より小さくてもおかしくない
349デフォルトの名無しさん:2011/11/22(火) 23:24:44.77
じゃあ何を使うんだよ
350デフォルトの名無しさん:2011/11/22(火) 23:42:04.60
今日のアンチ size_t スレ
351デフォルトの名無しさん:2011/11/23(水) 01:18:52.49
切り抜くアホ
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とかかなり無意味だよな
354デフォルトの名無しさん:2011/11/23(水) 08:28:02.14
お前らアホばっかやな。仕様なんかどうでもいいんだよ、C++なんだからさ
仕様調べてる暇があったらパパッとメタプログラミングで最適なサイズを求めればいいだろう
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ではメリット無くないか
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でも入れときゃいい
359デフォルトの名無しさん:2011/11/23(水) 14:04:51.66
>>340
std::uintmax_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がその符号なし整数型の最大値であるとは限らない
364デフォルトの名無しさん:2011/11/23(水) 14:57:53.26
why?
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しか使わなくても別に規格上問題は無い
367デフォルトの名無しさん:2011/11/23(水) 15:40:53.37
~0uなら最大値だろうけど~0は符号付きの値だから
符号無しに変換してどうこうは保証されないってことか
368デフォルトの名無しさん:2011/11/23(水) 16:04:39.71
>>366
それを環境依存せずに取得できると思う方がおかしいぜ。
ちなみにWindowsはエディションによって搭載できるメモリが異なるが、
実行環境に合わせた表示までしたいの?
369デフォルトの名無しさん:2011/11/23(水) 16:26:14.78
マニュアルで調べてtypedefが無難ですね
370デフォルトの名無しさん:2011/11/23(水) 16:39:08.20
intptr_tが無いコンパイラってどれよ
371デフォルトの名無しさん:2011/11/23(水) 19:02:51.63
>>352
Nintendo 64とか、AMD64以前のコンパイラだとぼちぼち見る
372デフォルトの名無しさん:2011/11/23(水) 19:30:27.70
そもそもアドレス値の最大知りたいって、どんな状況で必要なんだ?
373デフォルトの名無しさん:2011/11/23(水) 19:42:52.46
std::cout << "Address:" << static_cast<void*>(&argc) << std::endl;

> Address:0x7fff61bf930c

64びっとぺーせーだとスタックが真ん中あたりから始まるからねぇ。
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 ってアドレス空間をカバーできる型なんだとばかり思ってたよ
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」に書けばいいですか?
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という事ね
382デフォルトの名無しさん:2011/11/23(水) 22:13:46.93
>>376
いちおうptr_diff_t ってのはあるんだけどね
383デフォルトの名無しさん:2011/11/23(水) 22:13:58.76
>>378
stdafx.h に書いておくとなんだかの理由で(プリコンパイルヘッダ関連だったかな)
処理が速くなりますよみたいな事がどっかに書いてあった気がするけど
よほど遅いマシン/巨大プロジェクトを扱ってるのでない限りそのヘッダを必要するソース
に書いて良いですね.経験上.
384デフォルトの名無しさん:2011/11/23(水) 22:17:24.53
>>383
処理が早くなるって、通常実行時って言うよりはコンパイル速度が早くなる可能性があるだけでは?
385デフォルトの名無しさん:2011/11/23(水) 22:18:13.48
よくインクルードする奴はstdafx.hに書いておくと
何度も書かなくて便利というのもあるので
一概に速度だけの問題でもない
386デフォルトの名無しさん:2011/11/23(水) 22:18:47.71
この文脈では処理=コンパイルでしょ
387デフォルトの名無しさん:2011/11/23(水) 22:25:45.11
>>378
mapを使うクラスのヘッダーファイルでinclude すればいい
ライブラリ等の変更する頻度が低くて良く使うヘッダーファイルをstdafxに追加するとコンパイルが劇的に速くなる
なお、両方に書いても問題ないよ
388デフォルトの名無しさん:2011/11/23(水) 22:28:33.80
>>386
はいそのつもりでしたが誤解を招く表現でしたね
389デフォルトの名無しさん:2011/11/23(水) 22:37:34.60
gccのプリコンパイルドヘッダークソおせぇ。
通常コンパイルで1分掛かるヘッダーをプリコンパイルにしてもやっぱり1分掛かる。
やっぱテンプレートだとプリコンパイルは無意味なんかね。
390デフォルトの名無しさん:2011/11/23(水) 22:41:59.44
むしろ一番効果が出そうなんだけど
391デフォルトの名無しさん:2011/11/23(水) 22:42:22.61
むしろ一番効果が出そうなんだけど
392デフォルトの名無しさん:2011/11/23(水) 22:46:47.94
標準ライブラリは基本的にstdafx.hに突っ込んでるな
変更なんてあり得ないし、なにかとどこかで使うことになるし
393デフォルトの名無しさん:2011/11/24(木) 00:06:25.43
毎回プリコンパイルして使い回してなかったら笑ってやる
394デフォルトの名無しさん:2011/11/24(木) 00:07:52.55
毎回プリコンパイルって何だ
プリコンパイルは1回だけだぞ
395デフォルトの名無しさん:2011/11/24(木) 00:13:09.55
読解力のないやつだな
396デフォルトの名無しさん:2011/11/24(木) 00:20:40.37
ソースコード修正しただけで1分掛かる。
ヘッダーは変更しとらんよ。
397デフォルトの名無しさん:2011/11/24(木) 01:31:58.19
お前ら短文すぎて脈絡掴めないぞ
398デフォルトの名無しさん:2011/11/24(木) 03:32:02.69
テンプレートって使用された分の関数をコンパイル前に自動で作ってくれるってだけなんですか?
399デフォルトの名無しさん:2011/11/24(木) 03:51:33.60
まぁだいたいそんなもん。
400デフォルトの名無しさん:2011/11/24(木) 03:52:59.36
>>398
関数だけじゃなくてクラスも対象だし、コンパイル「前」じゃないし、
「だけ」といってもその恩恵は計り知れないけどな。
401デフォルトの名無しさん:2011/11/24(木) 07:18:06.74
クラスであっても、使わないメンバ関数は生成しないね
402デフォルトの名無しさん:2011/11/25(金) 10:57:50.50
SFINAEの原則。コレのお陰でメタプログラミングができる。
403デフォルトの名無しさん:2011/11/25(金) 12:00:01.71
404デフォルトの名無しさん:2011/11/26(土) 10:43:17.92
継承できるけどインスタンスはひとつに限られるクラスってどうやって記述すればいいんでしょうか
シングルトンって継承できないですよね?
405デフォルトの名無しさん:2011/11/26(土) 10:47:29.60
>>404
使いどころはあるの?
406デフォルトの名無しさん:2011/11/26(土) 10:48:37.73
モノステートを継承
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を代入する。
408デフォルトの名無しさん:2011/11/26(土) 17:08:21.05
privateの意味ねぇぇぇ
409デフォルトの名無しさん:2011/11/26(土) 17:13:44.03
>>407
Y を int& じゃなくて、別のclassにすればできる。
でもねぇ、これは思想が違うとしか。
410デフォルトの名無しさん:2011/11/26(土) 17:31:54.47
その書き方に利点はなんだ
411デフォルトの名無しさん:2011/11/26(土) 17:32:13.73
typo
その書き方の利点はなんだ
412デフォルトの名無しさん:2011/11/26(土) 17:32:57.95
http://codepad.org/RjlPqJs6
別クラスってーとこんな感じか?
便利そうな、そうでもないような…
413デフォルトの名無しさん:2011/11/26(土) 17:33:39.45
>getXとかsetXとか書かなくてすむけど
これじゃないの?
マクロ書いた方がまだマシな気もする
414デフォルトの名無しさん:2011/11/26(土) 22:32:34.97
>>407
脇道だが、座標系を表すオブジェクトのXとYなんて書き換えられる必要ないだろ。
書き換え自体は、オブジェクトの内部で完結してりゃ十分じゃん。
それと、X、Yと定義しているパターンはよくあるけど、関数ポインターが無いと
XとYの入れ替え指示ができないので、OOとしてはあんまり良くない。
415デフォルトの名無しさん:2011/11/26(土) 22:36:59.77
数学ベクトルはメンバ丸出しが最善手って常識だろ
416デフォルトの名無しさん:2011/11/26(土) 22:40:17.29
VC++の$(OutDir)の値を変更するのはどこ?/OUTはどこでどう使うの?

どうせ、スレ違いというだろうけど
417デフォルトの名無しさん:2011/11/26(土) 22:44:41.37
>>415
今は、SSEやGPGPUもあるしそういう時代でもない。
418デフォルトの名無しさん:2011/11/26(土) 22:45:28.92
>>416
解ってんならVSのスレに行けよ
419デフォルトの名無しさん:2011/11/27(日) 00:41:12.91
>>415
uBLASとかBlitz++とかマジもんの数学ライブラリは添字アクセスなんけど
どこの常識なんだろうか・・・。
420デフォルトの名無しさん:2011/11/27(日) 00:57:57.68
uBLASとかは汎用的な処理かつでかい行列ではまあまあ有効なんだよ
でも3DCGとかじゃただの構造体がベスト
まとまった数学操作はすべて関数で用意して環境別に中身を切り替える
常識です
421デフォルトの名無しさん:2011/11/27(日) 01:02:44.67
クラスでも同じ事できるだろ
422デフォルトの名無しさん:2011/11/27(日) 01:03:29.80
そんなんDirect Xぐらいだろ
423デフォルトの名無しさん:2011/11/27(日) 01:05:04.86
>>419
その添字アクセスはサイズを動的にするための犠牲であって
添字アクセスが優れているから採用したわけではない
424デフォルトの名無しさん:2011/11/27(日) 01:08:22.38
>>422
少なくともJavaと.NETは構造体的になっているようだが
425デフォルトの名無しさん:2011/11/27(日) 01:08:52.87
構造体の相対参照も、添字参照も速度は変わらんしな、何が犠牲なんだろ?
426デフォルトの名無しさん:2011/11/27(日) 01:10:37.19
32bit時代だとthisはレジスタ渡しだから
構造体よりはクラスの方が良さそう
64bit時代だと普通の引数も4つまでレジスタ渡しだから
引数多い関数でもなければ差はないね
427デフォルトの名無しさん:2011/11/27(日) 01:10:51.69
>>425
本気で言ってるなら病院
428デフォルトの名無しさん:2011/11/27(日) 01:12:06.77
>>424
数学系に独立してるわけじゃなく
X11やWin API引きずってるもんな。仕方ない。
429デフォルトの名無しさん:2011/11/27(日) 01:13:17.57
>>427
x86系の命令と、インライン展開された状態知ってて言ってるの?
430デフォルトの名無しさん:2011/11/27(日) 01:13:22.01
>>425
見やすさとか書きやすさかなぁ?
431デフォルトの名無しさん:2011/11/27(日) 01:14:23.93
2次元なのに3次元目を指定するとかの間違いはトラップできるよね
それだけだど
432デフォルトの名無しさん:2011/11/27(日) 01:15:48.97
どっちがいいかは実測してから議論しなさいって学校で教わったよね
433デフォルトの名無しさん:2011/11/27(日) 01:19:28.79
2か3に次元固定ならXYZ使うのが自然だろうし
任意のN次元を扱うクラスなら添え字が自然だろう。
どちらか片方が常識と言われると、アホと言いたくなる

とりあえず>>429は病院池
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();
}

こういう委譲スタイルが使えない。
435デフォルトの名無しさん:2011/11/27(日) 01:26:43.53
>>433
お前話の脈絡がめちゃくちゃだぞ
>>425の話と全然繋がってないじゃん
436デフォルトの名無しさん:2011/11/27(日) 01:28:57.55
おまえら最初の質問に答えてないよね
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 };
444デフォルトの名無しさん:2011/11/27(日) 01:57:45.92
>>416
> VC++の$(OutDir)の値を変更するのはどこ?
使わなきゃいいだろ。
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));
でいいよ
へんなアダプタかませてカッコつける必要性皆無
447デフォルトの名無しさん:2011/11/27(日) 02:20:19.06
テンプレート活用できないからそれじゃ困る。
448デフォルトの名無しさん:2011/11/27(日) 12:42:56.84
iteratorじゃなくて参照にすればset/get経由しなくてもいいのにね
449デフォルトの名無しさん:2011/11/27(日) 12:48:30.77
普段はstd::pairとかtupleみたいに扱えて
速度が必要になったらちょっとPolicyを差し替えるだけでSIMD使うものにできるみたいな
450デフォルトの名無しさん:2011/11/27(日) 17:35:54.87
すみません
std::ifstream::getline があるのは知っているのですが
std::ifstream::get を使った場合したのプログラムが正常に動きません
(入力ファイルに空行があるとそこで無限ループになるっぽいです)

std::ifstream ifs;
ifs.open("main.cpp");
if(ifs){
std::streamsize sz = 64 + 1;
char buf[sz];
do{
ifs.get(buf, sz, '\n'); // read before delimiter '\n'
if(strlen(buf) < sz - 1) ifs.seekg(1, std::ios::cur); // skip delimiter
std::cout << buf << std::endl;
}while(!ifs.eof());
ifs.close();
}

どこがおかしいのでしょうか?
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;
452デフォルトの名無しさん:2011/11/27(日) 18:07:28.80
ああバグってるな

ifs.get(buf, sz, '\n'); // read before delimiter '\n'
if(!ifs)
 if(ifs.eof()) break;
 else ifs.clear();
else std::cout << buf;
if(strlen(buf) < sz - 1){
 ifs.seekg(1, std::ios::cur); // skip delimiter
 std::cout << std::endl;
}
453デフォルトの名無しさん:2011/11/27(日) 18:15:44.28
>>451 さん!
出来ました!!
ありがとうございます!!!
454デフォルトの名無しさん:2011/11/28(月) 04:45:39.90
なんでdowhileなんだ?
455デフォルトの名無しさん:2011/11/29(火) 21:54:49.93
if(x.isNantoka()) {
x.doKantoka();
}
的なコードを見やすくするために
x.isNantoka() && x.doKantoka();
って書くのっておかしいですか?
456デフォルトの名無しさん:2011/11/29(火) 22:03:13.87
いとをかし
457デフォルトの名無しさん:2011/11/29(火) 22:04:14.88
あまり行儀良くはないな
458デフォルトの名無しさん:2011/11/29(火) 22:23:46.58
そういうのはコードゴルフだけでやればいい
459デフォルトの名無しさん:2011/11/29(火) 22:25:29.03
自分だったら、
if (x.IsXxx() == true) x.DoXxx();

と、一行で書けるときはそうする。
460デフォルトの名無しさん:2011/11/29(火) 22:36:52.53
英語文法的には
if hoge and fuga or piyo.
hogeであるならばfugaでなければpiyoってなるからすごいわかりやすいんだけどね
461デフォルトの名無しさん:2011/11/29(火) 22:37:27.33
シェルで似た書き方をたまに見るよ。
たしか miracle linux のオラクル起動シェルがそれ多用してた...

古いPerlのソースではよく
処理() || die;
つーのがあって「処理をしろ、さもなくば死ね」
と読ませたかったポ。原理は同じだよな。

でも考えたら
if( ptr != NULL && ptr->isHoge() ) {
...
}
ていう、nullガードのパターンはよく見る。
程度問題っていうか、読む人への優しさの問題かな
462デフォルトの名無しさん:2011/11/29(火) 23:09:44.84
nullガードとは別の話だろー
Perlでは見ない事も無い書き方だけど
C/C++的には正直読み辛い
463デフォルトの名無しさん:2011/11/29(火) 23:22:59.65
Luaとかだとむしろ推奨されてるよね
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
そういやショートサーキット( &&, || ) による分岐は無しだわ。
オーバーロードに気づかなかったら、ショートサーキットが効かず事故る。
469デフォルトの名無しさん:2011/11/30(水) 00:04:57.08
>>455
なぜ見やすいコードを見にくいコードに置き換えようとしているのかが分からない
470デフォルトの名無しさん:2011/11/30(水) 00:05:42.47
オーバーロードはまあ罠だよね
でも&&や||のオーバーロードってそんなあるかな?
471デフォルトの名無しさん:2011/11/30(水) 00:07:02.58
break if (x.isNantoka());
と書きたくなることはある
472デフォルトの名無しさん:2011/11/30(水) 00:12:35.19
オーバーロードするとしたら、遅延評価か2論理値以外を使いたい時になんのかな。
473デフォルトの名無しさん:2011/11/30(水) 00:15:58.93
>>455
C++で&&とあったら評価の途中の副作用でなく結果のbool値のほうを注目するから一般的ではないだろうな
474デフォルトの名無しさん:2011/11/30(水) 01:48:20.04
どっちが先に評価されるかは決まってるんだっけ
475デフォルトの名無しさん:2011/11/30(水) 02:50:40.40
>>459 論理定数との等値比較を書いていいのは小学生まで。
476デフォルトの名無しさん:2011/11/30(水) 02:51:27.40
>>474
決まってるよ
477デフォルトの名無しさん:2011/11/30(水) 08:21:47.37
すみません
VB でいう MyBase、C# でいう base は C++ では何になるのでしょうか。

継承クラスの子メンバで、親のメンバを明示して実行させたいのですが。
this だと自分自身を指しますよね?
478デフォルトの名無しさん:2011/11/30(水) 08:27:43.85
親クラスの名前::呼び出したいメンバ
479デフォルトの名無しさん:2011/11/30(水) 08:53:46.38
>>477
多重継承できるC++では明示的に親を示すキーワードはない。
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
481デフォルトの名無しさん:2011/11/30(水) 11:10:02.02
ここまで俺の自演
482デフォルトの名無しさん:2011/11/30(水) 12:34:42.48
>>480
それって隠蔽されてる関数を無理矢理引っ張り出す書式だよな
親を指すポインタはdynamic_castを使って2個作るしかない事には変わりがない
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
484デフォルトの名無しさん:2011/11/30(水) 19:35:05.37
>>477
>>478のやりかたで正しい。
485デフォルトの名無しさん:2011/11/30(水) 19:36:26.08
>>482
別に無理矢理じゃないだろ。
多重継承で衝突した時の基本的な対処法じゃん。
486デフォルトの名無しさん:2011/11/30(水) 19:37:06.33
>>482
static_castで十分ですけど
487デフォルトの名無しさん:2011/11/30(水) 19:38:13.33
>>483
オーバーライドする気がないならstatic_castの方がマシ。
488デフォルトの名無しさん:2011/11/30(水) 19:42:09.00
baseと書きたいならtypedefすればいい
489デフォルトの名無しさん:2011/11/30(水) 20:14:24.23
>>487
オーバーライドしててもstatic_castっていうか暗黙のダウンキャストで十分ですけど
490デフォルトの名無しさん:2011/11/30(水) 20:18:53.94
アップキャストだろ
ダウンキャストを暗黙でやられたら大変なことに
491デフォルトの名無しさん:2011/11/30(水) 20:23:32.23
>>489
base1やbase2が別のクラスのオブジェクトを返す場合は困るってこと。
492デフォルトの名無しさん:2011/11/30(水) 20:30:46.87
結論:無意味に他言語の真似をするのはアホ
493デフォルトの名無しさん:2011/11/30(水) 21:26:10.52
>>483
済みません

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

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

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

今までローカル変数に代入してから返していました
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
それは無意識のうちにやっていました
良く考えるとそれも変換コンストラクタなんですね
500デフォルトの名無しさん:2011/12/01(木) 00:14:45.78
>>477
MSに依存したものであれば、__superというキーワードが使える。
http://msdn.microsoft.com/ja-jp/library/94dw1w7x.aspx
501デフォルトの名無しさん:2011/12/01(木) 00:24:46.14
コミュ障かよ。仮にも第三次産業で飯食ってんだから
質問者が何を要求してるか考えろよ。

>継承クラスの子メンバで、親のメンバを明示して実行させたいのですが。
502デフォルトの名無しさん:2011/12/01(木) 00:38:00.12
>>501
質問の日本語がまずおかしい
503デフォルトの名無しさん:2011/12/01(木) 00:53:59.62
客が中途半端な受け答えしたら、客を責めるのかよ。
504デフォルトの名無しさん:2011/12/01(木) 07:09:58.34
金よこせばまともに回答するぜ
505デフォルトの名無しさん:2011/12/01(木) 08:06:33.61
Qみたいな事言ってんなよ
カネカネキンコはプログラム板から出てけよ
506デフォルトの名無しさん:2011/12/01(木) 11:07:43.55
ここまでおれのじえん
507 ◆QZaw55cn4c :2011/12/02(金) 03:50:03.42
>>505
Qって何です?
508デフォルトの名無しさん:2011/12/02(金) 08:23:53.23
Qでカネカネと言ったらQbert
509デフォルトの名無しさん:2011/12/03(土) 16:03:49.21
僕と契約して(徹夜で)プログラムを作ってよ!
510 ◆QZaw55cn4c :2011/12/03(土) 16:06:58.67
511デフォルトの名無しさん:2011/12/03(土) 16:09:04.30
Qの話の流れなのに・・・
512デフォルトの名無しさん:2011/12/05(月) 17:35:13.81
初期化の話だけど、組み込み型も括弧を使った形式の方がいいの?

int a = 100;

int a(100);

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

>>514
そんなことより静的イニシャライザが欲しい
517デフォルトの名無しさん:2011/12/05(月) 19:18:22.42
欲しがるな
自分で作れ
518デフォルトの名無しさん:2011/12/05(月) 19:27:41.44
class Hoge {
class Initializer {
static int count; // 0初期化すること
public:
Initializer(void) { if(count == 0) Hoge::Initialize(); ++count; }
~Initializer(void) { --count; if(count == 0) Hoge::Finalize(); }
};
static void Initialize(void);
static void Finalize(void);
Initializer initializer_;
public:
// ...
};

これでおk
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
これは酷い
521デフォルトの名無しさん:2011/12/05(月) 20:05:17.60
struct hoge{
constexpr A() : m() { }
int m;
};
constexpr int v
522デフォルトの名無しさん:2011/12/05(月) 20:09:49.41
CRTPにするとき仮想関数使ったらあんま意味ないのはわかるけど
ほかになんか気をつけなきゃいけないことってある?
523デフォルトの名無しさん:2011/12/05(月) 20:13:05.23
public継承で事故を起こすことかな
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型の不定値が返される
526デフォルトの名無しさん:2011/12/05(月) 21:12:53.51
33点
527デフォルトの名無しさん:2011/12/05(月) 21:14:28.89
デフォこん
何も返らない
0
528デフォルトの名無しさん:2011/12/05(月) 21:41:59.67
全部デフォコン
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); // 初期化したいんだ
}
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でも初期化できる
532デフォルトの名無しさん:2011/12/06(火) 00:58:07.04
std::string s = "これを代入だと思ってたから括弧でやりたがってたの?";
533デフォルトの名無しさん:2011/12/06(火) 01:52:16.33
>>530
int n = int();
関数型キャストと言ったのはこっちの事。
言うには言ったけど間違ってたと思う。
int n = int( 100 );ってのは関数型キャストで間違いない。
int()だと多分デフォコンが正しいんだろう。
534デフォルトの名無しさん:2011/12/06(火) 07:17:27.76
>>531
等価じゃないよ
T a = 100; は T(int) が public でも
コピーコンストラクタが private なら外では使えない
(たとえコピーコンストラクタの実行が最適化で省略されるとしても)
535デフォルトの名無しさん:2011/12/06(火) 09:15:32.61
左様
536デフォルトの名無しさん:2011/12/06(火) 11:48:08.93
T a = 100;
T b(T(100));
これなら等価かな?関数宣言と見なされてエラーになっちゃう?
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
538デフォルトの名無しさん:2011/12/06(火) 19:31:00.93
コピーコンストラクタをprivateにする事は往々にしてあるので(C++11だと=deleteか)
意外と等価なケースばかりではないのよね
539デフォルトの名無しさん:2011/12/06(火) 19:36:09.47
0xだと
hoge h = {1, 2, 3};
とか
hoge h({5}), g{6};
みたいに書けるんだっけ
なんか気味悪い
540デフォルトの名無しさん:2011/12/06(火) 20:49:33.23
stdintがまだない環境で
指定のビット幅を持つ整数型を得るにはどうすればいいですか?
541デフォルトの名無しさん:2011/12/06(火) 20:58:29.71
自分で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
自分は多倍長整数試作したときにあるといいなーと思った。論理演算を実装したかったからね。
まーポシャったけど。
545デフォルトの名無しさん:2011/12/06(火) 21:32:15.27
ビット演算したいだけならstdintよりbitsetのほうが良いのかな
速さは殆ど変わらないよね?
546デフォルトの名無しさん:2011/12/06(火) 21:33:32.96
TR2への提案はされていたはず
547デフォルトの名無しさん:2011/12/06(火) 21:45:06.52
>>544
作ったけど別に必要なかったような
除算だけが難しかった
548デフォルトの名無しさん:2011/12/06(火) 21:48:33.76
>>547
その時は基数がなにかとか殆どわからなくて言語に依存してたからビット演算を自前で実装出来なかったんだ・・・。Orz
549デフォルトの名無しさん:2011/12/07(水) 16:38:05.24
メンバ関数のconstって論理的にオブジェクトの内容が変化しないときに付けるのか
メモリの書き換えが起こらないときに付けるのかどっちが一般的なんですか?
pImplイディオムを使うときや関数オブジェクトを作る時などにすごく悩みます
550デフォルトの名無しさん:2011/12/07(水) 16:49:16.89
>>549
メンバ変数の書き換えが起きない時
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は外れる
553デフォルトの名無しさん:2011/12/07(水) 19:35:21.06
@ char * hage1;
 このポインタが指している変数の変更: 可能
 このポインタの変更: 可能

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

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

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

ついでに質問だけど、ある変数を途中からconst扱いにってできる?
555デフォルトの名無しさん:2011/12/07(水) 20:34:49.43
>>551
仕様を知りたいわけじゃないなら、
コンパイルしてみたらええがな。
今時、その辺が仕様からズレてる
コンパイラも無いぞ。
556デフォルトの名無しさん:2011/12/07(水) 21:39:53.83
>>549
結果をキャッシュして、キャッシュがあればそれを返す、というような場合は、
キャッシュ変数を mutable にして、メンバ関数を 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;
}
560デフォルトの名無しさん:2011/12/07(水) 22:53:42.48
tryGetの類いは例外を避ける為に作られる関数なんだから
例外使えば良いよってのはない
561デフォルトの名無しさん:2011/12/07(水) 23:02:58.42
うるせーじゃあoptionalでも使ってろ
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〜で取りこぼした分は例外にしなきゃならん。無駄。
565デフォルトの名無しさん:2011/12/07(水) 23:43:02.55
突然どうした
566デフォルトの名無しさん:2011/12/08(木) 10:15:05.17
他の言語は知らんけどCプラプラでメソッドってあまり存在価値無くないですか?
例えばbeginメソッドとか書いても結局使うのはブーストのbegin関数(かそれを真似した関数)を通して使いますよね
テンプレートを使うと特に顕著です
テンプレート型のオブジェクトのメソッドをコールするときは必ずメソッドをコールするだけの関数を通して呼びます
利用者側がカスタマイズする時に助かるからです
でもこんなことなら最初から関数にすればいいのではないでしょうか?
567デフォルトの名無しさん:2011/12/08(木) 10:44:26.99
beginだけ例に挙げていらんと言われても俺はないと困る
568デフォルトの名無しさん:2011/12/08(木) 10:48:33.43
困らない人なんていないでしょ
569デフォルトの名無しさん:2011/12/08(木) 12:49:44.32
>>566
仮想関数どうすんの?
570デフォルトの名無しさん:2011/12/08(木) 13:01:14.63
>>566
>例えばbeginメソッドとか書いても結局使うのはブーストのbegin関数(かそれを真似した関数)を通して使いますよね
>テンプレートを使うと特に顕著です
>テンプレート型のオブジェクトのメソッドをコールするときは必ずメソッドをコールするだけの関数を通して呼びます
boostのbeginは配列とコンテナに同じインターフェースを設けるためだよ
意味不明な理由でインターフェース増やしまくる馬鹿はおまえだけ
571デフォルトの名無しさん:2011/12/08(木) 13:04:58.90
>>588
>>559-564といった感じで上手い方法は無い

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

まぁ、throwされた時のコストを気にすべき環境では例外は使わないかな
572デフォルトの名無しさん:2011/12/08(木) 13:37:08.33
ループするなら関数呼び出しも例外もコストなんか気にしないのが普通
573デフォルトの名無しさん:2011/12/08(木) 23:45:25.75
>>566
>でもこんなことなら最初から関数にすればいいのではないでしょうか?
すればいいんじゃね。
仮想関数との透過的扱いが不要だと思うんなら、全てfriendにするなり好きにしたらいいんじゃね。
いつの日か多重メソッドに対応するものができたら得するかもしれん。

 どうでもいいが、C++は、Smalltalkの様にメッセージとメソッドが別れてないから、
メンバー関数のことをメソッドとは言わん。Javaみたいな恥ずかしいことを書くな。
574デフォルトの名無しさん:2011/12/08(木) 23:49:36.31
くだらない言葉遊びですね
オモシロクナイですよ、それ
575デフォルトの名無しさん:2011/12/08(木) 23:52:13.21
Simulaを侮蔑するのはやめろ!!!
576デフォルトの名無しさん:2011/12/08(木) 23:58:21.17
用語もまともに使い分けられんクズはJavaなりC#なりRubyなり巣にカエレ
577デフォルトの名無しさん:2011/12/08(木) 23:58:52.51
言葉遊びが面白くないのなら最初から正確な表現を心掛けるんだな
578デフォルトの名無しさん:2011/12/09(金) 00:02:23.76
>>575
SimulaはProcedureじゃん
579デフォルトの名無しさん:2011/12/09(金) 00:19:12.79
>>573
>メンバー関数のことをメソッドとは言わん。Javaみたいな恥ずかしいことを書くな。

しらんがな、MS に言ってくれよ。
http://msdn.microsoft.com/ja-jp/library/bb3b0dfs.aspx
580デフォルトの名無しさん:2011/12/09(金) 00:19:58.76
>>574
言葉以前に構造が全然違う。
メンバー関数は、関数と関数ポインターでしか無いが、
メッセージ&メソッドは、メッセージをキーに対応するメソッドを探し出す。
さらには、転送やら、未対応メッセージに対しデフォルトメソッド起動やら
高機能かつ重い。
581デフォルトの名無しさん:2011/12/09(金) 00:22:53.14
>>579 自己解釈だらけのMSなんか相手にすんなよ。
コンパイラからファイルフォーマットから余計な拡張ばっかしやがる
企業なんて追いかけても無駄。数年後にはまた用語が変わる。
582デフォルトの名無しさん:2011/12/09(金) 00:40:21.29
概念としてはほぼ同じと見れるし、
構造をはっきりと意識して使い分けるならば違うとも見れるわけだし、
目くじらたてる必要はないよな
583デフォルトの名無しさん:2011/12/09(金) 02:25:01.38
>>581
むしろMFCは変わってないからメソッドのままなんだよ。数年どころか20年間メソッドのままだよ
標準化されたところは標準の用語になってる
584デフォルトの名無しさん:2011/12/09(金) 03:16:26.48
「他の言語の言葉をここで使う必要は無い」
「とりあえず通じてるからいい」
系のレスを途中まで書いては見たものの、かなり低レベルなことに気付いて全部消した
おなかすいた
585デフォルトの名無しさん:2011/12/09(金) 07:35:34.29
>>583

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

用語なんてどうでもいいじゃんってのは、
「見た目が同じだから、クラスを全部構造体って言えばいいじゃん」
と言われるのと同じ感覚なんだが、言い訳しかしないしどうでもいいや、好きにすりゃいい。
586デフォルトの名無しさん:2011/12/09(金) 08:50:04.91
クラスと構造体はどこが違うの?
あおりじゃなくまじで教えて?
587デフォルトの名無しさん:2011/12/09(金) 08:59:07.19
>>580
ちげーよバカ
メソッドはオブジェクトのもつ手続きという以上の意味はない
C++のメンバ関数もメソッドで正解なんだよ
お前の言ってるメソッドはメソッドの実装の一つでしかないといことに気がつけモンキー
588デフォルトの名無しさん:2011/12/09(金) 09:31:55.67
class A{
private:

struct A{
public:

それぞれ、ブロックの最初にprivateとpublicが暗黙に書かれてると思えばおk
589デフォルトの名無しさん:2011/12/09(金) 09:34:06.75
>>586
まず、その「クラス」と「構造体」の定義をした方がいいと思うよ。
C++ の class と struct の話なのか、一般的なクラスと構造体の概念の話なのかで
答えが変わってくるから。
590デフォルトの名無しさん:2011/12/09(金) 09:36:03.13
構造体はクラスの一種
591デフォルトの名無しさん:2011/12/09(金) 11:28:12.70
>>586
知ってるくせに()
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++において、実装を含むクラスをインターフェイスと呼べるのでしょうか。
またインターフェイスという仕様に沿うために、実装を完全に派生クラスに移譲する設計をしているのか、
基底クラスに実装を含めたほうがいいと考えられるようなものでも、あえてそうしない理由があるのか、教えてください。
593デフォルトの名無しさん:2011/12/09(金) 12:31:56.10
class ItemBase {
public:
virtual ~ItemBase(void) {}
ID GetID(void) const { return m_id; }
protected:
void SetID(ID id) { m_id = id; }
private:
ID m_id;
};

俺はこうしちゃうな
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 {

595デフォルトの名無しさん:2011/12/09(金) 12:55:15.22
ID GetID(void) const { bf_.GetID(); }
private:
BasicFunctions bf_;
};

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

そりゃ、日本のゲームが海外のゲームみたいな
綺麗な画面、華麗な動き、活き活きとしたキャラクターを描けないわけだ。
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; }

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

 shared_ptr<HogeItem> pItem;
};

shared_ptrを戻り値としたばあい共変性が保てないんだな
@が無理だと知ったんだけど、Aの方法を取るしかないの?
あと、AのGetX(仮)関数の名前はどんなのがいいだろう?
598デフォルトの名無しさん:2011/12/09(金) 17:57:37.03
>>597
GetXはvirtualにする意味ないだろ
599デフォルトの名無しさん:2011/12/09(金) 18:33:02.52
インターフェースクラスをテンプレートクラスとして定義して
型を指定して継承って可能?
600デフォルトの名無しさん:2011/12/09(金) 18:51:46.28
可能
601デフォルトの名無しさん:2011/12/09(金) 19:30:27.36
抱きましたサンクス
602592:2011/12/09(金) 20:35:55.80
ありがとうございます。参考になりました。
603デフォルトの名無しさん:2011/12/09(金) 22:19:47.75
>>587
適当なことを言うな。ProcedureでしかなかったSimulaのVirtual Procedureに対し、
Message送信と処理が分離しており区別する必要があったSmalltalkが導入した語句だ。
Smalltalk, Objects, and Designでも買って読んでみろ。
604デフォルトの名無しさん:2011/12/09(金) 22:22:27.05
>>596
んな事をするバカは日本にも稀だ。
ループのコストについても履き違えてる。
605デフォルトの名無しさん:2011/12/09(金) 22:24:47.20
>>603
お前が馬鹿だろこのアンポンタン
言葉ってのは時代の流れに乗って変化していくものなんだよ
現代でメソッドっていったらオブジェクトの手続き部分以上の意味はない
606デフォルトの名無しさん:2011/12/09(金) 22:30:24.62
>>592
メンバーの実装強要は置いといて、
データメンバーの無い、仮想関数を持ったクラスは親に持っておくべき。
2個めの実装を持ったクラスをつくってもいいが、そのクラスは親に、
データメンバーの無いクラスを持っておいておいたほうがよい。

君のIItemを継承したクラスがidを必ずしも必要とするとは限らないからね。
IItemの子クラスが、メンバー変数に、IDを取得できるオブジェクトをもっていて、
IDをGetIDから返す際は、そのオブジェクトに問い合わせるって実装を作ったら、
IItemのidは死荷重になる。IDがポインタで表現されてるとかだと、大した量でも無いが、
GUIDみたいな物だと、IItemを配列に突っ込んだ時、死荷重の割合が増大する。
607デフォルトの名無しさん:2011/12/09(金) 22:34:01.41
>>605
お前はJavaでもRubyでもつかってろって
Smalltalkと対立関係があり、逆にObjective-C++として
近親関係でもあるC++だとMethodはSmalltalkと
Objective-CのMethodを指すんだよ。
608デフォルトの名無しさん:2011/12/10(土) 00:15:43.03
まぁあれだ。メンバ関数をメソッドと呼んだり、基底クラスをスーパークラスとか呼んだりする人は
Javaから流れてきた連中でたいていはとんでもないプログラムを書いてプロジェクトを荒らす^^
JavaとC++がまったく別物だということに無頓着なことが多い。弱る。
609デフォルトの名無しさん:2011/12/10(土) 00:23:12.66
>>596
活き活きを履き違えてるな。活き活きさせるにはループ内で迅速に関連変数を書き換えないといけない。で、描画する。
その根本の動作はモーションキャプチャで撮ってきてたりするが、
結局どのタイミングで関連変数を書き換えて反映するかの一点しかない。

動きというものがループで生成される画像の連続なんだぞ?
610デフォルトの名無しさん:2011/12/10(土) 09:08:34.50
既にメソッドと呼ばない言語の方がマイナーだ
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を正しく表示させるにはどうしたらいいのでしょうか。
ソースと出力結果は次に書きます。
616615:2011/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;
}
617615:2011/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なんだから
ローカル変数が破壊された後は、その中身がどうなってるかなんて
神の味噌汁だよ。
619デフォルトの名無しさん:2011/12/10(土) 16:02:42.28
ローカル変数のアドレスを返してるんだからおかしくなるに決まってる
620デフォルトの名無しさん:2011/12/10(土) 16:12:11.34
アセンブラやるといいよ
621デフォルトの名無しさん:2011/12/10(土) 16:17:04.05
int * func() {
 int a = 100;
 return &a;
} // この地点で変数 a は破棄される

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

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

http://ideone.com/Z8vSR


と投稿しようとしたら、ideoneがエラー表示してくれてるのに気付いて(iが未初期化だった)ひとまず再帰での表示は解決しました。
なので、むしろ他の手法についてうかがいたいです。
624615:2011/12/10(土) 16:29:54.23
>>618-621
ありがとうございます!
なるほど。破棄されるんですね。警告はでませんでした・・・

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


本題とは関係ないのですが、
なぜbool*を全部int*に置き換えてやった場合はmain内でもうまくいったのでしょうか?
たまたまですかねw
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;

}
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
すまないありがとう

あと
聞きたいんですけど
イラスト用のソフトとかってどうやって作ってるんですか
これも
それを学べばできるようになりますか
634デフォルトの名無しさん:2011/12/10(土) 19:37:40.41
画像を扱うという点では共通した部分も少なくないと言えなくもない
635デフォルトの名無しさん:2011/12/10(土) 19:42:10.34
個人的には、ロボットとかの動くものの方が面白いと思う。

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

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

おすすめのサイトや本などを教えてくれると嬉しいです
638デフォルトの名無しさん:2011/12/10(土) 20:15:37.29
ペイントレベルなら習作で作れると思う
GUIの入門書でも大体あると思う(全部にあるとは言わんが)
639デフォルトの名無しさん:2011/12/10(土) 20:15:52.97
とりあえずググれ
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ってググッたら一番上が英語で全くわからなかったです(-_-;)
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
たのんだ
651デフォルトの名無しさん:2011/12/10(土) 22:14:03.63
ドザはお帰り下さい
652デフォルトの名無しさん:2011/12/10(土) 22:19:37.93
XならXGL、ツールキットがあるならそれのバインドインターフェース。
MacならCocoaでバインド。委細は違えど、どの環境でも要るだろ。
653デフォルトの名無しさん:2011/12/11(日) 06:07:02.85
>>625
おお……<<をオーバーロード!
シンプルで良いですね。ありがとうございます。
int以外を突っ込んだときの問題も解決されていてありがたい限りです。
654デフォルトの名無しさん:2011/12/11(日) 11:16:08.04
>>649
OpenGLはWindows以外で使われる事が多いし〜
WindowsならDirectX使う方が楽だし〜
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();
}

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

実験してみたらどうよ
661デフォルトの名無しさん:2011/12/11(日) 18:48:08.78
クラスの設計について質問したいんだが、
AってクラスとBってクラスがあります。
それぞれ、privateメンバとして、xとy座標を持っています。

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

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

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

他にもいい方法があれば書いてくれると嬉しいです
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クラスのオブジェクトを持たせ、
そいつから関数呼び出して取得するしかないですよね。

何かお互いに独立したクラスなのに、お互いをメンバに持つのがなんか気持ち悪いんですよね。
666デフォルトの名無しさん:2011/12/11(日) 19:19:34.36
ついでにもう一つアドバイス下さい。
このAとBの当たり判定をする場合は、
第三のクラス内で当たり判定すべきか、それともA/Bどちらかのクラス内でするべきかどっちがいいと思いますか?
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として展開されている
668デフォルトの名無しさん:2011/12/11(日) 19:35:40.67
別のクラスを作って座標を渡して結果を得るべき
669デフォルトの名無しさん:2011/12/11(日) 19:36:31.84
まったく抽象的でわからん話だが、
仮にクラスAをインベーダー、クラスBを砲台としよう^^

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

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

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

ぬんぱら。
670デフォルトの名無しさん:2011/12/11(日) 19:39:06.84
>>669
衝突判定は、弾にやらせた方がいいんじゃね?
671デフォルトの名無しさん:2011/12/11(日) 19:49:01.04
>>666
AとBの親クラスで当たり判定X::Conflict( a, b );
672デフォルトの名無しさん:2011/12/11(日) 19:50:47.53
衝突判定ライブラリとかだと
@ broad-phase で交差する可能性のあるペアを集めて、
A narrow-phase で物体同士の交差判定を行う

つまり、衝突判定は第3者が行う
673デフォルトの名無しさん:2011/12/11(日) 19:51:45.19
>>669
なるほど
すごい参考になりました。ありがとうございます。

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

ん〜もうちょっと考えてみます。
674デフォルトの名無しさん:2011/12/11(日) 19:55:37.52
>>671-672
なるほどー
やっぱり当たり判定は親クラスの方が良さそうですね。

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

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

皆さんありがとうございました!
675デフォルトの名無しさん:2011/12/11(日) 20:09:54.29
>>667
いいから>>660実験してみたらどうよ
676デフォルトの名無しさん:2011/12/11(日) 21:00:14.35
>>675
e?実験する内容が分からないぞ。具体的な実験内容を教えてくれ
最適化した後はoperator->(のオーバーロード)のcallは見つからないのは確かだが
677デフォルトの名無しさん:2011/12/11(日) 21:19:22.96
>>674
当たり判定して何したいの?
衝突したいだけなら、判定単品はいらないと思うけど。

double 弾.衝突( 障壁[i] );
double 衝突( 障害物 &障害物 )
{
      // 判定から、衝突の振る舞いまで、障害物にまかせる。
      ベクター += 障害物.破壊衝突( 衝撃量 , this->座標 );
      return ベクター.ノルム();
}
678デフォルトの名無しさん:2011/12/11(日) 21:20:24.59
>>670
シューティングゲームだったら弾じゃなくて機体のほうがいいと思う
空間登録と1つに対する判定のコストは平均して定数とすると弾と機体の数がそのまま計算コストのオーダーになる
ふつうは弾のほうが多いから弾で判定するのは良くないだろう(まあ弾同士がぶつかるとかだとどっちみち必要だけど)
679デフォルトの名無しさん:2011/12/11(日) 21:20:35.86
>>676
それはインライン化された事を確認しただけ
インライン化されたものとは別に、
インライン化されていない関数の実体が存在するかチェックすべし
680デフォルトの名無しさん:2011/12/11(日) 21:22:36.87
手で書ける程度の有限個の定数だったら
switchをifで書いてもぜんぜん差はないよね?
681デフォルトの名無しさん:2011/12/11(日) 21:25:08.33
>>678
マジレスしてくれてありがとう。
でも、今の話には弾は関係なかったりするんだな。

インベーダーと砲台の関係なので。
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でかける個数に限界があるから気を付けたほうがいい
685デフォルトの名無しさん:2011/12/11(日) 22:07:28.51
if-elseも限界あるぞw
686デフォルトの名無しさん:2011/12/11(日) 22:13:28.23
>>684
マジで。switchなんか殆ど使わんから初めて知った。
256個ぐらいか?
687デフォルトの名無しさん:2011/12/11(日) 22:29:49.11
視認性的な意味のような気がする。あれは基本、スコープ付きgotoだし。
688デフォルトの名無しさん:2011/12/11(日) 22:32:01.11
関数ポインタの配列
689デフォルトの名無しさん:2011/12/11(日) 22:57:00.28
別にgotoじゃねぇよ。
処理スタックを下降はできても遡れるようには出来てない。
処理スタックを破壊するgoto化しないように制限は掛けてある。
690デフォルトの名無しさん:2011/12/11(日) 23:52:00.86
switchのcase文ごとにスコープにならないのが不快
691デフォルトの名無しさん:2011/12/12(月) 00:42:23.56
boolをcharにキャストしようとしてもできないんだけどこれは仕様?
692デフォルトの名無しさん:2011/12/12(月) 00:48:51.78
ttp://codepad.org/pV1Q5ql5
エラーメッセージは?
693691:2011/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型にしないといけないんです。おうふ。
698デフォルトの名無しさん:2011/12/12(月) 01:12:43.99
ttp://codepad.org/e0LnV7ry
sprintfは覚えといたほうがいい
699デフォルトの名無しさん:2011/12/12(月) 01:34:48.05
>>697
これで変換できるハズだが。
char ToChar(bool n)
{
    return '0' + n;
}
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がイったってのはわかるのですが、それがどういう原因によるものなのかがわからなかったので知恵を貸して下さい。
(何度もすみません)
701デフォルトの名無しさん:2011/12/12(月) 01:49:09.53
関数の前方宣言はこうじゃないか?
size_t sprintf_s(char[], size_t, const char[], ...);
どう頭で解釈してんだ?

const size_t length = 100;
char buffer[length];
bool value = false;

sprintf_s(buffer, length, "%d", value);
単に型合わせればこんな感じだろ。
702デフォルトの名無しさん:2011/12/12(月) 02:18:35.33
>>701
レスありがとう

boolの配列をcharに組み込みたく、
最初はfor内で

sprintf_s(c[i],1,"%d",b[i])でやってたのですが、

c[i]に下線でエラー(sprintf_sの引数リストと一致しません)ってでたので、
&にしたら直ったのでそのままやってました・・

boolの配列をcharに処理したいです。
703デフォルトの名無しさん:2011/12/12(月) 07:35:01.96
>>699 で1個1個変換して
最後にヌル文字つけれ

あと文字コードについて勉強すれ
704デフォルトの名無しさん:2011/12/12(月) 08:07:41.76
コンストラクタって、
static CLASSA a;

ってやっても実行されない?
つまりシングルトンにしたクラスって、
コンストラクタ実行できないの?
705デフォルトの名無しさん:2011/12/12(月) 08:21:07.32
そんなわけねーだろ
706デフォルトの名無しさん:2011/12/12(月) 08:21:59.24
最初に使われる前にコンストラクタが一回だけ呼ばれる
707デフォルトの名無しさん:2011/12/12(月) 08:22:23.27
>>704
静的メンバ変数 初期化
でぐぐれ
708デフォルトの名無しさん:2011/12/12(月) 08:53:27.22
>>705-707
ありゃと
709デフォルトの名無しさん:2011/12/12(月) 10:30:40.13
char *data = 'xxxxx';

char *hage()  {
  return data;
}

void main()  {
  char *r = hage();
  printf(r);
}

こんな風でポインタを戻す関数を利用できると思いますけど、ポイントを引数で戻してもらうことできないでしょうか。

char *data = 'xxxxx';

void hage(char *result)  {
  result = data;
}

void main()  {
  char *r;
  hage(r);
  printf(r);
}

という風で出来かなと思いましたが、うまくいきません。
710デフォルトの名無しさん:2011/12/12(月) 10:47:14.61
'
"
711デフォルトの名無しさん:2011/12/12(月) 11:38:26.49
char *data = "xxxxx";

void hage( char **result) {

*result = data;

}

void main() {

char *r;
hage(&r);
printf(r);

}
712デフォルトの名無しさん:2011/12/12(月) 11:46:47.46
今時、void mainでコンパイル必須ってあるのか?
713デフォルトの名無しさん:2011/12/12(月) 13:29:30.57
*を二つですか!
どうもありがとうございました

BASICからだと、アドレス渡しって点がムズイです。。
714デフォルトの名無しさん:2011/12/12(月) 15:00:59.86
一件知りたいことがあります。力添えをお願いします。 (visual c++もc++もlinuxも経験が浅いです。)
visual c++でXMLを使いたかったため、windows用のlibxmlというライブラリを落として中身みると、
 (1)bin/libxml2.dll (964KB)
 (2)lib/libxml2.lib (369KB)
 (3)lib/libxml2_a.lib (3026KB)
 (4)lib/libxml2_a_dll.lib (3027KB)
というファイルが入っていました。
(3)と(4)はどういったものですか?ファイル名のサフィックスからわかりますか?

(2)をリンクすると、(1)のdllが使われるようです。
少し調べ、挙動的には(2)をインポートライブラリ、(1)を(2)に対応する動的リンクライブラリというものだろうと考えました。

(3)と(4)は、無くても動きました。
(3)について、ファイル名でぐぐると、単体で使われていることもあり、〜aの名前的にも(3)が静的リンクライブラリかと考えました?
そのため、単体でリンクしてみましたが、「error LNK2005: _printf は既に LIBCMTD.lib(printf.obj) で定義されています。」のようなエラーが出たため、考え違いのようです。
いま、英語圏をぐぐっているのですが、あまり英語が堪能ではなく、困っています。

以上、この件で私に不足していると考えられる知識をご存知であれば、御教示お願いします。
715デフォルトの名無しさん:2011/12/12(月) 15:03:11.84
>>714
スレ違い。環境依存OKスレでどうぞ。
716714:2011/12/12(月) 15:10:46.88
>>715
環境依存OKスレは、現在994で、埋め立て中です。
また、類似スレが多いために、後継スレは作らないとのことです。
717デフォルトの名無しさん:2011/12/12(月) 15:13:50.56
GCCスレかMinGWスレじゃない?
718714:2011/12/12(月) 15:28:55.45
>>717
ありがとうございます。
そちらで出直します。

蛇足ですが、_a_dll.lib というのは、ファイル名の規則かと思ったのですが、libxmlのローカルな表現のような気がしてきました。
719デフォルトの名無しさん:2011/12/12(月) 17:42:50.11
複数の型の違う引数を関数に入れたいのですが可能ですか?

出来るのでしたら書式を教えて下さい
720デフォルトの名無しさん:2011/12/12(月) 17:53:45.43
日本語でおk
721デフォルトの名無しさん:2011/12/12(月) 18:06:05.70
int A(){

}

の()にint型とstring型の引数を入れることは出来ますかという意味です
722デフォルトの名無しさん:2011/12/12(月) 18:07:43.12
無理
723デフォルトの名無しさん:2011/12/12(月) 18:10:12.15
int A(int p1, string p2);でおk
724デフォルトの名無しさん:2011/12/12(月) 18:37:41.90
>>721
int A(int i);
int A(const string& s);

の両方を宣言して両方を実装すればOK
725デフォルトの名無しさん:2011/12/12(月) 18:58:21.63
enum ARG_TYPE {
INT_TYPE, STRING_TYPE
};

int A(ARG_TYPE argType, int intValue, string stringValue) {
switch(argType) {
case INT_TYPE:
// intの処理
break;
case STRING_TYPE:
// stringの処理
break;
default:
// error
assert(false);
}
};
726デフォルトの名無しさん:2011/12/12(月) 21:42:59.81
>>725
内容はどうでもいいが列挙型を大文字で書くな。CとC++のタブーだろうが。
727デフォルトの名無しさん:2011/12/12(月) 22:22:24.54
setting.iniってのを作って、その内容を、

55 %int Aに代入
7 %int Bに代入
12.6 %double C

上のような感じにして、%以下からその行末までをコメントアウトとしたいです。

このファイルをプログラム起動時に読み込み、コメントのように代入するにはどうしたらいいですか。
使っているのはC++です。 よろしくお願いします。
728デフォルトの名無しさん:2011/12/12(月) 22:22:52.06
Windows.h に対する徴発と受け取りました。
729デフォルトの名無しさん:2011/12/12(月) 22:30:58.22
>>727
よく解からんな。特に2点。

1. iniと書いてるけどオリジナルフォーマットだろ。
2. 行頭に読み込む値があるだけか?

ただこれだけだったら、std::fstreamのreadで全部読み込んで、
1文字(バイトに非ず)ずつ確認して切り落とせば済むだろうけど。
何をしたいのかがいまいち解からん。
730727:2011/12/12(月) 22:42:15.17
>>729
さんくす

1,iniにした意味は、txtよりも設定のちょっと大事なファイルとして他人に意識してもらいやすいかなと思ったので。

2,はい。行頭だけです


行頭の値を読み込むのはなんとかわかったのですが、

読み込んだあと、次の行に移るという動作をするにはどうすればいいいのでしょうか。

また、%まで来たら次の行に移るにはどういう方法が考えられますか。
よろしくお願いします。
731デフォルトの名無しさん:2011/12/12(月) 22:47:17.71
個人的にはコンフィグは.cfgがいいと思うなー。
732デフォルトの名無しさん:2011/12/12(月) 23:06:23.53
>>727
FILE* fp = fopne("setting.ini", "r");
char line[256];
int A, B, C;

fgets(line, sizeof(line), fp);
sscanf(line, "%d", &A);

fgets(line, sizeof(line), fp);
sscanf(line, "%d", &B);

fgets(line, sizeof(line), fp);
sscanf(line, "%d", &C);

fclose(fp);

ぜんぜんC++じゃないけど。
733デフォルトの名無しさん:2011/12/12(月) 23:12:03.54
.ini は INI ファイルのフォーマットに従って書かれないと混乱するよね
.config は XML のイメージあるし、
.cfg はいい落としどころかもね
734デフォルトの名無しさん:2011/12/12(月) 23:16:44.33
>>732
sscanf使うぐらいなら、fscanfだっけ?あれ使えば?

const char *format = "%d%*[^\n]";
fscanf( file, format, &a );
fscanf( file, format, &b );
fscanf( file, format, &c );
735デフォルトの名無しさん:2011/12/12(月) 23:26:03.65
C++らしく書こう

#include <fstream>
#include <sstream>
#include <string>

template<typename T>
void get_value(std::ifstream &file, T &value){
std::string line;
if(std::getline(file, line)) std::istringstream(line) >> value;
}

int main(){
int A;
int B;
double C;

if(std::ifstream file = std::ifstream("setting.ini")){
get_value(file, A);
get_value(file, B);
get_value(file, C);
}
}
736デフォルトの名無しさん:2011/12/12(月) 23:27:21.70
>>734
scanf()系はエラー処理が面倒な感じで普段使わないからフォーマット文字列とか
エラーのときの挙動とかよく憶えてないんだよね。
737デフォルトの名無しさん:2011/12/12(月) 23:28:28.16
>>736
戻り値で成否数えて、バッファクリアするだけじゃん。
738デフォルトの名無しさん:2011/12/12(月) 23:41:07.94
>>737
今回みたいに行単位ならいいけど、そうでなかったら面倒じゃない?
なんか簡単な方法あるのかな。

あと、たとえばscanf("%d %d",・・・) とかやってて、オーバーフローのエラーチェックが必要ですってことになって、
fgets()とstrtol()の組み合わせに変更したら挙動が変わっちゃうけど、最初からfgets()とsscanf()だったら、
strtol()とかで自前でパースするようにしても、ストリームの消費の挙動は変化しないし。
739727:2011/12/12(月) 23:45:49.53
>>731>>733
なるほど。iniにフォーマットあるとは知りませんでした。
cfgにさせてもらいます。

>>732
ありがとうございます!
ちなみにこれ、次の行に移る処理はどこで行っているのでしょうか。sscanf()?

>>735
C++でありがとうございます!
C++のが若干面倒くさそうなんですね。
get_value関数内のgetline()の終了で次の行に移るんですかね。この辺の理解が足りてません、、、ぐほう

template<typename T>も分からないので調べてきます。

740デフォルトの名無しさん:2011/12/12(月) 23:47:43.53
>>739
ファイルポインタは独自に現在地を保持してて、それの挙動をわかった上でその書き方になる。
741デフォルトの名無しさん:2011/12/12(月) 23:51:43.28
>>738
>fgets()とstrtol()の組み合わせに変更したら挙動が変わっちゃうけど、最初からfgets()とsscanf()だったら、
>strtol()とかで自前でパースするようにしても、ストリームの消費の挙動は変化しないし。

ごめん解るようで言いたいことがよく解からん。
742デフォルトの名無しさん:2011/12/12(月) 23:52:00.63
>>739
>次の行に移る処理はどこで行っているのでしょうか。

fgets()を呼ぶたびに、一行、次の一行って読み込まれる。
743デフォルトの名無しさん:2011/12/13(火) 00:00:42.74
>>741
scanf("%d %d")だと、
「99 100」と一行で入力しても
「99
100」と二行で入力しても同じように動くけど、
これをfgets()に変更して同じ挙動を再現するのって大変じゃん。
あと、エラーがおきて一行クリアとかやってると、上のは二つともクリアされるけど
二つ目はひとつしかクリアされないとか。
細かいことは忘れたけど、scanf()系はいろいろ考えることがあって、テキストの入力はシンプルに
行単位か文字単位を使うことにした。
744727:2011/12/13(火) 00:06:41.29
>>740
ほうほう
>>742
そうだったんですか!!よく分かりました!ありがとう!!

同じ行で%以下を読み込まないようにするには
ttp://homepage1.nifty.com/emil/stream.html
上のページにあるように、

basic_istream& getline(char* buf, int size, char term)

を使ってchar termに ' % ' を渡すだけですよね?
745デフォルトの名無しさん:2011/12/13(火) 00:15:27.39
>>744
それだめなんじゃない?
「次の読み込は終端記号の次の文字から始まる」ってあるから
%まで読んで、次にgetline()呼んだら%の次から読み込まれそう。
746デフォルトの名無しさん:2011/12/13(火) 00:38:01.41
一行読んでから
% を検索してそこで文字列を打ち切れば良い
747デフォルトの名無しさん:2011/12/13(火) 00:52:12.46
>>745
は!確かに。。。

>>746
そうすることにします。ありがとうございます。


読み込み位置の指定で次の行にしたいと思い、
さっきのページで、termまで読み飛ばす関数、
ignore(int n, char term)をみつけたので、このtermを '\n' にすればいいですかね。

他にも何か次の行に移るよさげなやり方があればお聞きしたいです。
普通はignoreはそんなに使わないんですかね。
748デフォルトの名無しさん:2011/12/13(火) 01:34:00.48
>>743
俺も全然使わないけど、こってみると色々と面白いぞ。
例えばコレとか。 key = "value" 形式以外、一切受理しなくなる。
C言語と同じようにスペースがいくら入ってても無視するし、
""で括ってるもじの間に改行が入ってても1つの文字列として読み込んでくれる。
自分でオートマトンを組むことを考えたらバカに出来ん。

char key[0x100],value[0x100],nil;
if
(
 std::scanf( "%255[A-z0-9]s", key )
 &&
 std::scanf( " %[=]c", &nil )
 &&
 std::scanf( " %[\"]c", &nil  )
 &&
 std::scanf( " %255[^\"]s", value )
)
{
        std::printf( "%s is %s\n\n", key, value);
}
749748:2011/12/13(火) 02:13:47.81
偉い冗長な書き方したけど、変換子正しく指定したら短く収められたわ。
[]使ったときは、sとかcとか不要だったのね。

char
     key[0x100],
     value[0x100];

if( 2 == std::scanf( " %255[A-z0-9] %*[=] %*[\"] %255[^\"]", key, value ) )
{
      std::printf( "%s is %s\n\n", key, value);
}
750デフォルトの名無しさん:2011/12/13(火) 04:22:51.01
scanfは型安全でないのがC++的じゃなくて気に入らないからboost::spiritとか使う
751デフォルトの名無しさん:2011/12/13(火) 07:20:15.27
>>735
C++らしくなら、マニュピレーター使ってコメントすっ飛ばすぐらいの方がよくね。

int a,b,c;
is >> a >> Skip( "%", "\n" );
is >> b >> Skip( "%", "\n" );
is >> c >> Skip( "%", "\n" );
752デフォルトの名無しさん:2011/12/13(火) 20:11:35.97
マニピュレータとかキモいんで
753デフォルトの名無しさん:2011/12/13(火) 20:28:37.36
え?
754デフォルトの名無しさん:2011/12/13(火) 20:35:23.15
その他の言語で採用されないあたり察しろ
755デフォルトの名無しさん:2011/12/13(火) 20:36:23.63
iostreamの時点ですでに何もかもキモいんだからマニップがキモくないわけない
756デフォルトの名無しさん:2011/12/13(火) 23:42:01.56
お互いのクラスの変数を互いに参照したい時、
お互いのインスタンスをそれぞれのメンバ変数に保持しておく方法はまずい?
757デフォルトの名無しさん:2011/12/13(火) 23:49:28.13
ポインタや参照で持つのなら
758デフォルトの名無しさん:2011/12/13(火) 23:49:44.25
少なくとも片方は、ね
759デフォルトの名無しさん:2011/12/13(火) 23:56:10.58
>>756
UI部品とコントローラーとか、よくあるパターンじゃん。
ただし、親クラス経由で互いに参照するけどね。
760デフォルトの名無しさん:2011/12/14(水) 00:24:50.48
>>759
おおそれです!
実はそんな設計で作っていたので変かな?と思ってたんですけど安心しました
皆さんありがとうございました
761デフォルトの名無しさん:2011/12/14(水) 08:44:49.92
1対1の参照ならそれで気にしないけど
N対Mの参照だったら直接相手の参照を持ちたくないな
リンクのペアのリストを持ったマネージャを共有するほうがいい
762デフォルトの名無しさん:2011/12/14(水) 09:08:10.53
アトムとその関係が別の存在であるとかprologみたいやな
763デフォルトの名無しさん:2011/12/15(木) 00:13:18.12
string str = "abcあいう"
みたいのを配列に一文字ずつ分割して格納していくことって出来ませんか?
abcまでなら何とかなるんですけど”あいう”みたいな日本語が入ると変な結果になってしまいよく分かりません
どなたかお願いします
764デフォルトの名無しさん:2011/12/15(木) 00:36:12.12
std::wstringを使う
765デフォルトの名無しさん:2011/12/15(木) 00:40:02.56
mblenで1文字分の大きさを調べながら分割。
mbstowcsでwchar_tに変えてしまえば、楽ではある。
ただし、UTF-16やUTF-8を使用してる場合は、サロゲートペアや
合成文字の問題があるのでかなり難しい。
766デフォルトの名無しさん:2011/12/15(木) 01:12:28.07
>>765
聞きなれない単語が多く理解が追いついているか怪しいですが
自分がやりたかった事はひとまず何とかなりそうです
ありがとうございました

>>764
おそらくですけど765氏の >wchar_tに変えてしまえば
と同様の示唆でしょうか?
ヒントを頂いたと思い765氏の書いた事と共にこれから勉強したいと思います
ありがとうございました
767デフォルトの名無しさん:2011/12/15(木) 07:58:24.68
C++のwchar_tやlocaleについて正しく詳しく解説されてるサイトを教えてくれ。
サイトによって言ってることが違ったりする。
768デフォルトの名無しさん:2011/12/15(木) 08:04:08.64
規格読めば?
769デフォルトの名無しさん:2011/12/15(木) 12:41:23.28
なんで2chのスレなら正しい答えが返ってくると思ったんだ()
770デフォルトの名無しさん:2011/12/15(木) 12:50:46.98
駄目元だろ。
771デフォルトの名無しさん:2011/12/15(木) 22:48:24.06
>>769
C++のlocaleは死んでるからCかOSのlocale調べて使いな
772デフォルトの名無しさん:2011/12/16(金) 07:38:45.54
ちゃんと実装されてなかったりするしな
773デフォルトの名無しさん:2011/12/16(金) 20:55:28.10
class hoge {
public:
hoge(void) : p(0) {}
void func(void) { /* pに要素を追加したり削除したりする */ }
static void bind(some_std_container<hoge> * p) { this->p = p; }
private:
some_std_container<hoge> * p;
};

int main(void) {
some_std_container<hoge> c;
hoge * p[N];
for(int i = 0; i != N; ++i) p[i] = new hoge;

BOOST_FOREACH(hoge * p, c) { p->func(); }

return 0;
}


上のようにforeach回りてる間に要素が増減する場合ってどうするの?
いちいちコンテナを複製してから回すとコストがかかっていやな気持になる気がします
774デフォルトの名無しさん:2011/12/16(金) 21:00:37.92
cの要素が増減するわけじゃないから別に問題ないだろ
775デフォルトの名無しさん:2011/12/16(金) 21:02:09.87
>>774
ちゃんと実装されてないどころか、
マルチバイトをマトモに扱える仕様じゃない。
776デフォルトの名無しさん:2011/12/16(金) 21:06:47.36
「回りてる間」
どうでもいいが、どうやったらこんな誤字になるんだろう。
別に責めてるわけじゃない。純粋に気になる。
777デフォルトの名無しさん:2011/12/16(金) 21:09:33.82
>>773
gotoとかジョーク言ってみる。

っていうかコードが完全じゃないから意図が読めない。
778773:2011/12/16(金) 21:19:26.99
すいません自己解決しました
追加要素の為のバッファーを別途用意すれば余裕でしたね
779デフォルトの名無しさん:2011/12/16(金) 21:40:22.61
>>776
禁書じゃないのかなw
780デフォルトの名無しさん:2011/12/16(金) 21:52:50.52
>>773
作りがおかしい。bindで委譲してオブジェクトを操作するのは構わない。
ただ、bind関数を呼び出した側は、bindが内部操作のある仕様だと
解ってるはずなんでそういう使用の仕方をしちゃいかん。

あと、ループ中でコンテナの増減なんかしたらループの停止理由が
意味不明になるだろ。1つ前の要素のせいでループが停止し、次の要素が
操作できないとかありうる。その場合、次以降の要素が振る舞いをできなく
なる明確な理由を答えられないだろ。
781デフォルトの名無しさん:2011/12/16(金) 21:54:00.69
なぜ俺が禁書を読んでると知っている
782デフォルトの名無しさん:2011/12/17(土) 00:00:32.07
分かりけるのよ
783デフォルトの名無しさん:2011/12/17(土) 02:50:56.79
ネコノノミコン
784デフォルトの名無しさん:2011/12/18(日) 00:50:46.39
C言語では >> と << はシフト演算子として使われているから

cout<<... とか cin>>...

はキモイとか言う奴いるけど、bitのシフトは2のn乗をかけたり、
2のn乗で割ったりしてもできる。

>> や << をビットのシフトに使うC言語の方に問題がある。
785デフォルトの名無しさん:2011/12/18(日) 01:16:40.89
>>784
突然どうしたの?発作?
786デフォルトの名無しさん:2011/12/18(日) 01:28:42.58
>>786
n乗するのとシフト演算じゃ速度が全然違うの解ってる?
a = m << b;
a = m * c;

cを128とか指定すれば確かに、ビット分ずらせるが、
式を見ただけじゃコンピューターは2の累乗かは判断できん。
なので、乗算したら乗算回路が走る。
乗算回路は、乗算するレジスタのbit数分シフト演算と加算を行うため極めて遅い。
787 ◆QZaw55cn4c :2011/12/18(日) 01:38:49.04
>>786
つバレルシフタ
回路によっては瞬時に計算できることも。
788デフォルトの名無しさん:2011/12/18(日) 04:10:15.42
普通にVC++などでコンパイルしたプログラムを実行すると
CPUの一部しか使わないのに最大電圧で計算してしまいます
省電力で計算させるAPIはないのでしょうか?
789デフォルトの名無しさん :2011/12/18(日) 04:18:40.65
>>788
それは、回路の問題で、APIとか関係ないから。
もししたいなら、マザーボード改造するしかない。
790デフォルトの名無しさん:2011/12/18(日) 04:27:06.96
>>791
何が言いたいんだ?
Cにシフト演算子がついてるのがおかしいと言ったから答えたんだぞ。
Cは、ハードウェア制御(OS開発)を目的に作られてて、
NICなんかで必要となる高速演算のためにビット演算子を持ってるのは当たり前だろ。
791786,790:2011/12/18(日) 04:29:16.70
専ブラのレス番ずれてたの忘れてたわ。
>>790は忘れてくれ。
792デフォルトの名無しさん:2011/12/18(日) 06:22:24.12
Cにシフトがあるのにキャリー扱えないのが不思議
793 ◆QZaw55cn4c :2011/12/18(日) 07:29:03.18
>>792
iscarry(), isnocarry() を自作してリンクするくらいか。
794デフォルトの名無しさん:2011/12/18(日) 09:44:33.62
>>792
> Cにシフトがあるのにキャリー扱えないのが不思議

当時は、キャリーがないマシンとかもあったからね。
795デフォルトの名無しさん:2011/12/18(日) 10:03:42.39
ローテート演算子がたまにほしくなる
暗号化とか
796デフォルトの名無しさん:2011/12/18(日) 10:24:30.26
演算子オーバーロードという腐った習慣があるせいで演算子そのものが邪悪
特別な理由がなければ使うべきではない
797デフォルトの名無しさん:2011/12/18(日) 10:28:17.93
一部の数学オブジェクト類なら演算子オーバーロードはいいけど、
むやみやたら使うとひどいことになるもんなぁ
798デフォルトの名無しさん:2011/12/18(日) 10:44:43.19
lispでも使ってろ
799デフォルトの名無しさん:2011/12/18(日) 12:24:10.53
テンプレートに掛けて、値型と互換をもって動作するなら、
別にいくらオーバーロードしようと構わんけどな
1つのテンプレートで済むものを、クラス用と値型用2つ作るほうが、
ばかばかしいと思うしな
800デフォルトの名無しさん:2011/12/18(日) 12:54:14.02
数学オブジェクトの演算子もたまに混乱の元になるんだよな
数学上で定義されてる演算をすべて定義できるわけじゃないし
この*は内積と外積どっちだよドキュメント見るのめんどくせぇよ最初から両方とも関数にしろカスってなるし
801デフォルトの名無しさん:2011/12/18(日) 13:23:47.07
内積外積に*は使わんな
使ってるの見た事無い
*はスカラー積だけ
802デフォルトの名無しさん:2011/12/18(日) 13:36:56.44
スカラー積って一般に内積じゃね?
要素同士の掛け算てなんて言うんだろうね?
803デフォルトの名無しさん:2011/12/18(日) 14:22:40.37
スカラーとの積ね
804デフォルトの名無しさん:2011/12/18(日) 14:31:39.23
C の << >> は別になんとも思わんかったが
C++ の << >> は基地外かと思った
805デフォルトの名無しさん:2011/12/18(日) 15:08:38.30
別に。
806デフォルトの名無しさん:2011/12/18(日) 15:35:17.31
なんでクラスであってもグローバル代入演算子はできないんですかね
807デフォルトの名無しさん:2011/12/18(日) 16:50:00.54
デフォルトの代入演算子が既に存在しているから
808デフォルトの名無しさん:2011/12/18(日) 23:54:30.51
内積ってドット積のこと?だったら・をオーバーロードすべきで、*をオーバーロードしちゃらめでしょ^^
外積はクロス積のこと?だったら×をオーバーロードすべきで、*をオーバーロードしちゃらめでしょ^^

っていうか、ベクトルは複素数で扱うと積の計算簡単でいいね^^
809デフォルトの名無しさん:2011/12/19(月) 00:05:09.37
ベクトルを1行か1列の行列と考えれば積は内積で定義したくなるだろう
810デフォルトの名無しさん:2011/12/19(月) 00:47:00.97
したくならねぇよ。
ベクトルの実装を、2階テンソルで考えれば * はテンソル積を
割り当てるのが妥当。外積、内積は、Dot( t1, t2 ); Cross( t1, t2 );と関数で
計算するほうが自然。
811デフォルトの名無しさん:2011/12/19(月) 00:51:31.60
だから凝った人だったらベクトルの転置を用意してテンソル積を内積にしたりするのか
812デフォルトの名無しさん:2011/12/19(月) 01:21:41.08
内積計算の関数はinner_productで標準にあるんだけどな
813デフォルトの名無しさん:2011/12/19(月) 01:45:55.23
>>810
一つ言わせてもらうなら、

> 外積、内積は、Dot( t1, t2 ); Cross( t1, t2 );

前後で順序が逆になっているのが不自然
814デフォルトの名無しさん:2011/12/19(月) 01:52:21.75
>>813
横からだけど、コード組んだことあれば、関数名見るだけでわかるけど。
っていうか、外積と内積という変な名前があんまり好きじゃないな。
815デフォルトの名無しさん:2011/12/19(月) 05:24:39.36
外積 Cross( t1, t2 );
内積 Dot( t1, t2 );
816デフォルトの名無しさん:2011/12/19(月) 06:11:59.60
あらゆるベクトル空間の内積(inner_prod)を導き出せるコードって存在するのかな
内積が定義できない空間はあると思うし
ドット積(R3内積)みたいに特定の空間に特化したものにならざるを得ないのでは
817デフォルトの名無しさん:2011/12/19(月) 07:35:37.39
発想が逆だ
std::inner_productの仕様に合わせてクラスを作るんだ

内積が定義できない空間はそもそも
数学的に定義できないのに求められるわけがない
ナンセンス
818デフォルトの名無しさん:2011/12/19(月) 08:22:59.09
内積が定義できない空間を思いつくのが困難。
距離が導入できればできるんだろ。
Z/(n)とかだったら距離は入れられないか?
819デフォルトの名無しさん:2011/12/19(月) 10:42:57.62
*は・でも×でもないんだし、その中間ってことにしよう
820デフォルトの名無しさん:2011/12/19(月) 10:58:08.92
多様体
821デフォルトの名無しさん:2011/12/19(月) 12:42:16.26
たたみ込み
822デフォルトの名無しさん:2011/12/19(月) 17:59:02.38
こういうめんどくさい論争が起こるからoperatorは糞なんだよ
最初から関数にしておけば時間を無駄にすることもなかったのにな
823デフォルトの名無しさん:2011/12/19(月) 19:27:55.57
メイヤーいわく、C++にはいらいらするほどの詳細がある。
それは現実の要請に従った結果であって、

いやならC++を使わなければいい

ただそんだけ^^;
824デフォルトの名無しさん:2011/12/19(月) 19:32:32.23
まあ確かにもうC系列は限界突破してガタガタだもんな
そろそろ乗り換えるべきクールな言語を開発しないと人類の発展そのものに大きな抵抗が生じる
825デフォルトの名無しさん:2011/12/19(月) 19:37:05.76
やっぱねー、スマートなGC必要だよ。それがどんなものかはわからないけどね。

で、Goとか出てるけど人気ないし、レガシー引っ張るほうがパイがでかくてコミュニティが大きくなるんだよな。
レガシー切ったほうがいいとは思うけど、再学習コストってやっぱ払いたくないものなのかな。
826825:2011/12/19(月) 19:42:16.78
そういえば、マルチスレッドでGCスレッド立てれば回収してくれるようなGCって有るのかな。らいぶらりでも。
コレなら、少なくともストップザワールドにはならないとおもうんだけど。
827デフォルトの名無しさん:2011/12/19(月) 19:43:59.73
レガシーは中年〜老人にやらせといて
若い世代には積極的に新しいことやらせたほうがいいよ
前時代的な慣習を押し付けるのは可哀想だ
828デフォルトの名無しさん:2011/12/19(月) 19:47:12.38
アンドリューハントいわく、知識ポートフォリオを実行せよ。
新しい言語の時代はいつか来る。その準備が必要だ。
しかし、古い知識は無駄にはならない。
だが自動車の時代にいつまでも馬車で走るのはナンセンスだ^^

愚痴ってないでさっさとやれ^^
829デフォルトの名無しさん:2011/12/19(月) 19:51:49.52
>>826
コンパクション無しのGCならできそう
830デフォルトの名無しさん:2011/12/19(月) 20:41:46.48
>>827
新陳代謝のサイクルとしてはたしかにそうだよね。
日本は社会的に型システムが更新されないから、大分古くなってきてるよな〜。
受け手もやり手もそっちに合わせないといけないから中間コストがすごいめんどい。

>>828
サーセン。
車と馬車か。なるほど。参考にします。

>>829
確かにできそうですなー。
フラグメントしないように短命な汎用メモリの使用時の最大長を固定しておけばフラグメントはある程度どうにかなりそうですな。
で、コンパクションがネックなんですな〜。
コピーGCを採用しつつアドレスを持つ特定の変数をリファレンスにすれば一発で通知できるかなぁ・・・。
コピー作ってる間も止まらないし、準備して終わったらスワップすればいいのかな。
うーむ、専門外すぎる・・・。でも面白い!!
831825=830:2011/12/19(月) 20:48:08.91
自分の都合とか考えてたら、電波文章になっちゃった。すまぬー。Orz
832デフォルトの名無しさん:2011/12/19(月) 21:08:42.07
そうだ、お返事ありがとう!!って書くの忘れた。

なぜ上げた、俺・・・。Orz
833デフォルトの名無しさん:2011/12/19(月) 21:10:54.28
D言語があと1〜2年くらいで安定するかも?
834デフォルトの名無しさん:2011/12/19(月) 21:12:53.48
>>833
ネットみてても、Dの噂が聞こえてこないのだけど、進んでるのかぁ。
自分も一回ハマったから期待したいね。
835デフォルトの名無しさん:2011/12/19(月) 21:17:02.55
ダメ言語
836デフォルトの名無しさん:2011/12/19(月) 21:17:55.33
c++ですらまだ発展途上って聞くけどD言語ってどうなってるの?
837デフォルトの名無しさん:2011/12/19(月) 21:35:21.23
ライブラリの破壊的改造中
言語的にも多少手は入ってる
838デフォルトの名無しさん:2011/12/19(月) 21:57:09.41
>>822
そもそも演算子オーバーロードへの難癖が発端なのに
だからoperatorは糞なんだよ(キリって・・・
839デフォルトの名無しさん:2011/12/19(月) 22:12:33.71
operator×を定義すれば問題ない
840デフォルトの名無しさん:2011/12/19(月) 22:19:45.99
Prologみたいにユーザ定義演算子導入しようぜ
841デフォルトの名無しさん:2011/12/19(月) 22:24:20.54
スマポやイテレーターのような組み込みの模倣、あるいはライブラリの要求で仕方なくという場合を除いて
operatorの使い方はクラス設計者が利用者に強制するべきではないと俺は思うんだよね

//"foo/hoge.hpp"
namespace foo {
class hoge {
public:
void add(hoge const & h) { /* ry */ }
};
}

//"myapp/hoge_op.hpp"
namespace myapp {
inline foo::hoge & operator += (foo::hoge & h, foo::hoge const & g) { h.add(g); return h; }
inline foo::hoge operator + (foo::hoge h, foo::hoge const & g) { return h += g; }
}

int main(void) {
using namespace myapp;
foo::hoge h, g;
h += g; h + g;
return 0;
}

operatorなんて極論すると利用者が楽するためのものなんだから
利用者が使いたいように勝手に作るのが筋だろ
842デフォルトの名無しさん:2011/12/19(月) 22:28:08.29
あんまり自由すぎると、集団でやったとき整合性とれなくならない?
843デフォルトの名無しさん:2011/12/19(月) 22:34:03.68
どうでもいい。
値型のテンプレートを流用できさえすりゃトントンなんだよ。
844デフォルトの名無しさん:2011/12/19(月) 22:42:10.66
組み込みのように見えるとテンプレートアルゴリズムでサクっと使えて便利って言うけど
普通に関数オブジェクトバージョンも用意されてるから別に組み込み準拠してなくても困らないよな
さらにラムダが普及すればこの傾向はますます強くなるだろう
特定の外部クラスや外部関数のために、そのクラスにとって本質的には必要ない演算子を定義するという邪悪さから解放されるほうが重要
845デフォルトの名無しさん:2011/12/19(月) 23:19:05.52
>>844
C++の悪友の事ですね。
846デフォルトの名無しさん:2011/12/20(火) 00:37:33.96
>>542
これが出来ればなぁ‥
847デフォルトの名無しさん:2011/12/20(火) 00:46:31.30
C++使ってるのに演算子が邪悪とか言ってんのが笑える。
そもそもSmalltalkを初めとして、オブジェクト指向言語にとっちゃ
演算子は基本的なメッセージでしかないんだけどな。
OOPL流儀で動作が分かりづらいと思うんなら、他のベターCにでも
移ったほうがいいんじゃない?
Objective-Cならgccやclangのフロントエンドで組み込みにも使えるぜ。
848デフォルトの名無しさん:2011/12/20(火) 01:05:19.29
>>847
>>844はクラス依存性の話であって演算子が邪悪って話じゃないでしょ。
849デフォルトの名無しさん:2011/12/20(火) 12:07:44.95
演算子が嫌いならoperator+()をそのまま関数として呼び出せばいいじゃん
850デフォルトの名無しさん:2011/12/20(火) 12:20:18.76
operatorはメンバ関数内で使いにくいのがだるいね
void hoge::func(hoge const & other) {
operator += (other);
*this += other;
add(other);
}
どう考えても3番目がいいだろう
851デフォルトの名無しさん:2011/12/20(火) 12:36:42.55
operator+()はadd()のラッパーとかにしたほうがいいな
852デフォルトの名無しさん:2011/12/20(火) 13:28:55.87
&~

これってなんなんでしょうか?論理演算子のようなんですけど。
読み方だけでも教えてください。お願いします。
853デフォルトの名無しさん:2011/12/20(火) 13:35:17.02
アンパサンドとチルダだっけ?
AND演算子とXOR演算子だったような気がする。
854853:2011/12/20(火) 13:43:44.90
>>853
これ、まちがってるかも・・・。
855852:2011/12/20(火) 13:55:36.19
>>853
いえ、あってます。読み方と意味は合ってます。ありがとうございます。
ただ、これが

X &~ Y
と書いてあったのでよくわかんないんです。
&~でググってもよくわかんないです。
単純に組み合わせてあるだけなんですかね?
856デフォルトの名無しさん:2011/12/20(火) 14:02:26.32
X & ~Y
つまりYに立ってるビットをXから取り除くことができる
~YでYに立ってるビットが反転するっていうのは知ってるよね?
int a = 0x101;
int b = 0x111;
int c = b & ~a; // c == 0x010
857デフォルトの名無しさん:2011/12/20(火) 14:02:45.66
X & (~Y)
858852:2011/12/20(火) 14:09:22.28
XORじゃないのか。いや、ビットにおけるそれということか。
どっちもビット演算子だったんですね。

>>856-857
ありがとうございます。よくわかりました。
859853-854:2011/12/20(火) 14:16:48.82
ttp://ideone.com/0ripM
最近自分が置いてかれる側になってきたなぁ。
不味い!

>>856-857
ほえー。勉強になります。

>>858
余計なこと言ってスマナイ。
860853-854:2011/12/20(火) 14:21:12.50
チルダはNOT演算子だった。
XORはサーカムフレックスだってさ。

俺、ヤバイな。Orz

ttp://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97
861デフォルトの名無しさん:2011/12/20(火) 17:15:07.54
記憶が確かなら、ANDでビットチェック、ORでビットオン、NANDでビットオフ・・・
しかし、C++なら素直に bitset<N> を使ったほうが便利なのだった^^

あと、VC++ならvector<bool>でもいいね。最適化で bitset と同等の速度になるから。
ただ、書き込みをバイト単位で行うらしく、マルチスレッドでは使えないけど^^
あと、GCCでは全然高速化しない。なぜなんだろう^^
862デフォルトの名無しさん:2011/12/20(火) 19:49:55.57
vector<bool>は非推奨なので
863デフォルトの名無しさん:2011/12/20(火) 22:01:51.24
class Hoge {
public:
typedef std::string const & result_type;
std::string value;
Hoge(std::string const & s) : value(s) { }
};

template <class T> typename T::result_type Fuga(T const & obj) {
return obj.value;
}

int main(void) {
std::string s(Fuga(Hoge("hello")));
std::cout << s << std::endl;
return 0;
}

こう書いた場合に変数の寿命は大丈夫でござるか?
864デフォルトの名無しさん:2011/12/20(火) 22:26:09.67
自己責任
865デフォルトの名無しさん:2011/12/20(火) 23:06:18.36
//sample.h
class CSuper
{
protected:
int m_protected;
};

class CSub : public CSuper
{};
//main.cpp
#include "sample.h"

int main()
{
CSub sub;
sub.m_Protected=1;
return 0;
}

これってできないの?
866デフォルトの名無しさん:2011/12/20(火) 23:26:32.00
魔法の言葉を使えばできるよ
867デフォルトの名無しさん:2011/12/20(火) 23:33:28.80
#define protected public
868デフォルトの名無しさん:2011/12/20(火) 23:34:34.52
>>867
親が公開しないと子を通じてもアクセスできないの?
869デフォルトの名無しさん:2011/12/20(火) 23:37:40.25
未だにクラス名の頭にCをつけたり、データメンバの頭にm_をくっつける流儀は
マイクロソフト的ハンガリアン(悪い方のハンガリアン、システムハンガリアン)を想起させて馴染めないなー^^;
870デフォルトの名無しさん:2011/12/20(火) 23:38:33.70
protectedしてるものを公開さらたら困るだろ
子クラスも親が、自分以外にメンバーを後悔しないことを
アテにして使用してんのに信用できなくなる
871デフォルトの名無しさん:2011/12/20(火) 23:41:10.82
ハンガリアンって、ミリメートル(mm)とか、グラム(g)とかならどうよ。
個人的には、アリだと思ってる。例え、クラスで単位を定義していても、
代入先との単位変換とちったらとんでもないことになるからね。
872デフォルトの名無しさん:2011/12/21(水) 00:03:24.81
mHogeは識別子をかぶらせないためだけに書くことはあるけどな
hoge_でもいいけどアンスコとmどっちが生理的に受け付けないかの差でしか無い
thisの代わりになって短ければ何でもいい

>>871
数値ラッパーを作って(普通はTMPで)型安全にするからハンガリアンは要らないよ

873デフォルトの名無しさん:2011/12/21(水) 05:24:43.01
>>871
g、mの違いは本来のハンガリアンに近いからいいけど、
mm、cmとかの接頭句は無しだと思う。
874デフォルトの名無しさん:2011/12/21(水) 08:44:43.00
どっちもハンガリアンだろ
875デフォルトの名無しさん:2011/12/21(水) 09:01:00.79
俺がハンガリアンと言ったらそれはハンガリアンだ
876デフォルトの名無しさん:2011/12/21(水) 10:11:27.11
ジャイアン乙。
877デフォルトの名無しさん:2011/12/21(水) 12:21:04.59
ジャンガリアンハムスターかわいいよ
878デフォルトの名無しさん:2011/12/21(水) 14:32:29.22
幾つものインターフェースを継承してクラスを作るのって設計的に良くない?
ゲームキャラクターとかつくろうとすると概念的に直交したインターフェースを何個も継承してて気持ち悪いんだけど気にしたら負けなのかな
879デフォルトの名無しさん:2011/12/21(水) 15:03:55.11
何故それが必要なのか考えて使え
勉強した手法を総動員したがるな
880デフォルトの名無しさん:2011/12/21(水) 18:44:03.12
冗談抜きでカッコイイレスだな
どっかの教官が良いそうなセリフ
881デフォルトの名無しさん:2011/12/21(水) 19:24:10.10
メンバー明示したいならthis->でええがな
882デフォルトの名無しさん:2011/12/21(水) 19:29:53.99
まさかとは思うが、Weaponとかゲーム上の名前で、
インターフェースになるクラス作ってないよな。
DelegaterとかDictionalyとかRegistoryとか、あくまで機能で
クラスを分けなさい。ユーザーサイドの視点でクラスを作ると
無駄が増えるだけ。
883デフォルトの名無しさん:2011/12/21(水) 22:38:21.29
C++で可変引数の関数を作成したいと考えています。
以下のように
例)
Func(NUM,a,b,c...)

一つ目の引数に個数を入れてvar_listを利用する手法がよくありますが、
C++で一つ目に個数を入れずに実現する手法はないでしょうか。
884デフォルトの名無しさん:2011/12/21(水) 22:46:57.01
文字列の最後はヌル文字で終わる、というように
デリミタを要求する場合は個数は必要ない
ただ、デリミタを書かなかったら暴走する諸刃の剣
素人にはお勧め出来ない
885デフォルトの名無しさん:2011/12/21(水) 22:58:07.29
可変長引数を解析する関数が個数を取得するだろ。
886デフォルトの名無しさん:2011/12/21(水) 23:16:29.31
template<class T1> Arguments<T1> _( T1 );
template<class T1, class T2> Arguments<T1, T2> _( T1, T2 );
template<class T1, class T2, class T3> Arguments<T1, T2, T3> _( T1, T2, T3 );
てな感じで必要な数だけ引数をホールドするオブジェクトを
生成する関数を大量にオーバロードする。

そんで、Func( _( 10 , 20 , 30 ) );みたいな感じで使う。
887デフォルトの名無しさん:2011/12/22(木) 00:36:13.32
>>882
えっ
何、じゃあ俺が作ったユニットとそこから派生するプレイヤー、フレンド、エネミークラス破棄した方が良い?
888デフォルトの名無しさん:2011/12/22(木) 01:13:15.39
>>885
レスありがとうございます。
可変長引数を解析する関数をどうすればいいか、良い案が浮かばなくて・・・。

>>886
レスありがとうございます。
この方法だと引数の数だけ関数をオーバーロードするってことですよね?
可能であればテンプレート等を駆使して関数は一つだけ定義したいと考えています。
889デフォルトの名無しさん:2011/12/22(木) 02:47:09.93
可変長テンプレート引数はC++11で採用されるんだっけ?
tuppleの実装とか見る限り、現状では引数の数だけ書くしかないんだろうね。
まさにマクロで書くしかあるまい。
890デフォルトの名無しさん:2011/12/22(木) 02:59:16.91
>>888
解ってない気がするので補足するが、_(・・・);って関数は複数定義するが、
Funcの方に関しては、定義は1つでいい。
_(・・・)って関数の中には、目的の処理は書かない。あくまで、可変長引数オブジェクトを
生成するだけだ。_(・・・);はC++03の制約上どうしても複数作成する必要がある。
boostとか有名ライブラリも可変長引数を実装するときは複数定義してる。
大体20個でも引数定義してしまえば、以降定義する必要は無くなるんだから、
そんなに気にしないでいいと思うぞ。200だの300だの引数が必要になるなら、
そもそもコードがおかしいし。
891デフォルトの名無しさん:2011/12/22(木) 05:00:07.91
>>889
レスありがとうございます。
やはりマクロしかないですか・・・。
C++ならテンプレートとマクロを駆使すれば
たくさん定義を書かなくて済みそうだと思ったのですが、
無理みたいですね・・・。

>>890
886と同じ人でしょうか?
何度もレスをしていただいて本当にありがとうございます。
886のほうの書き込みは理解できたのですが、
_(a,b,c...)
↑クラス名のこの部分を書かずに済まない方法を探していたので・・・。
確かに気にしなくてもいい部分なのですが
やっぱり取り外せたらうれしいなと^^;

「C++テンプレートテクニック」を読んでから
妙に気持ちが高揚してしまって。
演算子オーバーロードとテンプレートがあればなんでもできる!と
上記二つを過信していたようですorz

色々と相談に乗っていただいてありがとうございました。
892デフォルトの名無しさん:2011/12/22(木) 07:18:08.45
C++11なら可変長引数テンプレートを使って
どうとでもなるけどね
893デフォルトの名無しさん:2011/12/22(木) 09:58:04.81
0がポインタにできるのはC++の仕様だと思うのですが
以下のように0初期化されたconst整数型の変数であれば
ポインタに変換できるというのは仕様なのでしょうか?

const int a = 0;
void *b = a; //OK
const short c = 0;
char *d = c; //shortでもOK
int e = 0;
//void *f = e; //C2440 constでないから?
int g = 1;
//void *h = g; //C2440 0でないから?
const double i = 0;
//void *j = i; //C2440 整数でないから?
enum{ k, l };
//void *m = k; //C2440 enumは0でもダメ?
//void *n = l; //C2440 0でないから?

Visual C++ 2010 Expressです。
894デフォルトの名無しさん:2011/12/22(木) 10:48:36.43
仕様じゃねーの
4.10
A null pointer constant is an integral constant expression (5.19) prvalue of integer type that evaluates to
zero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type

enumはintegral typeではないので使えない。shortはintegral type
895デフォルトの名無しさん:2011/12/22(木) 12:13:35.47
なるほど。
よく、NULLがオーバーロードでintが呼び出されるか
void*が呼び出されるかが問題視されていますが
これだと、せっかく型の付いた変数に入れているのに
同じような問題が起きそうですね。
これから気をつけようと思います。
ありがとうございました。
896デフォルトの名無しさん:2011/12/22(木) 12:49:04.56
明示的呼び出しはどうすればいいんだろ
キャスト付き?
897デフォルトの名無しさん:2011/12/22(木) 15:53:38.07
void overload(void *){}
void overload(short){}

const long a = 0;
//overload(a); //C2668
//overload((int)a); //C2668
overload((short)a);
overload((void*)a);

longからintにキャストすれば、void*は無視されるだろうと
思ったら迷ってるしw
呼び出したい関数の引数の型にちゃんとキャストしてやれば
普通に呼び出せた。

const long a = 0;
と書いたら、これがlongという型であり、
longが他の整数型に変換できるのは当たり前だが
void*や他のポインタにも変換できる性質を持った
特殊なlongであるということを認識しないといけないな。
898デフォルトの名無しさん:2011/12/22(木) 16:19:32.35
参照を共用体に入れると、参照が指している先を
変更できるようなのですが、このような使い方は
問題ないのでしょうか?

int a = 1;
union HOGE{
int &r;
int *p;
} b = { a };
int c = 2;
b.p = &c;
899デフォルトの名無しさん:2011/12/22(木) 16:47:42.41
大問題



9.5 Union
If a union contains a static data member, or a member of reference type, the program is ill-formed.
900デフォルトの名無しさん:2011/12/23(金) 00:38:10.57

標準入力をファイルにした時、cinの後にscanfを使うと値が正しく入力されないようなのですが、どうしてでしょうか。
//in.txt
1
2,3
//test.cpp
#include <iostream>
#include <cstdio>
using namespace std;
main()
{
int a,b,c;
cin>>a;
scanf("%d,%d",&b,&c);
printf("%d %d %d\n",a,b,c);
}
//実行時
>test
1
2,3
1 2 3
>test <in.txt
1 256 1
901デフォルトの名無しさん:2011/12/23(金) 01:22:21.53
iostreamとFILEは混ぜちゃダメ。
902デフォルトの名無しさん:2011/12/23(金) 02:00:54.50
>>900
in.txtの2,3の後に改行がないとか文字コードがUnicode(utf-16)とか?
903デフォルトの名無しさん:2011/12/23(金) 08:14:41.46
>>901
混ぜてもいいがsync_with_stdio(true)にする必要がある
そして当然だが遅くなる
904デフォルトの名無しさん:2011/12/23(金) 11:54:09.49
trueがデフォルトだ
905デフォルトの名無しさん:2011/12/23(金) 12:02:32.77
最近はデフォでtrueじゃね
906デフォルトの名無しさん:2011/12/23(金) 12:15:30.23
GCC3はデフォでfalseな事があったと思う
907デフォルトの名無しさん:2011/12/23(金) 12:15:41.26
いや、GCC2だったかも
908デフォルトの名無しさん:2011/12/23(金) 13:03:32.04
>>904-907

今はどうなのか分からないけど

http://d.hatena.ne.jp/s-yata/20100726/1280138663

falseにするとかなり速くなるらしい
909デフォルトの名無しさん:2011/12/23(金) 14:10:07.83
マップってイテレーターないですよね?
910デフォルトの名無しさん:2011/12/23(金) 14:15:29.30
>>909
あるよ。じゃないと走査処理ができない。
[]使うと勝手に要素増えちゃうし。
911デフォルトの名無しさん:2011/12/23(金) 14:22:05.92
イテレータのないコンテナとかコンテナちゃう
912デフォルトの名無しさん:2011/12/23(金) 15:00:10.20
あるとしても出力専用ですよね?
913デフォルトの名無しさん:2011/12/23(金) 15:03:49.52
>>912
挿入と削除にはメンバ関数を使う

insertとerase

但し挿入時のイテレータの値はヒントに過ぎず、どちらにしろ自動的にソートされる
(というか木構造が勝手に変わる)
914デフォルトの名無しさん:2011/12/23(金) 15:05:25.55
mapは
i = m.erase(i);
で削除しながら進めるけど
setだとeraseの返り値が無いんですけどどうすればいいんでしょうか
915デフォルトの名無しさん:2011/12/23(金) 15:08:59.50
eraseの引数で後置インクリメントする
916デフォルトの名無しさん:2011/12/23(金) 15:15:31.71
std::mapならiteratorあるけど、どのマップの事いってんだ?
まさか地図か?
917デフォルトの名無しさん:2011/12/23(金) 15:16:16.20
>>916
小学生みたいな揚げ足取りはやめなさい
みっともないですよ
918デフォルトの名無しさん:2011/12/23(金) 15:17:21.82
>>914
ダウト

mapのeraseはオーバーロードされていて、値を引数に取ると削除した数を返すが
イテレータを引数にするとsetと同じく何も返さない
919デフォルトの名無しさん:2011/12/23(金) 15:17:45.21
std::mapのことですけど。
入力するとき、キーもあるからキーをintということにして
始めにイテレーターに入力したやつのキーを0、次を1、次を2、次を3、
次を4、次を5、次を6、次を7のように順番に入れたいと思うのです。
イテレーターから出すときは0から順番に出したいということはできませんよね?
920デフォルトの名無しさん:2011/12/23(金) 15:18:43.42
待て待て間違った
setはeraseすると次の要素の位置を返すがmapは返さないんだった
つまり>>914は逆なわけだ
921デフォルトの名無しさん:2011/12/23(金) 15:25:36.26
>>919
キーでソートされてしまうから取り出す時の順番は大抵全然入力時と関係がない
それにmultimapを使わないと同じキーを入れれないし

std::map<int, int> mii;

mii[1] = 1;
mii[1] = 2;

std::cout << mii[1] << std::endl;

とやると2と出力される
同じキーのsecondは上書きされてしまうわけだ
922デフォルトの名無しさん:2011/12/23(金) 15:27:49.62
eraseで次の要素返すのはlistとvector
setとmapは要素の追加削除で順序が破壊されるからループ中の変更はご法度
923デフォルトの名無しさん:2011/12/23(金) 15:45:33.51
setは行けるんじゃね?

std::set<int> sii;

for (int i = 0; i < 10; i++)
sii.insert(i);

for (std::set<int>::iterator pos = sii.begin(); sii.size(); ) {
std::cout << *pos;
pos = sii.erase(pos);
std::cout << " next: " << *pos << std::endl;
}
924デフォルトの名無しさん:2011/12/23(金) 17:17:29.87
map、multimap、set、multisetのerase
98/03
keyを指定する形式のときだけ返却値あり。
11
すべて(keyを指定する形式、単一イテレータを指定する形式、イテレータ範囲を指定する形式)の形式で返却値あり。
925デフォルトの名無しさん:2011/12/23(金) 17:35:30.34
11の話は11スレですれば
まだまともな規格表もない
926デフォルトの名無しさん:2011/12/23(金) 17:36:09.95
巡回中に削除するのはダサいと思う
927デフォルトの名無しさん:2011/12/23(金) 17:41:27.40
コーディングスタイルにケチ付けたいのならスレ違いだよ
928デフォルトの名無しさん:2011/12/23(金) 17:45:01.36
巡回中に削除すると見えない所で同じコンテナの走査が多重に行われてると死ぬ。ゲームではよくある事
削除命令はキューイングしてどこかで一元管理しないと
929デフォルトの名無しさん:2011/12/23(金) 17:52:36.59
今解決したい問題があるのに
「C++11なら〜がある」というヤツはコミュ障
930デフォルトの名無しさん:2011/12/23(金) 18:17:39.61
>>914に対する実用的なほぼ唯一の答えはとっくに>>915で出てる
931デフォルトの名無しさん:2011/12/23(金) 18:49:01.22
>>930
それって仕様で定められてるの?
932デフォルトの名無しさん:2011/12/23(金) 20:12:38.87
>>928
ったりめーだろ
別にコンテナに限らずマルチプロセス/マルチスレッドではいつもそう
933デフォルトの名無しさん:2011/12/23(金) 20:13:20.29
istreamって貧弱だよな。
なんでscanfバリのパターンマッチができないんだ。
934デフォルトの名無しさん:2011/12/23(金) 21:14:22.21
>>931
標準規格(98でも11でも)の仕様ではエラーにも未定義動作にもならない
935デフォルトの名無しさん:2011/12/23(金) 22:29:21.49
イテレーターって本体が変更されても問題なく生きてるんだ知らんかった
936デフォルトの名無しさん:2011/12/23(金) 23:07:04.76
>>935
えっ?
937デフォルトの名無しさん:2011/12/23(金) 23:36:25.93
皮肉だろ
938デフォルトの名無しさん:2011/12/24(土) 00:00:36.60
set<Hoge> s;
...
for (set<Hoge>::iterator i(s.begin()); i != s.end();) {
 if (check_erase(*i) == true) {
  s.erase(i++);
 } else {
  ++i;
 }
}
939デフォルトの名無しさん:2011/12/24(土) 00:03:59.47
while(i != end) {
if( test(i) ) {
s.erase( s.begin() );
}
++i;
}
940デフォルトの名無しさん:2011/12/24(土) 01:25:42.15
>>935
マジレスすると本体=コンテナの意味ならコンテナによる。
list、map、setあたりは要素の追加ではイテレータは全く無効にならないし要素を削除したときはその要素を指すイテレータだけが無効になる。
941デフォルトの名無しさん:2011/12/24(土) 09:09:32.37
イテレータはすぐ死んじゃうって考えで組んだ方が良いだろ。
942デフォルトの名無しさん:2011/12/24(土) 09:22:51.69
節子「なんでイテレータすぐ死ぬん? 」
943デフォルトの名無しさん:2011/12/24(土) 11:39:23.86
※イテレータは生鮮食品です。お早めにお召し上がり下さい
944デフォルトの名無しさん:2011/12/24(土) 12:47:27.26
listのイテレータは最強だぜ!
945デフォルトの名無しさん:2011/12/24(土) 12:51:31.75
バランス木って要素挿入削除で回転するのに順序は変わらんのか
STLってよく出来てるんだな
946デフォルトの名無しさん:2011/12/24(土) 14:25:09.06
というか削除後の次のイテレータを返すメンバ関数はは回転操作をした後のイテレータを返してるんだと思う
じゃないと無効になるだろ
947デフォルトの名無しさん:2011/12/24(土) 14:59:30.52
気になってmapとsetの規格表を読んでみた

§23.3.2 Class template multimap
void erase(iterator position);

§23.3.3 Class template set
void erase(iterator position);

あれれ〜??標準ではどちらも何も返さないようになってるな
で、VC10を見てみると

map::erase
For the first two member functions, a bidirectional iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the map if no such element exists.

set::erase
For the first two member functions, a bidirectional iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the set if no such element exists.
For the third member function, the number of elements that have been removed from the set.

つまり独自拡張なのかC++11の規格を部分的に取り入れたのか、とにかく盲目的に
使うとはまりそうだな
気をつけよう
948デフォルトの名無しさん:2011/12/24(土) 16:25:00.09
規格の話は>>924で出てるだろ
949デフォルトの名無しさん:2011/12/24(土) 18:45:18.24
規格はいいんだがVC10で動いてしまうので使わない方がいいって事だな
gccでは通らないだろうし
950デフォルトの名無しさん:2011/12/24(土) 19:09:12.86
http://ideone.com/bLjL4
-std=c++0x,-std=gnu++0x,-std=c++11,-std=gnu++11 のどれかをつければgccでも通る
951デフォルトの名無しさん:2011/12/24(土) 23:21:48.19
std::vector<boost::shared_ptr<my_class> > v;
std::vector<boost::shared_ptr<my_class const> > const & x(v);

一時的に、ポインタの先までconstの読み取り専用の参照を作りたいんですがなんとかなりませんかね
std::vector<boost::shared_ptr<my_class const> > const x(v.begin(), v.end());
と書けばいちおう動くんですがコピーコストが無視できません
952デフォルトの名無しさん:2011/12/25(日) 08:52:26.88
953デフォルトの名無しさん:2011/12/25(日) 10:53:30.51
>>952
これはすごい
保存しますた
954デフォルトの名無しさん:2011/12/25(日) 19:24:22.96
>>950
誰が教えてくれなんて頼んだ?
俺はお前に諮問してるんだろうが
大体お前が人様に物を教える立場か
図に乗るのも大概にしろ
ネットの中だけで偉くなったと勘違いして
少しは外に出て目を醒ませ
955デフォルトの名無しさん:2011/12/25(日) 19:47:40.46
単に情弱だと「指摘」してるだけだろ。
956デフォルトの名無しさん:2011/12/25(日) 19:58:53.32
強い被害妄想は糖質のよくある症例の一つです
957デフォルトの名無しさん:2011/12/25(日) 20:09:01.35
C++11 = 処理系依存
現状は、質問への回答はC++03準拠でいい。
C++11の機能を使いたいヤツにはC++11スレへ行ってもらえ。
958デフォルトの名無しさん:2011/12/25(日) 20:14:21.40
VC++のインラインアセンブラで64bitレジスタ使う場合って
なんて指定すればいいの?
959デフォルトの名無しさん:2011/12/25(日) 20:27:31.27
>>957
勝手に俺様ルールつくんなボケ
C++はすべて平等に扱う
960デフォルトの名無しさん:2011/12/25(日) 20:27:52.83
VC++は64bitのインラインアセンブラに対応してない
MASMを使うのであれば、
rax みたいに e の代わりに r をつけるのと、あとは r8〜r15 がある

関数コールでの最初の4個だっけ?の引数をレジスタ渡しするとか、
でもその分スタックを開けておかないといけないとか、
rsp を16バイト境界に揃えて call とか、
変更してはいけないレジスタが増えてるとか、64bit では色々癖があるので、
そのあたりもググるといいよ
961デフォルトの名無しさん:2011/12/25(日) 20:28:54.38
変更してはいけないというか、
関数コール前後で内容を維持しないといけないレジスタ、ね
962デフォルトの名無しさん:2011/12/25(日) 20:31:00.97
>>960
使えなかったのか・・・
サンクス
963デフォルトの名無しさん:2011/12/25(日) 20:38:49.50
MASMは多分インストールされてるので
インラインでない普通のアセンブラなら使える
拡張子 .asm にしてなんかちょっと設定いじれば使えたはず
964デフォルトの名無しさん:2011/12/25(日) 20:54:00.54
64bit asm使いたいならおとなしくg++つかっとけ
965デフォルトの名無しさん:2011/12/25(日) 21:33:11.83
http://codepad.org/534X04lx
こういうコードって安全ですか?
966デフォルトの名無しさん:2011/12/25(日) 21:48:53.71
試せよw
967デフォルトの名無しさん:2011/12/25(日) 22:39:08.33
mallocしてもいいのはPODのみだと思う
968デフォルトの名無しさん:2011/12/25(日) 22:40:10.00
>>965
どこが気になってるのかぐらい書けよ。

まあ、data[1] で宣言して、領域たくさん取るから data[10] とかでも大丈夫か?
ということだと思うが、ダメだったはず。
969デフォルトの名無しさん:2011/12/25(日) 23:51:32.78
Hogeの中で int data[1]; の後にpaddingで余計な領域が確保されてる可能性があるからな
970デフォルトの名無しさん:2011/12/25(日) 23:56:07.04
メンバにvector<int>を持てばいいだけの話のような気がするが
971デフォルトの名無しさん:2011/12/26(月) 00:02:34.29
int data[1]の後に余計なパディングがあってもHogeの配列にしないぶんには問題ないと思うけど
data[1]の後ろの追加領域のアラインメントも問題なく取れてるし
972デフォルトの名無しさん:2011/12/26(月) 01:17:09.15
関数にconst使う意味がわかりません

変数ならば、定義の変わりにローカルなスコープだけで使いたいときにconst使うかなーと思うんですけど
973デフォルトの名無しさん:2011/12/26(月) 01:27:20.98
>>972
T& this じゃなくて T const& this が欲しいんだよ。
974デフォルトの名無しさん:2011/12/26(月) 01:40:54.14
>>965
どこかで見た記憶があったがようやく思い出した。BITMAPINFOだ
[]演算子は結局のところアドレスのオフセット計算(*(data+n))だから、
オフセットしたアドレスがアクセス可能であることを担保できれば良いと

>>972-973
関数にconst使うってこっちじゃないの?(w

int hoge() const { ... }
      ~~~~~~
975デフォルトの名無しさん:2011/12/26(月) 02:14:01.19
こういう話じゃないの?(w
>>973がなぜ参照にしたのかはわからんけど

struct T{
int hoge() { this } // T*
int hoge() const{ this } // const T*
};
976デフォルトの名無しさん:2011/12/26(月) 08:18:18.41
const int f(const int)
これか
int (*const f)()
の事言ってんじゃないの?
メンバー変数へのconstとかコンパイルすりゃ
気づくような事を質問するとも思えん。
977デフォルトの名無しさん:2011/12/26(月) 10:11:18.33
>>974
Microsoft が決めた API で MSVC での動作保証がされているだけで、
一般的には data+n が配列範囲外を指すと未定義動作だからね。
(最後の要素の次を指す場合は * で参照するまでセーフだけど。)
978デフォルトの名無しさん:2011/12/26(月) 20:04:09.74
>>965
仮想関数を使わない限りはね。
因みにMSのclだったかg++だったか
両方だったか忘れたが長さ0の配列を作れる。
用途はあんたがしようとしてること。
979デフォルトの名無しさん:2011/12/26(月) 23:17:08.85
>>965
placement new 使え
これならコンストラクタが呼ばれるから仮想関数があっても安全に使える
デストラクトも忘れずに

オーバーロードされていないnewで確保したメモリは確か、
どのオブジェクトでもアラインメントが揃うアドレスが返されると保証されてたはずので
mallocよりoperator newを使った方が規格的に良い
(まあnewは大抵mallocそのままで実装されてんだろうけど)

あと、Delete の引数に const は必要ないというかあるべきじゃない
参照先を破壊するんだし・・・

どーでもいーけど、規格的には inline や void や return 0; は必要ない(あってもなくても同じ)
分かって敢えて書いてるのなら別にいいけどね

ttp://codepad.org/0g0HtQe2
980デフォルトの名無しさん:2011/12/27(火) 00:37:29.08
C++じゃreturnは省略できんぞ。規格違反。
981デフォルトの名無しさん:2011/12/27(火) 01:02:20.98
mainのreturnは省略可だろw
return 0; になる
982デフォルトの名無しさん:2011/12/27(火) 01:10:45.68
>>980
§3.4.4.5
A return statement in main has the effect of leaving the main function (destroying any objects with automatic
storage duration) and calling exit with the return value as the argument. If control reaches the end
of main without encountering a return statement, the effect is that of executing
return 0;
983デフォルトの名無しさん:2011/12/27(火) 01:14:27.00
アプリに一箇所、1行ぐらいケチらねーで書けよ
調べる労力のほうが無駄だわ
984デフォルトの名無しさん:2011/12/27(火) 01:15:38.41
逆ギレすんな
無知は恥
985デフォルトの名無しさん:2011/12/27(火) 01:45:58.07
>>978
仮想関数を使わなくても未定義動作になるよ。

>>979
placement new を使っても未定義動作になるよ。
oeprator new も malloc もアライメントの要求は同じだよ。
986デフォルトの名無しさん:2011/12/27(火) 01:56:00.86
仮想関数テーブルの位置はクラスの先頭か末尾かはコンパイラかなんかの自由じゃない?
先頭には先頭に書いたメンバがいる前提で外部からその先頭アドレスをいじって仮想関数テーブルぶっ壊してるのを見たことがある
987デフォルトの名無しさん:2011/12/27(火) 02:13:53.60
なんでmainのreturnだけ省略できるようにしたんだ?
全部省略できるようにするか全部できないように統一したら
>>982の文章少し短くできるんじゃないの
988デフォルトの名無しさん:2011/12/27(火) 02:19:59.25
>>987
ユーザー定義が前提となる関数で戻り値の型と意味が規格で定められていると言う点で
main() はとっても特殊。特別扱いしても何の不思議も無い。
989デフォルトの名無しさん:2011/12/27(火) 02:23:07.54
vtableは実装依存だね。
990デフォルトの名無しさん:2011/12/27(火) 02:28:17.64
そんな特殊性まったく必要ないってことだよ
991デフォルトの名無しさん:2011/12/27(火) 03:00:51.26
992デフォルトの名無しさん:2011/12/27(火) 03:42:25.11
>>990 お前がそう思うんなら(ry
993デフォルトの名無しさん:2011/12/27(火) 03:50:42.13
>>990
お前が必要でなかろうと、規格化されてるんだから事実なんだよ。
994デフォルトの名無しさん:2011/12/27(火) 09:16:27.15
規格の正当性に疑問を持ってる相手に規格だからって会話になってないな
995デフォルトの名無しさん:2011/12/27(火) 11:01:22.81
規格にはちゃんと意味があるってのに…。
人の話を聞かない奴が何を言ってるんだかね。
996デフォルトの名無しさん:2011/12/27(火) 11:28:54.23
規格にいちゃもん付けるのはC++標準化委員会の委員になってから言えと
997デフォルトの名無しさん:2011/12/27(火) 11:31:38.19
おまじないなんだよ
998デフォルトの名無しさん:2011/12/27(火) 11:49:00.09
ちなみに理由はmainが返す値がexitコードになるため、
未定義では困るので暗黙的return 0。
999デフォルトの名無しさん:2011/12/27(火) 11:56:46.73
>>996
C++標準化はオープンなプロセスでありそのような資格基準は存在しない。
文句があるならしかるべき場所ではっきりと言えばそれでいい。
1000小倉優子 ◆YUKOH0W58Q :2011/12/27(火) 11:57:49.78
  ∧,,,∧ 
 (  ・∀・) 1000ならジュースでも飲むか
  (    ) 
  し─J 
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。