C++相談室 part92
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2011/11/04(金) 01:58:02.00ただし質問の前には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
0002デフォルトの名無しさん
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)に対応。
0003デフォルトの名無しさん
2011/11/04(金) 01:59:43.54[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
0004デフォルトの名無しさん
2011/11/04(金) 02:00:25.16amazon C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
http://www.amazon.co.jp/b/?node=754384
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
0005デフォルトの名無しさん
2011/11/04(金) 02:01:09.37Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0006デフォルトの名無しさん
2011/11/04(金) 02:20:57.01http://codepad.org/
http://ideone.com/
0007デフォルトの名無しさん
2011/11/04(金) 07:40:38.35環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
地鎮祭終了>>1乙
0008デフォルトの名無しさん
2011/11/05(土) 12:49:24.510009デフォルトの名無しさん
2011/11/05(土) 19:50:36.17おつ
0010デフォルトの名無しさん
2011/11/05(土) 20:34:16.48http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
0011デフォルトの名無しさん
2011/11/05(土) 23:55:51.530012デフォルトの名無しさん
2011/11/06(日) 01:51:28.660013デフォルトの名無しさん
2011/11/06(日) 15:39:49.29愛玩用人工知能KAZAMAを開発して地下室で生活してたのがバレた。
0014デフォルトの名無しさん
2011/11/06(日) 21:20:47.23俺あいつの語り口がけっこー好みなんだが入門いらね
0015デフォルトの名無しさん
2011/11/06(日) 22:00:17.240016デフォルトの名無しさん
2011/11/06(日) 22:24:07.01英語英語がたがた抜かすな。
コードは世界共通だ。
恐れることはない。
0017デフォルトの名無しさん
2011/11/07(月) 00:09:55.730018デフォルトの名無しさん
2011/11/07(月) 00:56:46.360019デフォルトの名無しさん
2011/11/07(月) 01:50:25.19public:
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関数で再定義する以外に方法ある?
0020デフォルトの名無しさん
2011/11/07(月) 01:56:02.79てか、親classから派生classの関数を呼び出す処理は往々にして糞だ。
0021デフォルトの名無しさん
2011/11/07(月) 01:59:16.200022デフォルトの名無しさん
2011/11/07(月) 02:00:20.97意図してる方法かしらんけど、
Cの中で、A::B();とすれば、AのB()が呼ばれるようになる。
ただし、派生先がどうであれ、B()は常にAのB();が呼ばれてしまう。
あとは、テンプレを使って、Type::B()の形式で呼び出すとか。
0023デフォルトの名無しさん
2011/11/07(月) 02:35:35.29糞ですまん。
C関数の中のB関数以降は全く同じ処理だから楽出来るかなとおもいまして。
>>21
ネーミングは気にしないでくれ。
>>22
template<class Func>
void C(){
Func::B();
};
こんな形ですか?
0024デフォルトの名無しさん
2011/11/07(月) 07:37:16.19そのソースで意図した動作ができてると思うんだけど、何か気に入らないの?
http://codepad.org/ENTqMxOP
0025デフォルトの名無しさん
2011/11/07(月) 07:58:56.010026デフォルトの名無しさん
2011/11/07(月) 09:43:22.64仮想関数の意味ないんじゃねこれじゃ
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;
}
0027デフォルトの名無しさん
2011/11/07(月) 10:14:33.26そのコードでどんな動作を期待してて何がどう変なんだ?
0028デフォルトの名無しさん
2011/11/07(月) 10:19:48.840029デフォルトの名無しさん
2011/11/07(月) 10:22:07.44duplicate()がスマートポインタを返す設計で使えるかも?
0030デフォルトの名無しさん
2011/11/07(月) 11:04:13.010031デフォルトの名無しさん
2011/11/07(月) 11:04:28.61仮想関数ならb->putでDerivedの方のput()を呼び出してくれるんじゃないのかい
0032デフォルトの名無しさん
2011/11/07(月) 11:20:23.170033デフォルトの名無しさん
2011/11/07(月) 12:05:24.51putが仮想関数ならそうだが>>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"); }
};
0034デフォルトの名無しさん
2011/11/07(月) 12:55:35.63サンクス
なるほどduplicateではなくてputをNVIイディオムにしなければいけないのでした
やろうとしていた事はduplicateが返したthisからputを呼び出す事でした
勘違いしてたようです
0035デフォルトの名無しさん
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;
}
0036デフォルトの名無しさん
2011/11/07(月) 13:01:44.70struct 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;
}
0037デフォルトの名無しさん
2011/11/07(月) 13:01:48.66MayersがPDF売ってるよ
0038デフォルトの名無しさん
2011/11/07(月) 13:58:15.69duplicateをどういうものにしたいのかわからないけど(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;
}
0039デフォルトの名無しさん
2011/11/07(月) 14:54:27.17NVIと仮想関数の返す値を共変にするのを両立させたかったんです
やはり両立は無理ですかね?
0040デフォルトの名無しさん
2011/11/07(月) 17:14:17.92NVIは継承に関して不変だからムリだな
おとなしく仮想関数をインターフェースにしたほうがいいと思うよ
0041デフォルトの名無しさん
2011/11/07(月) 17:19:16.290042デフォルトの名無しさん
2011/11/07(月) 17:20:59.14いやここ見てたんですよ
http://d.hatena.ne.jp/tueda_wolf/20110125/p1
という事はこのブログは間違いですかね?
0043デフォルトの名無しさん
2011/11/07(月) 17:34:50.92もしもしなのでちょっと読んだだけだけど、これは単にそれっぽく隠蔽しただけなのでは……
仮想関数使った共変と振る舞いが一致しない場合があると思うんだけど
あと
>隠蔽(オーバーロード)
ってのは確実に誤りだな
0044デフォルトの名無しさん
2011/11/07(月) 17:43:46.05ありがとうございました
0045デフォルトの名無しさん
2011/11/07(月) 17:56:36.650046デフォルトの名無しさん
2011/11/07(月) 18:02:50.52どうせ返り値ってポインタだし、仮想関数で勝手に切り替えてくれるのですから
基底クラスへのポインタが返ればそれにNVIを適用すれば十分なはずです
0047デフォルトの名無しさん
2011/11/07(月) 23:12:21.62派生クラスメンバーの戻り値をコピーしたい場合。
Base b = object.OrverrideFunction(); //OrverrideFunctionは親の定義だとBase
Derived d = object.OrverrideFunction(); //共変の戻り値が使えないとコンパイルエラー
0048デフォルトの名無しさん
2011/11/07(月) 23:22:06.84そのobjectの型はDerivedなんでしょ?
だったら別にわざわざオーバーライドした関数呼ぶ必要ないじゃん
0049デフォルトの名無しさん
2011/11/07(月) 23:23:58.610050デフォルトの名無しさん
2011/11/07(月) 23:25:41.14struct Derived : Base {};
struct BaseObj { virtual Base & OverridedFunction(); };
struct DerivedObj { Derived & OverridedFunction(); };
DerivedObj object;
じゃあこういう状況?
0051デフォルトの名無しさん
2011/11/07(月) 23:27:19.72そういう話
0052デフォルトの名無しさん
2011/11/07(月) 23:35:22.88DerivedObjの型がわかってるなら仮想関数を使う必要性がないのでは?
まあべつに使ってもいいけどオーバーヘッド増えるからこうしたほうがいいでしょ
struct DerivedObj : BaseObj {
/*inline*/ Derived & NonOverrided();
virtual Derived & OverridedFunction() { return NonOverrided(); }
};
Derived d = object.NonOverrided();
0053デフォルトの名無しさん
2011/11/07(月) 23:40:32.75親クラスほっといて、子クラス単品で使う分にはオーバヘッドはない。
DerivedHolder object;
Deriverd d = object.OverrideFunction();
(BaseHolder*)にobjectを突っ込んでるわけじゃないのでインライン展開される
0054デフォルトの名無しさん
2011/11/07(月) 23:43:42.360055デフォルトの名無しさん
2011/11/08(火) 23:57:43.270056デフォルトの名無しさん
2011/11/09(水) 00:03:13.46他はあまり見ないな
0057デフォルトの名無しさん
2011/11/09(水) 01:20:06.02どういう原理か知らないけど。
0058デフォルトの名無しさん
2011/11/09(水) 01:25:44.270059デフォルトの名無しさん
2011/11/09(水) 01:51:38.78プライベートは「それを実装手段とする」
プロテクテッドは不明。
ってメイヤーが。
0060デフォルトの名無しさん
2011/11/09(水) 02:00:18.670061デフォルトの名無しさん
2011/11/09(水) 07:19:46.96メンバを公開しないだけじゃなく、
アップキャストとスライシングを禁止するために使える
0062デフォルトの名無しさん
2011/11/09(水) 09:57:08.590063デフォルトの名無しさん
2011/11/09(水) 10:36:30.86private に比べて何がうれしいの?
0064デフォルトの名無しさん
2011/11/09(水) 21:02:09.32class 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を継承しなくて済むようになる。
0065デフォルトの名無しさん
2011/11/09(水) 21:49:59.60公開したいメンバをpublicでusingすれば
あとはそのままアクセス制限を継承できるからじゃね?
まあさらに継承しない場合は関係ないだろうけど
0066デフォルトの名無しさん
2011/11/09(水) 23:49:04.92ごめん private との違いが見えてこない。
0067デフォルトの名無しさん
2011/11/10(木) 00:52:32.65そういや、あのusingって何のためにあるんだっけ?
単に 親クラス::メンバー; って書いても同じだよね。
0068デフォルトの名無しさん
2011/11/10(木) 00:55:15.03に対するしどろもどろな顛末が using
0069デフォルトの名無しさん
2011/11/10(木) 01:04:18.25そういやprotected継承だと孫クラスが、thisを親クラスを引数にとる関数に渡せるって点がある。
private継承だと、孫と親は同じオブジェクトだと解っててもキャストできない。
親クラスを取る関数に孫を渡したいが、外部からむやみに親にアクセスされたくない場合に多少つかえる。
0070デフォルトの名無しさん
2011/11/10(木) 01:10:10.38ん? 親クラス::メンバー; じゃ孫からは、メンバーとみなされないってこと?
0071デフォルトの名無しさん
2011/11/10(木) 01:14:06.20protected データメンバ並みに要らんな。
0072デフォルトの名無しさん
2011/11/10(木) 01:14:32.490073デフォルトの名無しさん
2011/11/10(木) 02:41:42.270074デフォルトの名無しさん
2011/11/10(木) 02:53:20.98protectedデストラクタは必要だろ
0075デフォルトの名無しさん
2011/11/10(木) 02:55:37.000076デフォルトの名無しさん
2011/11/10(木) 03:05:35.650077デフォルトの名無しさん
2011/11/10(木) 09:15:07.29方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
0078デフォルトの名無しさん
2011/11/10(木) 12:35:07.45そういうのをpublicにするの?おかしいだろう
派生クラスにだけ公開すると機能は明確だし。必要な時だけ使えばいいんだし
0079デフォルトの名無しさん
2011/11/10(木) 13:51:48.52もともと private と public しかなく、後付けで追加したトリビアなんだから
0080デフォルトの名無しさん
2011/11/10(木) 14:16:34.87でも継承をサブクラスに限定するノーコストの方法も無い
よってprotectedはゴミ
0081デフォルトの名無しさん
2011/11/10(木) 14:18:46.97仕方なく使うもの。汚いことを自覚した上で。
0082デフォルトの名無しさん
2011/11/10(木) 14:31:16.80よってprotectedは生ゴミ
0083デフォルトの名無しさん
2011/11/10(木) 15:27:21.24まあそうなんだけど、大人の事情でって事あるじゃん
0084デフォルトの名無しさん
2011/11/10(木) 16:51:43.310085デフォルトの名無しさん
2011/11/10(木) 17:37:38.180086デフォルトの名無しさん
2011/11/10(木) 17:39:30.310087デフォルトの名無しさん
2011/11/10(木) 17:40:12.71>>74-75
0088デフォルトの名無しさん
2011/11/10(木) 17:44:06.950089デフォルトの名無しさん
2011/11/10(木) 19:50:26.59protectedメンバをprotectedメンバのままにしておきたい場合に
protected継承する事になる、ということ
private継承すると、protectedメンバをprotectedメンバのままにするには
protectedなとこで全部usingしないといけなくなる
0090デフォルトの名無しさん
2011/11/10(木) 20:05:20.150091デフォルトの名無しさん
2011/11/10(木) 21:07:08.160092デフォルトの名無しさん
2011/11/10(木) 23:53:35.57public にすれば機能が不明確になったり、必要でもないのに無理やり使わされたりするような
言い方だけど、そんなことはないよね。
0093デフォルトの名無しさん
2011/11/11(金) 00:13:50.03そのネタは通じなかったみたいだな
0094デフォルトの名無しさん
2011/11/11(金) 00:29:47.00乙女心は難しいよな
0095デフォルトの名無しさん
2011/11/11(金) 00:35:47.41財産は子供にだけ渡したい。
私の財産はみんなの共有物じゃない。
中途半端?
継承なんだから、親子関係と強欲具合で考えればいいんだよ
0096デフォルトの名無しさん
2011/11/11(金) 00:40:12.46知らない誰かがいくつでも勝手に追加するものを「子供」だなどと考えるのは無理があるだろう。
0097デフォルトの名無しさん
2011/11/11(金) 01:05:29.24ファイルスコープ限定して子の制約は出来るが。
尤も。protectedの用途(protected継承に限らず)は、
子に抽象化関数を実装することを義務付けた上で
機能提供することだろうがな。
0098デフォルトの名無しさん
2011/11/11(金) 01:07:46.810099デフォルトの名無しさん
2011/11/11(金) 01:09:07.16ファイルスコープ内を信用するなら public でもいいじゃん。
0100デフォルトの名無しさん
2011/11/11(金) 09:14:19.38子には公開できて孫には公開しないとか簡単にできるし
protectedでは簡単に間違いが起こってしまう
0101デフォルトの名無しさん
2011/11/11(金) 13:21:00.130102デフォルトの名無しさん
2011/11/11(金) 14:29:00.390104デフォルトの名無しさん
2011/11/11(金) 16:29:07.030105デフォルトの名無しさん
2011/11/11(金) 19:32:10.07{
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!!
0106デフォルトの名無しさん
2011/11/11(金) 21:28:32.42メンバーに付けるprotectedは、親クラスじゃなく
子クラスを守るための物だろ。
子が生成したバッファを親に参照させるとかの用途には
friendじゃ代用品にならない。
0107デフォルトの名無しさん
2011/11/11(金) 21:32:12.810108デフォルトの名無しさん
2011/11/11(金) 21:53:14.61{
Channel channel;
public:
Derived()
{
Bind( &channe l);
}
};
Channel channel;
Derived object;
object.Bind( &channel ); //エラー
friendで似たことすると、
Channel channel;
Derived object;
Bind( &object, &channel ); //コンパイルが通ってアウト
そもそも用途が違う。どちらかが代用になるもんじゃない。
0109デフォルトの名無しさん
2011/11/11(金) 21:59:28.350110デフォルトの名無しさん
2011/11/11(金) 22:01:02.200111デフォルトの名無しさん
2011/11/11(金) 22:06:38.70{
friend class Derived;
private:
void Bind(C * c);
};
class Derived: private Base
{
C c;
public:
Derived() { Bind(&c); }
};
0112デフォルトの名無しさん
2011/11/11(金) 22:08:29.14子クラス制限してどうすんだよw
親を守ることが目的じゃないんぞ
0113デフォルトの名無しさん
2011/11/11(金) 22:11:35.76{
friend class Derived;
void Bind(X & x);
};
class Derived: Base<Derived>
{
X x;
public:
Derived(void) { Bind(&x); }
};
これで親も子も完全に守られてるのでprotectedの出番はない
0114デフォルトの名無しさん
2011/11/11(金) 22:11:50.18Socket, File, Pipe, Mail, 派生が出来るたびに追加すんのかい
派生クラスがいくら出来ても問題ないのに
0115デフォルトの名無しさん
2011/11/11(金) 22:14:31.91Base同士の互換性がなくなるな
0116デフォルトの名無しさん
2011/11/11(金) 22:14:35.18>>113
0117デフォルトの名無しさん
2011/11/11(金) 22:19:35.82protected:
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にしとけばこんなことはなかったのにな
0118デフォルトの名無しさん
2011/11/11(金) 22:19:59.05バイナリ肥大するだけじゃん
friendに拘って何がしたいの?
0119デフォルトの名無しさん
2011/11/11(金) 22:22:25.26子が守られようとしてるのに、何で子に自殺させてんの?バカなの?
0120デフォルトの名無しさん
2011/11/11(金) 22:25:33.04わかってねーな
自殺させちゃうカスグラマがどこに潜んでるかわからねーのが現場の怖いところだろうが
とにかくまずい事は簡単にはデキないようにすることが至上命令だ
0121デフォルトの名無しさん
2011/11/11(金) 22:26:00.030122デフォルトの名無しさん
2011/11/11(金) 22:27:41.70困るのはUnkoなだけで、
他は困らんから大した問題じゃない。
0123デフォルトの名無しさん
2011/11/11(金) 22:30:37.56{
C c;
public:
Unko(void){ Bind(&c); }
};
どうすんだこれprotectedとか危険過ぎる
0124デフォルトの名無しさん
2011/11/11(金) 22:34:49.630125デフォルトの名無しさん
2011/11/11(金) 22:37:19.85ベースを根元まで熟知してないと安全に継承できないとかどんだけ馬鹿な設計なんだよ
0126デフォルトの名無しさん
2011/11/11(金) 22:41:36.920127デフォルトの名無しさん
2011/11/11(金) 22:43:56.82protectedなんて使うバカは放置が最善策だわ
0128デフォルトの名無しさん
2011/11/11(金) 22:45:12.250129デフォルトの名無しさん
2011/11/11(金) 22:45:15.58class Derived:public Base
{
Channel channel;
Base::Bind;
public:
Derived()
{
Bind( &channe l);
}
};
0130デフォルトの名無しさん
2011/11/11(金) 23:06:42.03詰んだな
0131デフォルトの名無しさん
2011/11/11(金) 23:16:47.29>>117に対処できない半端な対応
friendには1歩及ばないな
0132デフォルトの名無しさん
2011/11/11(金) 23:21:54.95Unkoからアクセスできなくなるわけだけど、言語仕様解ってんの?
0133デフォルトの名無しさん
2011/11/11(金) 23:26:02.15適当なこと言うな
0134デフォルトの名無しさん
2011/11/11(金) 23:36:57.380135デフォルトの名無しさん
2011/11/11(金) 23:43:48.77これからはprotectedを使いまくります
protected最高ですね
protectedのない生活は今後考えられません
protectedを使わない奴は情弱ですね
0136デフォルトの名無しさん
2011/11/11(金) 23:47:18.14方法はいくつもあるのにシンプルに済むことを
ひとつの方法に拘って複雑にしなけりゃいい
0137デフォルトの名無しさん
2011/11/12(土) 04:56:57.680138デフォルトの名無しさん
2011/11/12(土) 09:27:49.77char* s;
s = {1,2,3,4}
が、エラー: assigning to an array from an initializer list になるのですが
以前のバージョンだと出ませんでした。
仕様が変わったのでしょうか
0139デフォルトの名無しさん
2011/11/12(土) 09:57:16.490140デフォルトの名無しさん
2011/11/12(土) 12:23:20.07似たような表記で書くにはどうすればいいですか?
0141デフォルトの名無しさん
2011/11/12(土) 12:48:44.36a = { 1, 2, 3 };
0142デフォルトの名無しさん
2011/11/12(土) 12:48:54.720143デフォルトの名無しさん
2011/11/12(土) 13:00:45.740144デフォルトの名無しさん
2011/11/12(土) 13:03:01.810145デフォルトの名無しさん
2011/11/12(土) 18:09:26.37VCは提案却下
0146デフォルトの名無しさん
2011/11/12(土) 18:33:38.94文字列はできてたけどC++11で禁止された
0147デフォルトの名無しさん
2011/11/12(土) 20:39:39.30関数内で作られる、無名一時オブジェクトはどのメモリ領域に格納されるんでしょうか?
スタック、ヒープ/フリーストア、静的領域?
つまるところ、↓の f() と g() では、どっちが速いんでしょうか?
ttp://ideone.com/PJ75c
0148デフォルトの名無しさん
2011/11/12(土) 20:42:54.25実装依存だがどちらもスタックになるだろう。
その前になぜ自分で測定しない?
0149デフォルトの名無しさん
2011/11/12(土) 20:43:59.820150デフォルトの名無しさん
2011/11/12(土) 20:47:56.91無名オブジェクトはスタックに作られる。
同じか、fがムーブ可能な場合速くなる可能性がある
0151デフォルトの名無しさん
2011/11/12(土) 20:51:26.800152デフォルトの名無しさん
2011/11/12(土) 21:10:36.69そのコードだと完全にコンパイラ次第。
同じコンパイル単位にある関数はinline指定子の有無を無視して
インライン展開するコンパイラが多い。
0153デフォルトの名無しさん
2011/11/12(土) 21:16:39.50gでXをstatic constしといたらもっと早いんじゃね?とか思ったけどどうなんだろ
0154デフォルトの名無しさん
2011/11/12(土) 22:01:28.160155デフォルトの名無しさん
2011/11/12(土) 22:09:38.520156147
2011/11/12(土) 22:13:49.42>>150
確かに、ムーブを考えると無名一時オブジェクトの方が、速くなる可能性がありますね
盲点でした
コンパイラの最適化と、ムーブに期待して、無名一時オブジェクトで書くことにします
皆さん、アドバイスありがとうございました
0157デフォルトの名無しさん
2011/11/12(土) 22:14:27.390158デフォルトの名無しさん
2011/11/12(土) 22:23:20.310159デフォルトの名無しさん
2011/11/12(土) 22:27:18.96大まかな傾向だけ理解して書ける方が偉いわ
0160デフォルトの名無しさん
2011/11/12(土) 22:42:36.420161デフォルトの名無しさん
2011/11/12(土) 22:45:47.830162デフォルトの名無しさん
2011/11/12(土) 22:46:03.16理屈上そうなるから多分そうなるだろうじゃ根拠が薄いだろ。
0163デフォルトの名無しさん
2011/11/12(土) 23:28:01.59あくまで規格表に従えよ。
でないとVCみたいなクソコンパイラのクソ独自仕様に惑わされて
可搬性のない(次のアップデートで反故にされかねない)クソコードを量産する
クソプログラマになっちまうぞ、クソ。っていうかクソVCをクソ捨てればクソ済むんだけどね/(^o^)\
0164デフォルトの名無しさん
2011/11/12(土) 23:32:25.250165デフォルトの名無しさん
2011/11/12(土) 23:40:59.79実験で何を調べようとしているのかの論点も違っていそうだな
本番ではなく「実験」では規格合致度に重きをおく
合致度の低いコンパイラや、合致度はそこそこでも現にバグを見つけたりしたとき
クソっていう対象がコンパイラな単純低次元はどっかいけ
目の前の現実への自分の対応をクソと謙虚に自省する人には助太刀いたすかって気にはなる
0166デフォルトの名無しさん
2011/11/12(土) 23:56:25.79コンパイラの動作を観察するしかねぇだろボケ
0167デフォルトの名無しさん
2011/11/13(日) 00:12:09.680168デフォルトの名無しさん
2011/11/13(日) 00:29:52.340169デフォルトの名無しさん
2011/11/13(日) 01:03:35.760170デフォルトの名無しさん
2011/11/13(日) 01:04:54.550171デフォルトの名無しさん
2011/11/13(日) 01:43:51.900172デフォルトの名無しさん
2011/11/13(日) 02:17:20.690173デフォルトの名無しさん
2011/11/13(日) 03:42:53.05そのコードが最適化され易いかどうかは共通だぞ
0174デフォルトの名無しさん
2011/11/13(日) 07:04:48.48mfcが糞で、c++11に準拠する気がまるで無いだけで、コンパイラとしては速いコード吐く方
0175デフォルトの名無しさん
2011/11/13(日) 11:04:12.44Qt触るとMFCが汚物過ぎて受け付けん。
0176デフォルトの名無しさん
2011/11/13(日) 11:21:03.59マイクロソフトがまだテンプレートにもダイナミックキャストにも
否定的だった時代に作られたものらしいし。
0177デフォルトの名無しさん
2011/11/13(日) 11:42:03.360178デフォルトの名無しさん
2011/11/13(日) 15:32:48.490179デフォルトの名無しさん
2011/11/13(日) 15:46:00.90薄いどころかがっつりフレームワークだと思うけど。
0180デフォルトの名無しさん
2011/11/13(日) 15:52:01.24MSはまだやる気まんまんじゃないか。
0181デフォルトの名無しさん
2011/11/13(日) 16:22:46.420182デフォルトの名無しさん
2011/11/13(日) 16:32:00.370183デフォルトの名無しさん
2011/11/13(日) 16:57:00.85ロクな枠組みが無いんだからフレームワークは言い過ぎ。
あくまでC++用ラッパーの域は出ないよ。
0184デフォルトの名無しさん
2011/11/13(日) 21:57:28.34vc++とかでプロジェクトの設定をする時に
includeのパスを通すのは分かるんですが
libにパスを通す意味ってなん何でしょうか
0185デフォルトの名無しさん
2011/11/13(日) 21:58:13.23これらは使い方が分かるんだけど
MFCだけわけがわからない
0186デフォルトの名無しさん
2011/11/13(日) 22:06:28.67ヘッダファイルじゃなくてライブラリのディレクトリパスを指定する
0187デフォルトの名無しさん
2011/11/13(日) 22:06:42.39これ読めば、大分分かるようになる
標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング
http://www.amazon.co.jp/gp/product/4881357042
0188デフォルトの名無しさん
2011/11/13(日) 22:10:06.49ありがとうございます。
ライブラリのファイルを読んでくることの必要性というのは何なのでしょうか
includeは、
#include <stdio.h>
などでよく使うので馴染みがあるのですが
初心者ゆえライブラリというものをどういう時に使うのかが分からないのです。
0189デフォルトの名無しさん
2011/11/13(日) 22:10:57.61【初心者歓迎】C/C++室 Ver.76【環境依存OK
http://hibari.2ch.net/test/read.cgi/tech/1312621728/
0190デフォルトの名無しさん
2011/11/13(日) 22:18:07.28すみません
ではそちらで質問させて頂きます
0191デフォルトの名無しさん
2011/11/13(日) 22:43:09.25ライブラリを使いたい時に使う、としか
DXライブラリでも使ってみれば?
0192デフォルトの名無しさん
2011/11/13(日) 22:50:05.42コンパイルとリンクの区別がつかないと理解できないかもね
ヘッダーファイルはコンパイル時に必要になるもの。
ライブラリはリンク時に必要になるもの。
ヘッダーは宣言が書いてあり(そうとは限らないが)、ライブラリーにはその実装が記述されてる。
ヘッダーとライブラリーは直接関連付けられているものじゃないから、
どちらか片方指定したからといって、もう一方が自動で取り込まれることはない。
0193デフォルトの名無しさん
2011/11/14(月) 00:15:18.58その本昔持ってた
古い本だしもうMFCは使わんと思って
処分してしまったわ
0194デフォルトの名無しさん
2011/11/14(月) 01:14:02.79土台のシステムとやり取りする実行時環境とかリンカとかローダとかの
話を昔の人はわかってたから話省略してるんだけどこのへんの知識がないと
コンパイルエラーを潰すことは絶対にできない。多重定義とかそのへんのやつね。
自分もC++いじり始めた時スゲー苦労した。基本的にC++本に書いてないんだもの…
0195デフォルトの名無しさん
2011/11/14(月) 04:59:44.72セッターの引数の型とゲッターの戻り値の型は何にすればいい?
現状、メンバ変数が shared_ptr であっても weak_ptr であっても
const shared_ptr<Hoge> & 型の引数を持つセッターで設定、
shared_ptr<Hoge> 型の戻り値で取得できるようにしている(this->pHoge.lock() を返している)んだけど、これってアリかな?
0196デフォルトの名無しさん
2011/11/14(月) 05:43:53.92「メンバ変数に対するアクセッサ」なんて考えるんじゃなくて、
使う側から見て自然で使いやすいインターフェースを考えるんだ。
普通は weak_ptr を持つかどうかを使う側に意識させないほうが
いいんじゃないかな?
0197デフォルトの名無しさん
2011/11/14(月) 08:42:11.84shared_ptrは所有物を返すために使い、
weak_ptrは参照するために使う。
値を返すのにweakは無いと思う。
有効かどうか解らない戻り値を
そこらじゅうでチェックすんのも効率悪いし。
0198デフォルトの名無しさん
2011/11/14(月) 09:38:05.950199デフォルトの名無しさん
2011/11/14(月) 10:02:54.72うーん無いと思いますね…。
shared_ptrを返しますが、それは有効かもしれないし無効かもしれません。
十分注意してチェックして使ってくださいね。ってことになるでせふ。
それならそのままweak_ptrを返すほうがまだミスの恐れがなくていいと思うのだけど。
0200195
2011/11/14(月) 12:28:24.78class 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を取得できることが条件
0201デフォルトの名無しさん
2011/11/14(月) 12:43:27.950202195
2011/11/14(月) 23:14:19.76�Aの戻り値から得たshared_ptrをどこかで長期的に保存(共有)しても構わない
どのみち、weak_ptrを返してもそれを制限する術は無いだろうし
0203デフォルトの名無しさん
2011/11/14(月) 23:19:56.99あんた自身の意見がよくわからん。
shared_ptr を返すことで何か不満なのか?
0204195
2011/11/15(火) 00:18:39.79shared_ptrを返す自分のコードに賛成できないというレスがあるので、
というか設計が間違っているという意見あるので、そういった意見の内容を知りたいです。
0205デフォルトの名無しさん
2011/11/15(火) 00:38:13.43どこのスレから来たの?
0206デフォルトの名無しさん
2011/11/15(火) 00:44:09.06shared_ptr に問題があるとしているのは >199 だけだな。
ヌルを返したくないなら例外投げるなりすればチェック漏れも無いんだから、
あんまり有用な意見だとは思わないね。
設計が〜っていうのは、先に実装ありきでインターフェースを後から考えてるのが
ダメっていう一般的な話。具体的なコードを指して言ってるんじゃない。たぶん。
0207デフォルトの名無しさん
2011/11/15(火) 02:01:09.51・HogeContainerはshared_ptrを介してHogeを所有してるがそれは他の何かにもHogeの所有(共有)を許すということだ。
とすると複数のHogeContainerが単一のHogeを所有することもありえるがHogeのOwnerには一つしかなれない。
・そもそもHogeからHogeを所有してるHogeContainerが直接わかる事に意味はあるのか?
HogeContainerからHogeを解放したいとかの用途ならHogeに専用の関数を個別に用意すべきではないか?
0208デフォルトの名無しさん
2011/11/15(火) 02:23:46.060209195
2011/11/15(火) 02:42:46.47>・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()に意味は無いのかと問いたい
0210デフォルトの名無しさん
2011/11/15(火) 05:45:16.780211デフォルトの名無しさん
2011/11/15(火) 08:30:09.48イテレータ回してるときに抜けられるとコンテナの種類によってはバグになるし
生存フラグを使う方法のほうがいいよ。ダサイけど
0212デフォルトの名無しさん
2011/11/15(火) 08:56:50.10それは個々の要素自体がコンテナの管理者でもある場合で要素と要素の管理者が異なる場合とは違う。
STLコンテナだとイテレータから前後の要素はわかってもコンテナ自体はわからないだろ。
0213195
2011/11/15(火) 09:46:46.27そこら辺は要考慮だが、イテレータを使用している最中にコンテナの要素を削除して問題あるのはvectorぐらいだし、
そもそもフラグを使用しても今度はいつコンテナから要素を削除するのか問題になる
>>212
要素!=要素の管理者であっても、違っていても、どちらも親(管理者)が欲しい時はあるんじゃないか?
前者は、例えばC#の話になるが、DataTableクラスはDataSetプロパティ(属するDataSet、つまりは親を取得する)がある訳で
後者は自分の例でのHogeクラスを削除して、HogeContainerクラスに置き換えたものになる
だがちょっと待ってほしい。自分が質問した内容は>>200な訳で、
�@ = const shared_ptr<Hoge> &
�A = shared_ptr<Hoge>
は問題ないということで宜しいか?
0214デフォルトの名無しさん
2011/11/15(火) 09:56:16.53ぶっちゃけそんな細かいところどうでもいいから好きにすればいいよ
0215デフォルトの名無しさん
2011/11/15(火) 10:37:22.61> 要素!=要素の管理者であっても、違っていても、どちらも親(管理者)が欲しい時はあるんじゃないか?
そういう時があることは否定はしない。
しかしコンテナ自体(管理者)を操作(コンテナから要素の値のコピーや参照を取得)する権利があるものと
取得した値を利用するだけの権利しかないものとをはっきり分離して使い分けたほうが良いときも多い。
container c;
fuga(c.firstnode());
みたいな時にfugaにコンテナを操作する権利(コンテナそのものや他の要素の削除なんかも自由自在)を
与えることになり得る設計は一般的にあまり望ましくないだろう。
0216デフォルトの名無しさん
2011/11/15(火) 10:48:15.64それに対してアレコレするってダサいと思う
0217デフォルトの名無しさん
2011/11/15(火) 10:56:09.690218デフォルトの名無しさん
2011/11/15(火) 11:17:39.88違うと思うな
0219195
2011/11/15(火) 11:43:14.12> コンテナ自体(管理者)を操作(コンテナから要素の値のコピーや参照を取得)する権利があるものと
取得した値を利用するだけの権利しかないものとをはっきり分離して使い分けたほうが良いときも多い。
そこら辺は使い分ける。問題ない
>>200の、本筋の質問のための例では非constではないOwnerへの参照を取得できるようになっているだけだ
>>216
その説明だと"ダサい"に当てはまる範囲が大きすぎね?
0220デフォルトの名無しさん
2011/11/15(火) 11:55:30.030221片山博文MZ
2011/11/15(火) 13:29:45.450222デフォルトの名無しさん
2011/11/15(火) 16:21:07.570223デフォルトの名無しさん
2011/11/15(火) 17:45:23.690224デフォルトの名無しさん
2011/11/15(火) 18:02:28.650225デフォルトの名無しさん
2011/11/15(火) 18:04:10.170226デフォルトの名無しさん
2011/11/15(火) 18:28:11.47実際に使うのがあの設計だったらいくらなんでも拙いだろ
0227デフォルトの名無しさん
2011/11/15(火) 18:29:56.320228デフォルトの名無しさん
2011/11/15(火) 18:37:04.83delete [] test;
って書き方でいいですよね?
このtestっていうのは、あるクラスを動的確保した配列名なんですが、間違ってますか?
もしかして自分で作ったクラスはこの解放の仕方使えないとかですか?
リークしてるのは、crtdbg使って調べました
0229デフォルトの名無しさん
2011/11/15(火) 18:40:41.270230デフォルトの名無しさん
2011/11/15(火) 18:40:43.72このクラスをラップしてるクラスを解放してませんでした☆
忘れてください☆
0231デフォルトの名無しさん
2011/11/15(火) 20:05:57.15これみて思い出した。
GCCで明示的にデストラクタを呼び出したオブジェクトに
再度アクセスしたら落ちた。
デストラクタでメモリー解放とかしてなかったんだけど
なんで落ちたかな。
昔の事なんで状況をはっきり思い出せん。
0232デフォルトの名無しさん
2011/11/15(火) 21:22:08.73VC++2010か2008のソリューションファイルやプロジェクトファイルごと
誰かに配布した場合、そのファイルからユーザ名とかがばれる可能性ってありますか?
0233デフォルトの名無しさん
2011/11/15(火) 21:32:51.030234デフォルトの名無しさん
2011/11/15(火) 22:00:17.970235デフォルトの名無しさん
2011/11/15(火) 22:27:18.87試しにexeの中サーチしてみたけど入ってないみたいだけど?
0236デフォルトの名無しさん
2011/11/16(水) 00:13:40.990237デフォルトの名無しさん
2011/11/16(水) 00:29:18.57>>235-236
http://2chnull.info/r/tech/1303092297/831-845
0238デフォルトの名無しさん
2011/11/16(水) 00:54:35.52いまだにそんな珍妙なもん作ろうとしてるやつがいるのか。驚きだわ。
0239デフォルトの名無しさん
2011/11/16(水) 01:02:11.35質問です。
以下のようなコードを書きました。。
ttp://ideone.com/n4aAH
ランダム内容のファイルを吐くだけのコードです。
これの乱数の初期化コードにstdlibの乱数をつかっているのですが、今風だとどういう初期化がいいんでしょうか。
このようにしたのは、ある程度乱数をコントロールして吐かせたいと思ったからですが、今時stdlibの乱数を使うのは無いだろうとおもったんです。
どう修正すればいいかお知恵をお貸しください。
あと、なぜそうなのかをご教示くだされば幸いです。
0240239
2011/11/16(水) 01:04:38.55ttp://ideone.com/n4aAH
0241デフォルトの名無しさん
2011/11/16(水) 01:11:11.010243デフォルトの名無しさん
2011/11/16(水) 01:16:56.88rand は今でも変わらず動くし、同じ動作をする新しいインターフェースは用意されていないから。
0244デフォルトの名無しさん
2011/11/16(水) 01:21:17.71線形合同法などは色々不具合が指摘されていますが、
乱数を初期化するための乱数としては問題ないという判断ですか?
0245デフォルトの名無しさん
2011/11/16(水) 01:32:23.23判断っていうか、実際に使う乱数は MT から取り出してるんだから
線形合同法の問題は関係無いでしょ。
そういう意味では seed_seq の生成にわざわざ rand を使っている意味も不明。
std::vector<uint_least32_t> Seeds(1, 0) で初期化するのと意味的に同じじゃない?
0246デフォルトの名無しさん
2011/11/16(水) 01:38:12.30ある程度の質を壊さず、1変数で多様でランダムな内容を吐きたかったのですが、
同じ数字の羅列で初期化しても、質を壊さないで乱数が取れるのでしょうか?
それならそれで非常に助かるのですけど。
MT自体を本格的に触ったのが今日はじめてなので感覚がつかめてないのです。
0247デフォルトの名無しさん
2011/11/16(水) 01:38:53.600248デフォルトの名無しさん
2011/11/16(水) 01:46:11.70それはstdlibのrand()を使うことに対してですか?
0249デフォルトの名無しさん
2011/11/16(水) 02:01:14.91試せよ。
seed_seq を使えば適当にビットを引っ掻き回した値で初期化されるから、
与えた初期値から想像できるような単純な結果にはならないはず。
http://msdn.microsoft.com/ja-jp/library/ee462311.aspx
0250デフォルトの名無しさん
2011/11/16(水) 02:21:32.40シード生成用なのか、なんか色々やってますね。ふむふむ。
って、ん・・・??
for (k = 0; k < n; ++k) first[k] = 0x8b8b8b8b
これをやってるっていうことは、初期値がどのような値にもかかわらず、
定数で初期化されて、ランダム要因は配列の長さだけになってる気がします。
ちゃんと読めてないけど、割りと納得できました。
杞憂だったんだと思って割りきってみます。
回答者の方。非常に勉強になりました。
ありがとうございました!!
失礼します。
0251デフォルトの名無しさん
2011/11/16(水) 03:13:20.530252デフォルトの名無しさん
2011/11/16(水) 03:23:56.570253デフォルトの名無しさん
2011/11/16(水) 04:30:04.35エラーが出てるのは使い方が間違ってるぞ
それかン簡単に済ませたいのならアルゴリズム辞典の乱数の改良とか
http://oku.edu.mie-u.ac.jp/~okumura/algo/archive/
の中の
algo.lzhをDLし、中のimprove.cを使うとか、整数の一様乱数
whrnd.cとかkrnd.cとか
0254デフォルトの名無しさん
2011/11/16(水) 04:45:04.34奥村の人か。この人のアルゴリズム本持ってる!!でも、読み解けては無い!
まー、それはいいとして。
>>240 のコードはVC10EEでは普通に実行できるのよ。
MSのことだから、何かがズレてるのだろうけど。
で、自分はMS環境だから自分の用事は済んだんだ。
でも、紹介してくれてありがとう!!ちょっと読んでみるよ。
0255254==239
2011/11/16(水) 04:57:22.52ちゃんと区切りがあってC++のクラス化しやすそうだ。
乱数をクラスにするとすごい便利なんだよな。ゲームとかゲームとかゲームとか。
今日はもう寝るので明日余裕があったらもうちょっと読んでみます。。
0256デフォルトの名無しさん
2011/11/16(水) 06:17:57.70コンパイルエラーになったんだろ
0257デフォルトの名無しさん
2011/11/16(水) 11:39:44.29class 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の方は初期化忘れや初期化順の混乱とかがおこるかもしれませんが、ファイル名はアプリケーションで指定できるので競合しません
どっちがいいんでしょうか
0258デフォルトの名無しさn
2011/11/16(水) 15:56:36.13Fuga::Load() をいつ呼び出すのか ?
そもそも、Hoge と Fuga には「ファイル名を内側で用意する/外から与える」のほかにも
差があるよん。
0259デフォルトの名無しさん
2011/11/16(水) 19:30:32.470260デフォルトの名無しさん
2011/11/16(水) 19:34:43.370261デフォルトの名無しさん
2011/11/16(水) 19:54:35.74幼稚園からやり直せ
0262デフォルトの名無しさん
2011/11/16(水) 19:58:36.91I/Oや副作用中心なわけでもなく
再利用性が下がるばっかりなのにバカじゃねぇの。
0263デフォルトの名無しさん
2011/11/16(水) 20:02:23.70アホですなぁ
0264デフォルトの名無しさん
2011/11/16(水) 20:04:09.60再利用するわけもないものまでそんな事するのは無駄なだけ
0265デフォルトの名無しさん
2011/11/16(水) 20:17:45.08下みたいなのはよくつかう。ただしグローバルにはしない。
設定ファイル名は実行ファイルの名前使っとくのが無難。
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 );
0266デフォルトの名無しさん
2011/11/16(水) 20:19:03.74設定自体は使い捨てなんだよ。
最利用するのはロジック部。
設定がロジックに入れ込むと取り外して再利用するのが難しくなる。
0267265
2011/11/16(水) 20:22:01.700268デフォルトの名無しさん
2011/11/16(水) 20:26:34.58hoge h(f.make());
0269デフォルトの名無しさん
2011/11/16(水) 21:07:39.60再利用を見越したものは当然そうだろう
そういう物はそもそもライブラリ化しておく
0270デフォルトの名無しさん
2011/11/16(水) 22:17:11.96string でも wstring でも食っちまうんだぜ?的なカスタムの cout、ofstream を作ろうと一念勃起したんだけど
アルゴリズムに渡したり汎用マニピュレータを挿入したりできるようになるためには
template< charT, char_traits< charT > > ... の形になってないといけなくて、
それはつまり標準の特殊化をせよということで、じゃあとりあえず fstream でもと思ったら
それは basic_ofstream の特殊化であり、 basic_stream であり basic_ios の特殊化であり
そもそも最低限 char_traits の特殊化が必要な気配でありなんであり…もう、頭がフットーしそうだよおっっ。
なんか、良い文献知りませんか(´・ω・`)
0271デフォルトの名無しさん
2011/11/16(水) 22:17:25.74>そういう物はそもそもライブラリ化しておく
何を持ってライブラリと書いてるのか解からんが、
仮にライブラリを他のプログラムと共有するコードだとすると、
再利用できるからってライブラリに突っ込めんだろ。
ブラウザのタブやら、モデリングツールのビュー、DTMツールのビュー
そういったビュー系のオブジェクトをライブラリ化することはあまりない。
そのビュー自体がプログラムのアイデンティテであるし、拡張の対象になるから
枯れたものとしてライブラリに追加するのは難しい。
ビューの他にもシーケンス制御のノードとかコマンド系オブジェクトも同じ傾向にある。
0272デフォルトの名無しさん
2011/11/16(水) 23:19:14.29Boost.Iostream あたりで楽にならんのかな?
0273デフォルトの名無しさん
2011/11/16(水) 23:27:30.76別に共用する必要は無い
改造して再利用するにしても、分離されてると色々と楽よ
0274デフォルトの名無しさん
2011/11/16(水) 23:30:39.320275デフォルトの名無しさん
2011/11/16(水) 23:53:11.520276デフォルトの名無しさん
2011/11/16(水) 23:56:39.02わかりました、ソース読んでみます。どもども。(´・ω・`)
0277デフォルトの名無しさん
2011/11/17(木) 00:43:49.70.libか.dllにするって言ってる?
0278デフォルトの名無しさん
2011/11/17(木) 01:47:51.32weak_ptr.lock()を呼び出すタイミングはどうしたらいい?
その度に呼び出していたら速度的に損だし、分岐も増えて、嫌だ
処理の初めにweak_ptr.lock()を呼び出して、取得したshared_ptr<Type>を他のdequeとかにつっ込んで、それに対して処理を行い、
処理が終わったそのdequeなりを空にする
こんな方法は間違ってないんだろうか
0279デフォルトの名無しさん
2011/11/17(木) 01:50:18.16> 処理の初めにweak_ptr.lock()を呼び出して、・・・
処理の初めに"全ての要素の"weak_ptr.lock()を呼び出して
0280デフォルトの名無しさん
2011/11/17(木) 07:10:33.55それでいいんじゃない?
0281デフォルトの名無しさん
2011/11/17(木) 08:48:44.670282デフォルトの名無しさん
2011/11/17(木) 13:35:10.63クラスを自作するなら、
operator<< の中で reinterpret_cast すれば終わりじゃね?
0283デフォルトの名無しさん
2011/11/18(金) 00:12:17.86レスありがとう
とりあえずこのまま進めてみるよ
0284デフォルトの名無しさん
2011/11/18(金) 16:33:51.11返り値の構築→スコープ抜けるの順番でいいの?
例えば
Obj func() {
try { Obj obj; return obj }
catch(...) { /*...*/; }
}
と書いてreturn時のコピーコンストラクタで例外が発生したらキャッチされると保証されてる?
0285デフォルトの名無しさん
2011/11/18(金) 19:47:27.97コピーコンストラクタ自体動かないので
あまり考えた事無いな・・・
0286デフォルトの名無しさん
2011/11/18(金) 20:09:37.070287デフォルトの名無しさん
2011/11/18(金) 20:19:19.100288デフォルトの名無しさん
2011/11/18(金) 20:50:07.17仕様が気になるなら仕様見たら?
0289デフォルトの名無しさん
2011/11/18(金) 21:08:45.26さらに昔にやったときはされなかった気もするが
0290デフォルトの名無しさん
2011/11/18(金) 21:15:44.25ideoneコンパイル終わらない。。
ttp://ideone.com/QRPa5
0291デフォルトの名無しさん
2011/11/18(金) 21:25:55.97ttp://ideone.com/6Ylmh
0292デフォルトの名無しさん
2011/11/18(金) 21:44:20.610293デフォルトの名無しさん
2011/11/18(金) 22:02:46.960294デフォルトの名無しさん
2011/11/18(金) 22:21:56.39>> (略)
>> A return statement can involve the construction and copy or move of a temporary object (12.2).
これはreturnに書いた式の評価とは別の話で関数の返却値となる一時オブジェクトについての話とみるのが自然だろう。
0295デフォルトの名無しさん
2011/11/19(土) 16:23:24.810296デフォルトの名無しさん
2011/11/20(日) 12:23:13.94Hoge(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() に価値はありますか?
0297デフォルトの名無しさん
2011/11/20(日) 12:24:29.26正:void SetPiyo(Piyo * pPiyo) { this->pPiyo = pPiyo; }
0298デフォルトの名無しさん
2011/11/20(日) 13:27:50.82それだけの内容で判断するのは無理。
しかし↓こっちのスレならなんとかしてくれるかもしれない。
http://hibari.2ch.net/test/read.cgi/tech/1187922645/
0299デフォルトの名無しさん
2011/11/20(日) 18:29:08.390300デフォルトの名無しさん
2011/11/20(日) 18:46:21.72assertじゃなく、NULLなら何もしないか例外を投げるのが普通じゃ
まあ、速度的な要請からassertにしてるのなら仕方が無いが
0301デフォルトの名無しさん
2011/11/20(日) 18:58:46.340302デフォルトの名無しさん
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 されてしまっても構いません
0303デフォルトの名無しさん
2011/11/21(月) 16:10:26.31NULLがセットできたり、IsValid()があるってことは
無効という状態がありうる、もしくは容認する、とオレが使う側だったら考えるが
Hoge::Fuga()呼び出したらエラーも返さずにabortするってことだよね?
一貫性が無く他人がHogeを使う事を考えていない設計だね
0304デフォルトの名無しさん
2011/11/21(月) 17:01:56.79> Hoge::Fuga()呼び出したらエラーも返さずにabortするってことだよね?
それはリリース時の動作です
>>296 では、デバッグ時に assert() が呼び出されます
Fuga() は google C++ スタイルガイドでいうところの、サフィックスに "OrDie" を付ける関数となります
0305デフォルトの名無しさん
2011/11/21(月) 17:25:22.92そうすりゃ動かなくても戻り値チェックしてないお前が悪いで通る
0306デフォルトの名無しさん
2011/11/21(月) 18:46:55.84std::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とか禁止したいのです。
継承するとか委譲を使って、ラップするしかないでしょうか?
0307デフォルトの名無しさん
2011/11/21(月) 18:50:49.47for(int i(0); i != N; ++i) {
v[i].init();
}
0308デフォルトの名無しさん
2011/11/21(月) 19:45:54.640309デフォルトの名無しさん
2011/11/21(月) 20:31:09.39ありがとうございます。
安全対策としてコンテナに実体を入れたくないんです。
と思ったがこれ以上メモリ確保しないならこれでいいかも、いやよくねーよ?
http://codepad.org/JBC4Abvr
0310デフォルトの名無しさん
2011/11/21(月) 20:35:12.090311デフォルトの名無しさん
2011/11/21(月) 21:05:56.980312デフォルトの名無しさん
2011/11/21(月) 21:27:51.64別にコンテナに実体を入れるかポインタを入れるか、
コピーコンストラクタがとか聞きたかったわけじゃなかったんだ
俺規約としてコンテナにはポインタをいれることは絶対だったから、
実体入れるのは、頭になくて新鮮で、何で実体入れないんだと考えてたのが309
実際聞きたかったことは,、push_backとか禁止したvectorないのってことです
0313デフォルトの名無しさん
2011/11/21(月) 21:34:09.740314デフォルトの名無しさん
2011/11/21(月) 21:34:37.21意味するところは解からんでもないがClassと書いて困ることも無いだろうに。
0315デフォルトの名無しさん
2011/11/21(月) 22:03:04.88配列そのままじゃ駄目なの?
begin、endの代わりにpArray、pArray+Nでどうにかなんないのかな
>>314
Kとlass(若い女性、娘、少女)で小娘って意味だろうきっと
0316デフォルトの名無しさん
2011/11/21(月) 22:04:54.97ポインタがコンテナから消えると自動的にポインタの指すクラスのデストラクタを
呼び出してくれる
0317デフォルトの名無しさん
2011/11/21(月) 22:09:47.36実態のコンテナとポインタのコンテナ2つ用意するのが堅実
0318デフォルトの名無しさん
2011/11/21(月) 22:38:57.49むしろboost::arrayがいいです。
クラスメンバにarray<T>とかサイズを後回しで宣言して使えるなら、使いたいです。
>>314
なぜklassの理由。何かから真似た。rubyの実装でこんな風に書いてあったような
>>315
実の目的はリファクタリングすることなのです。
newの仕方がうんこなので、まとめてnew[]するリファクタリングなんですが
vectorに放り込めばインターフェイス統一されてて楽なのです。、
>>316
ぐぐってみます
皆さんありがとうございました。
0319デフォルトの名無しさん
2011/11/21(月) 23:03:21.38Cygwin1.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のバージョンをご認識しているかと思うのですが、
どうしたらよいのでしょうか?
0320デフォルトの名無しさん
2011/11/21(月) 23:10:51.88まずは用語を適切に扱いなさい
0321デフォルトの名無しさん
2011/11/22(火) 00:01:47.32> 実際聞きたかったことは,、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;
0322デフォルトの名無しさん
2011/11/22(火) 00:05:21.270323デフォルトの名無しさん
2011/11/22(火) 11:36:33.62#include <iostream>
using namespace std;
int main()
{
char* c = "ABC";
cout << c << '\n';
}
cは"ABC"の先頭要素のアドレスが入ると思うのですが、
cを出力した時にABCが出るのは何故なのでしょうか
0324デフォルトの名無しさん
2011/11/22(火) 12:01:07.67蛇足だけど文字列リテラルはconst char*で受けたほうが良い
0325デフォルトの名無しさん
2011/11/22(火) 12:08:42.65そこでアドレスが出て欲しい人って居るか?
という規定
0326デフォルトの名無しさん
2011/11/22(火) 12:12:31.13文字列が出したければstringでも使ってろカス
0327デフォルトの名無しさん
2011/11/22(火) 12:18:58.250328デフォルトの名無しさん
2011/11/22(火) 12:21:02.970329デフォルトの名無しさん
2011/11/22(火) 12:29:21.000330デフォルトの名無しさん
2011/11/22(火) 12:35:19.210331デフォルトの名無しさん
2011/11/22(火) 13:28:22.61アウトだよ
0332323
2011/11/22(火) 13:57:35.55ありがとうございました
0333デフォルトの名無しさん
2011/11/22(火) 20:56:19.11size_tじゃアドレス出力用のフォーマットで出力しない。
0334デフォルトの名無しさん
2011/11/22(火) 21:01:44.72どんな環境でも整数として表示したいならsize_tかoffset_tにキャストして表示しなさい
0335デフォルトの名無しさん
2011/11/22(火) 21:18:35.820336デフォルトの名無しさん
2011/11/22(火) 21:24:11.74現実問題、処理系依存だろうとポインタに最適化されてる
void*表示のほうが見やすい
そもそもsize_tが32bit、ポインタ64bitの環境じゃアドレスが欠ける。
0337デフォルトの名無しさん
2011/11/22(火) 21:27:30.930338デフォルトの名無しさん
2011/11/22(火) 21:33:40.77自分で出力の仕方くらい決めさせてくれ
それに規格的には%pに渡すにはvoid*へのキャストが必須だから
大した差は無い(元からvoid*な場合以外)
0339デフォルトの名無しさん
2011/11/22(火) 21:41:44.47同じ処理系依存でもvoid*の方がフォーマットはともかくアドレス
表記で有ることが保証されてる情報落ちが無い分マシといってるだけ
まぁ、>>323 にsize_tにキャストはやめなといってる理由だから
詳しい子は好きにしたらいい
0340デフォルトの名無しさん
2011/11/22(火) 21:45:20.32この2つはoptionalなので存在しない処理系もある
というかそもそもポインタを整数型にキャストできる保証もない
0341デフォルトの名無しさん
2011/11/22(火) 21:50:13.79intptr_tやuintptr_tがあるならそれを使いたいけど今のところある環境ばかりじゃないしな・・・
0342デフォルトの名無しさん
2011/11/22(火) 22:03:14.760343デフォルトの名無しさん
2011/11/22(火) 22:07:22.77そこまで拘るんならカスタムマニュピレーターでも作ったほうが早くね
0344デフォルトの名無しさん
2011/11/22(火) 22:09:08.61符号付きの時点でイヤ
0345デフォルトの名無しさん
2011/11/22(火) 22:10:08.08頭だいじょうぶ?
0346デフォルトの名無しさん
2011/11/22(火) 22:15:23.900347デフォルトの名無しさん
2011/11/22(火) 22:38:47.87ptrdiff_tで何も問題は起こらない
0348デフォルトの名無しさん
2011/11/22(火) 23:21:41.78メモリ空間が分割されていたり単一プログラムが扱える範囲に制限があったりして
あまり大きなオブジェクトを扱えない環境では
ptrdiff_tがintptr_tより小さくてもおかしくない
0349デフォルトの名無しさん
2011/11/22(火) 23:24:44.770350デフォルトの名無しさん
2011/11/22(火) 23:42:04.600351デフォルトの名無しさん
2011/11/23(水) 01:18:52.490352デフォルトの名無しさん
2011/11/23(水) 07:19:58.48>そもそもsize_tが32bit、ポインタ64bitの環境じゃアドレスが欠ける。
そんなことあるの?
0353デフォルトの名無しさん
2011/11/23(水) 08:18:33.7064bitポインタ環境でsize_tが32bitとかかなり無意味だよな
0354デフォルトの名無しさん
2011/11/23(水) 08:28:02.14仕様調べてる暇があったらパパッとメタプログラミングで最適なサイズを求めればいいだろう
0355デフォルトの名無しさん
2011/11/23(水) 11:07:35.55連続した2^32+1以上の領域の確保を
コンパイル時エラー&メモリ確保エラーにするなら
そういう仕様でもおかしくはない
0356デフォルトの名無しさん
2011/11/23(水) 11:34:34.72286のような集積度か低い頃のセグメンテーションなMPUだとそうかもしれないけど、64bitアドレスが可能なMPUではメリット無くないか
0357デフォルトの名無しさん
2011/11/23(水) 11:37:37.64もしそうならそういう仕様もありうるという話をしただけで
メリットがあるという話はしていない
0358デフォルトの名無しさん
2011/11/23(水) 13:56:15.81#if intptr_tが使えない
namespace std { typedef intptr_t 処理系依存; }
#endif
処理系依存の所は変な技使わずlong longとかsize_tでも入れときゃいい
0359デフォルトの名無しさん
2011/11/23(水) 14:04:51.66std::uintmax_tなら必須だぜ
0360デフォルトの名無しさん
2011/11/23(水) 14:16:00.36uintptr_tが定義されない環境ではuintmax_tがuintptr_tに必要な大きさを持っていないと考えるほうが自然なんじゃないか
0361デフォルトの名無しさん
2011/11/23(水) 14:23:26.66環境依存しないアドレスの最大値ってどうやって取得するの?
numeric_limitsはリンク先のように意味ないし
0362デフォルトの名無しさん
2011/11/23(水) 14:34:14.44>>361
numeric_limits<void *>の定義は static constexpr T max() noexcept { return T(); }
だからね。uintptr_tに変換して~0の値を見るしかないんでは?
0363デフォルトの名無しさん
2011/11/23(水) 14:37:53.700364デフォルトの名無しさん
2011/11/23(水) 14:57:53.260365デフォルトの名無しさん
2011/11/23(水) 15:02:50.69of bits in the value representation of that particular size of integer.
確かにuintptr_tは符号無しではあるがunsignedと宣言されているわけではないな
0366デフォルトの名無しさん
2011/11/23(水) 15:38:58.9732bitフルに使わないといけないわけじゃないって事じゃないの
30bitしか使わなくても別に規格上問題は無い
0367デフォルトの名無しさん
2011/11/23(水) 15:40:53.37符号無しに変換してどうこうは保証されないってことか
0368デフォルトの名無しさん
2011/11/23(水) 16:04:39.71それを環境依存せずに取得できると思う方がおかしいぜ。
ちなみにWindowsはエディションによって搭載できるメモリが異なるが、
実行環境に合わせた表示までしたいの?
0369デフォルトの名無しさん
2011/11/23(水) 16:26:14.780370デフォルトの名無しさん
2011/11/23(水) 16:39:08.200371デフォルトの名無しさん
2011/11/23(水) 19:02:51.63Nintendo 64とか、AMD64以前のコンパイラだとぼちぼち見る
0372デフォルトの名無しさん
2011/11/23(水) 19:30:27.700373デフォルトの名無しさん
2011/11/23(水) 19:42:52.46> Address:0x7fff61bf930c
64びっとぺーせーだとスタックが真ん中あたりから始まるからねぇ。
0374デフォルトの名無しさん
2011/11/23(水) 19:50:55.67アロケーター書くときとか
0375デフォルトの名無しさん
2011/11/23(水) 19:57:59.77アロケーター書くのにどうしてアドレス値の最大が必要になるのかkwsk
0376デフォルトの名無しさん
2011/11/23(水) 20:11:37.530377デフォルトの名無しさん
2011/11/23(水) 20:17:45.32size_tにメモリー空間をカバーしろと仕様に書くのは無理だった訳で。
今でも、x86系のI/Oメモリー空間は別だし、どうやってもポインターサイズと
メモリー空間を対応付けるのは難しいよね。
0378デフォルトの名無しさん
2011/11/23(水) 22:03:41.68新規にフォームアプリケーションプロジェクトを作成すると
左のソリューションエクスプローラーの中に、
「ソースファイル」と「ヘッダーファイル」があります。
map関数を使いたいのですが、
#include <map>は「stdafx.h」に書けばいいですか?
また、
「Debug::WriteLine」を使いたいので「using namespace System::Diagnostics;」と書きたいのですが、
「stdafx.h」に書けばいいですか?
0379デフォルトの名無しさん
2011/11/23(水) 22:09:48.25どちらもソースファイルに書けば使えるようになる
http://hibari.2ch.net/test/read.cgi/tech/1268613679/
次からはこっちできけ
0380デフォルトの名無しさん
2011/11/23(水) 22:10:24.32>#include <map>は「stdafx.h」に書けばいいですか?
関数じゃなくてクラステンプレートだよね?
使うとこでインクルードしてもいいけど、よく使いそうだし stdafx.h でいいと思われ
>「Debug::WriteLine」を使いたいので「using namespace System::Diagnostics;」と
>書きたいのですが、
>「stdafx.h」に書けばいいですか?
C++では通常ヘッダファイルでusingはおすすめ出来ないが
C++/CLIの流儀だとどうなのかねえ・・・
俺はC++の通常の流儀に従って関数内でusingしてるけど
C++/CLIスレで聞いた方がいいと思う
0381デフォルトの名無しさん
2011/11/23(水) 22:12:31.10「ヘッダファイル内では」関数内でのみusingという事ね
0382デフォルトの名無しさん
2011/11/23(水) 22:13:46.93いちおうptr_diff_t ってのはあるんだけどね
0383デフォルトの名無しさん
2011/11/23(水) 22:13:58.76stdafx.h に書いておくとなんだかの理由で(プリコンパイルヘッダ関連だったかな)
処理が速くなりますよみたいな事がどっかに書いてあった気がするけど
よほど遅いマシン/巨大プロジェクトを扱ってるのでない限りそのヘッダを必要するソース
に書いて良いですね.経験上.
0384デフォルトの名無しさん
2011/11/23(水) 22:17:24.53処理が早くなるって、通常実行時って言うよりはコンパイル速度が早くなる可能性があるだけでは?
0385デフォルトの名無しさん
2011/11/23(水) 22:18:13.48何度も書かなくて便利というのもあるので
一概に速度だけの問題でもない
0386デフォルトの名無しさん
2011/11/23(水) 22:18:47.710387デフォルトの名無しさん
2011/11/23(水) 22:25:45.11mapを使うクラスのヘッダーファイルでinclude すればいい
ライブラリ等の変更する頻度が低くて良く使うヘッダーファイルをstdafxに追加するとコンパイルが劇的に速くなる
なお、両方に書いても問題ないよ
0388デフォルトの名無しさん
2011/11/23(水) 22:28:33.80はいそのつもりでしたが誤解を招く表現でしたね
0389デフォルトの名無しさん
2011/11/23(水) 22:37:34.60通常コンパイルで1分掛かるヘッダーをプリコンパイルにしてもやっぱり1分掛かる。
やっぱテンプレートだとプリコンパイルは無意味なんかね。
0390デフォルトの名無しさん
2011/11/23(水) 22:41:59.440391デフォルトの名無しさん
2011/11/23(水) 22:42:22.610392デフォルトの名無しさん
2011/11/23(水) 22:46:47.94変更なんてあり得ないし、なにかとどこかで使うことになるし
0393デフォルトの名無しさん
2011/11/24(木) 00:06:25.430394デフォルトの名無しさん
2011/11/24(木) 00:07:52.55プリコンパイルは1回だけだぞ
0395デフォルトの名無しさん
2011/11/24(木) 00:13:09.550396デフォルトの名無しさん
2011/11/24(木) 00:20:40.37ヘッダーは変更しとらんよ。
0397デフォルトの名無しさん
2011/11/24(木) 01:31:58.190398デフォルトの名無しさん
2011/11/24(木) 03:32:02.690399デフォルトの名無しさん
2011/11/24(木) 03:51:33.600400デフォルトの名無しさん
2011/11/24(木) 03:52:59.36関数だけじゃなくてクラスも対象だし、コンパイル「前」じゃないし、
「だけ」といってもその恩恵は計り知れないけどな。
0401デフォルトの名無しさん
2011/11/24(木) 07:18:06.740402デフォルトの名無しさん
2011/11/25(金) 10:57:50.500403デフォルトの名無しさん
2011/11/25(金) 12:00:01.710404デフォルトの名無しさん
2011/11/26(土) 10:43:17.92シングルトンって継承できないですよね?
0405デフォルトの名無しさん
2011/11/26(土) 10:47:29.60使いどころはあるの?
0406デフォルトの名無しさん
2011/11/26(土) 10:48:37.730407デフォルトの名無しさん
2011/11/26(土) 17:01:44.47public:
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を代入する。
0408デフォルトの名無しさん
2011/11/26(土) 17:08:21.050409デフォルトの名無しさん
2011/11/26(土) 17:13:44.03Y を int& じゃなくて、別のclassにすればできる。
でもねぇ、これは思想が違うとしか。
0410デフォルトの名無しさん
2011/11/26(土) 17:31:54.470411デフォルトの名無しさん
2011/11/26(土) 17:32:13.73その書き方の利点はなんだ
0412デフォルトの名無しさん
2011/11/26(土) 17:32:57.95別クラスってーとこんな感じか?
便利そうな、そうでもないような…
0413デフォルトの名無しさん
2011/11/26(土) 17:33:39.45これじゃないの?
マクロ書いた方がまだマシな気もする
0414デフォルトの名無しさん
2011/11/26(土) 22:32:34.97脇道だが、座標系を表すオブジェクトのXとYなんて書き換えられる必要ないだろ。
書き換え自体は、オブジェクトの内部で完結してりゃ十分じゃん。
それと、X、Yと定義しているパターンはよくあるけど、関数ポインターが無いと
XとYの入れ替え指示ができないので、OOとしてはあんまり良くない。
0415デフォルトの名無しさん
2011/11/26(土) 22:36:59.770416デフォルトの名無しさん
2011/11/26(土) 22:40:17.29どうせ、スレ違いというだろうけど
0417デフォルトの名無しさん
2011/11/26(土) 22:44:41.37今は、SSEやGPGPUもあるしそういう時代でもない。
0418デフォルトの名無しさん
2011/11/26(土) 22:45:28.92解ってんならVSのスレに行けよ
0419デフォルトの名無しさん
2011/11/27(日) 00:41:12.91uBLASとかBlitz++とかマジもんの数学ライブラリは添字アクセスなんけど
どこの常識なんだろうか・・・。
0420デフォルトの名無しさん
2011/11/27(日) 00:57:57.68でも3DCGとかじゃただの構造体がベスト
まとまった数学操作はすべて関数で用意して環境別に中身を切り替える
常識です
0421デフォルトの名無しさん
2011/11/27(日) 01:02:44.670422デフォルトの名無しさん
2011/11/27(日) 01:03:29.800423デフォルトの名無しさん
2011/11/27(日) 01:05:04.86その添字アクセスはサイズを動的にするための犠牲であって
添字アクセスが優れているから採用したわけではない
0424デフォルトの名無しさん
2011/11/27(日) 01:08:22.38少なくともJavaと.NETは構造体的になっているようだが
0425デフォルトの名無しさん
2011/11/27(日) 01:08:52.870426デフォルトの名無しさん
2011/11/27(日) 01:10:37.19構造体よりはクラスの方が良さそう
64bit時代だと普通の引数も4つまでレジスタ渡しだから
引数多い関数でもなければ差はないね
0427デフォルトの名無しさん
2011/11/27(日) 01:10:51.69本気で言ってるなら病院
0428デフォルトの名無しさん
2011/11/27(日) 01:12:06.77数学系に独立してるわけじゃなく
X11やWin API引きずってるもんな。仕方ない。
0429デフォルトの名無しさん
2011/11/27(日) 01:13:17.57x86系の命令と、インライン展開された状態知ってて言ってるの?
0430デフォルトの名無しさん
2011/11/27(日) 01:13:22.01見やすさとか書きやすさかなぁ?
0431デフォルトの名無しさん
2011/11/27(日) 01:14:23.93それだけだど
0432デフォルトの名無しさん
2011/11/27(日) 01:15:48.970433デフォルトの名無しさん
2011/11/27(日) 01:19:28.79任意のN次元を扱うクラスなら添え字が自然だろう。
どちらか片方が常識と言われると、アホと言いたくなる
とりあえず>>429は病院池
0434デフォルトの名無しさん
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();
}
こういう委譲スタイルが使えない。
0435デフォルトの名無しさん
2011/11/27(日) 01:26:43.53お前話の脈絡がめちゃくちゃだぞ
>>425の話と全然繋がってないじゃん
0436デフォルトの名無しさん
2011/11/27(日) 01:28:57.550437デフォルトの名無しさん
2011/11/27(日) 01:29:59.03なにそのキモイコード
0438デフォルトの名無しさん
2011/11/27(日) 01:32:06.80>中身を直に晒すと参照とか使えない
日本語でお願いします
0439デフォルトの名無しさん
2011/11/27(日) 01:34:11.25GPUやSSE用の頂点配列の1要素を、
単体のベクトルに委譲するコード。
最近似たようなのをちょくちょく見かけるね。
0440デフォルトの名無しさん
2011/11/27(日) 01:35:31.15中身丸出しってのはこれのこと
>数学ベクトルはメンバ丸出し
0441デフォルトの名無しさん
2011/11/27(日) 01:37:43.870442デフォルトの名無しさん
2011/11/27(日) 01:39:18.21要素分けて参照させる必要あるの?
ベクトル単位で参照したほうがいいだろ
0443デフォルトの名無しさん
2011/11/27(日) 01:47:26.67SSEだと、ベクトル集合の演算は、次元毎に加算したほうがやりやすいんだよ。
例えば適当に書くけどこんな感じ
float x[128], y[128];
*( (*__m128) x ) += (__m128){ 1, 1, 2, 2 };
*( (*__m128) y ) += (__m128){ 1, 1, 2, 2 };
0444デフォルトの名無しさん
2011/11/27(日) 01:57:45.92> VC++の$(OutDir)の値を変更するのはどこ?
使わなきゃいいだろ。
0445デフォルトの名無しさん
2011/11/27(日) 01:59:34.60SSEArray<2> model(100);
model += Vector<2>(10, 20);
model[0] += Vector<2>(10, 20);
元々、SSE用のベクトル集合があって、
ベクトル集合全てに加算する場合と、
1要素に対し加算する場合がある。
SSE用のベクトル集合の内部は>>443の用に
内部で次元毎に別れて格納されてる。
そのままでは、1要素のベクトル演算には使えないから、
一旦ベクトル集合の1要素を参照するベクトルオブジェクトに
委譲してやる必要があるわけ。
0446デフォルトの名無しさん
2011/11/27(日) 02:10:02.90でいいよ
へんなアダプタかませてカッコつける必要性皆無
0447デフォルトの名無しさん
2011/11/27(日) 02:20:19.060448デフォルトの名無しさん
2011/11/27(日) 12:42:56.840449デフォルトの名無しさん
2011/11/27(日) 12:48:30.77速度が必要になったらちょっとPolicyを差し替えるだけでSIMD使うものにできるみたいな
0450デフォルトの名無しさん
2011/11/27(日) 17:35:54.87std::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();
}
どこがおかしいのでしょうか?
0451デフォルトの名無しさん
2011/11/27(日) 17:58:04.04if(!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;
0452デフォルトの名無しさん
2011/11/27(日) 18:07:28.80ifs.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;
}
0453デフォルトの名無しさん
2011/11/27(日) 18:15:44.28出来ました!!
ありがとうございます!!!
0454デフォルトの名無しさん
2011/11/28(月) 04:45:39.900455デフォルトの名無しさん
2011/11/29(火) 21:54:49.93x.doKantoka();
}
的なコードを見やすくするために
x.isNantoka() && x.doKantoka();
って書くのっておかしいですか?
0456デフォルトの名無しさん
2011/11/29(火) 22:03:13.870457デフォルトの名無しさん
2011/11/29(火) 22:04:14.880458デフォルトの名無しさん
2011/11/29(火) 22:23:46.580459デフォルトの名無しさん
2011/11/29(火) 22:25:29.03if (x.IsXxx() == true) x.DoXxx();
と、一行で書けるときはそうする。
0460デフォルトの名無しさん
2011/11/29(火) 22:36:52.53if hoge and fuga or piyo.
hogeであるならばfugaでなければpiyoってなるからすごいわかりやすいんだけどね
0461デフォルトの名無しさん
2011/11/29(火) 22:37:27.33たしか miracle linux のオラクル起動シェルがそれ多用してた...
古いPerlのソースではよく
処理() || die;
つーのがあって「処理をしろ、さもなくば死ね」
と読ませたかったポ。原理は同じだよな。
でも考えたら
if( ptr != NULL && ptr->isHoge() ) {
...
}
ていう、nullガードのパターンはよく見る。
程度問題っていうか、読む人への優しさの問題かな
0462デフォルトの名無しさん
2011/11/29(火) 23:09:44.84Perlでは見ない事も無い書き方だけど
C/C++的には正直読み辛い
0463デフォルトの名無しさん
2011/11/29(火) 23:22:59.650464デフォルトの名無しさん
2011/11/29(火) 23:39:22.25コンディション変数ってもんも有るんだがね。
NULLガードが見づらいって人は、コンディション変数も嫌いかもね。
// こういうヤツ
if( X x = a.ToX() ) return x;
0465デフォルトの名無しさん
2011/11/29(火) 23:52:05.65x.isNantoka() && x.doKantoka();
0466デフォルトの名無しさん
2011/11/30(水) 00:00:34.48いや解ってるよ。コンディション変数が苦手な人と趣向が同じだよねって言ってるの。
0467デフォルトの名無しさん
2011/11/30(水) 00:02:39.64趣向が同じ訳ではないと思うの
0468デフォルトの名無しさん
2011/11/30(水) 00:04:28.24オーバーロードに気づかなかったら、ショートサーキットが効かず事故る。
0469デフォルトの名無しさん
2011/11/30(水) 00:04:57.08なぜ見やすいコードを見にくいコードに置き換えようとしているのかが分からない
0470デフォルトの名無しさん
2011/11/30(水) 00:05:42.47でも&&や||のオーバーロードってそんなあるかな?
0471デフォルトの名無しさん
2011/11/30(水) 00:07:02.58と書きたくなることはある
0472デフォルトの名無しさん
2011/11/30(水) 00:12:35.190473デフォルトの名無しさん
2011/11/30(水) 00:15:58.93C++で&&とあったら評価の途中の副作用でなく結果のbool値のほうを注目するから一般的ではないだろうな
0474デフォルトの名無しさん
2011/11/30(水) 01:48:20.040475デフォルトの名無しさん
2011/11/30(水) 02:50:40.400476デフォルトの名無しさん
2011/11/30(水) 02:51:27.40決まってるよ
0477デフォルトの名無しさん
2011/11/30(水) 08:21:47.37VB でいう MyBase、C# でいう base は C++ では何になるのでしょうか。
継承クラスの子メンバで、親のメンバを明示して実行させたいのですが。
this だと自分自身を指しますよね?
0478デフォルトの名無しさん
2011/11/30(水) 08:27:43.850479デフォルトの名無しさん
2011/11/30(水) 08:53:46.38多重継承できるC++では明示的に親を示すキーワードはない。
0480デフォルトの名無しさん
2011/11/30(水) 10:54:29.73struct 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
0481デフォルトの名無しさん
2011/11/30(水) 11:10:02.020482デフォルトの名無しさん
2011/11/30(水) 12:34:42.48それって隠蔽されてる関数を無理矢理引っ張り出す書式だよな
親を指すポインタはdynamic_castを使って2個作るしかない事には変わりがない
0483デフォルトの名無しさん
2011/11/30(水) 12:52:54.30T * 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
0484デフォルトの名無しさん
2011/11/30(水) 19:35:05.37>>478のやりかたで正しい。
0485デフォルトの名無しさん
2011/11/30(水) 19:36:26.08別に無理矢理じゃないだろ。
多重継承で衝突した時の基本的な対処法じゃん。
0486デフォルトの名無しさん
2011/11/30(水) 19:37:06.33static_castで十分ですけど
0487デフォルトの名無しさん
2011/11/30(水) 19:38:13.33オーバーライドする気がないならstatic_castの方がマシ。
0488デフォルトの名無しさん
2011/11/30(水) 19:42:09.000489デフォルトの名無しさん
2011/11/30(水) 20:14:24.23オーバーライドしててもstatic_castっていうか暗黙のダウンキャストで十分ですけど
0490デフォルトの名無しさん
2011/11/30(水) 20:18:53.94ダウンキャストを暗黙でやられたら大変なことに
0491デフォルトの名無しさん
2011/11/30(水) 20:23:32.23base1やbase2が別のクラスのオブジェクトを返す場合は困るってこと。
0492デフォルトの名無しさん
2011/11/30(水) 20:30:46.870493デフォルトの名無しさん
2011/11/30(水) 21:26:10.52済みません
Interface<B1> base1() { return this; }
こういう場合ってメンバ関数の返却値でInterfaceの引数付きコンストラクタを
呼び出していますが、これって規格票のどこに説明がありますか?
初めて見たのでこういう書き方が出来るなら便利です
今までローカル変数に代入してから返していました
0494デフォルトの名無しさん
2011/11/30(水) 21:31:58.27規格の前に入門書読みなさい
0495デフォルトの名無しさん
2011/11/30(水) 21:34:39.66ロベールと詳説C++を読んだけどどこにも書いてありません
JISの規格にも関数の返却値でコンストラクタを初期化する内容が
ちょっと見つからなかったもんで
0496デフォルトの名無しさん
2011/11/30(水) 21:44:24.07あれの引数の型を、自分の型とは関係ない型にしてるだけ。
変換コンストラクターという。
0497デフォルトの名無しさん
2011/11/30(水) 21:45:22.880498デフォルトの名無しさん
2011/11/30(水) 21:47:46.05とか普通にやるよね
0499デフォルトの名無しさん
2011/11/30(水) 21:52:06.13ありがとうございます
これでかなり書き方が変わります
>>498
それは無意識のうちにやっていました
良く考えるとそれも変換コンストラクタなんですね
0500デフォルトの名無しさん
2011/12/01(木) 00:14:45.78MSに依存したものであれば、__superというキーワードが使える。
http://msdn.microsoft.com/ja-jp/library/94dw1w7x.aspx
0501デフォルトの名無しさん
2011/12/01(木) 00:24:46.14質問者が何を要求してるか考えろよ。
>継承クラスの子メンバで、親のメンバを明示して実行させたいのですが。
0502デフォルトの名無しさん
2011/12/01(木) 00:38:00.12質問の日本語がまずおかしい
0503デフォルトの名無しさん
2011/12/01(木) 00:53:59.620504デフォルトの名無しさん
2011/12/01(木) 07:09:58.340505デフォルトの名無しさん
2011/12/01(木) 08:06:33.61カネカネキンコはプログラム板から出てけよ
0506デフォルトの名無しさん
2011/12/01(木) 11:07:43.55Qって何です?
0508デフォルトの名無しさん
2011/12/02(金) 08:23:53.230509デフォルトの名無しさん
2011/12/03(土) 16:03:49.210511デフォルトの名無しさん
2011/12/03(土) 16:09:04.300512デフォルトの名無しさん
2011/12/05(月) 17:35:13.81int a = 100;
↓
int a(100);
変わりが無いのであれば、後者の方で統一してしまいたいんだが、どうだろうか
0513デフォルトの名無しさん
2011/12/05(月) 17:39:18.210514デフォルトの名無しさん
2011/12/05(月) 18:09:59.76static const int bar = 100; //できる
static const int baz(100); //できない
}
0515デフォルトの名無しさん
2011/12/05(月) 18:15:15.150516デフォルトの名無しさん
2011/12/05(月) 18:48:28.45でも他の人のソース見ても後者を使用している人って居ないんだよな
>>514
そんなことより静的イニシャライザが欲しい
0517デフォルトの名無しさん
2011/12/05(月) 19:18:22.42自分で作れ
0518デフォルトの名無しさん
2011/12/05(月) 19:27:41.44class 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
0519デフォルトの名無しさん
2011/12/05(月) 19:39:50.94static PrintHogeAndPiyo()
{
print(..., statics.hoge, statics.piyo);
}
class StaticFields {
StaticFields()
: hoge(0),
piyo(23) {}
int hoge;
const int piyo;
};
static StaticFields statics;
};
ドヤァ・・・
0520デフォルトの名無しさん
2011/12/05(月) 19:49:20.02これは酷い
0521デフォルトの名無しさん
2011/12/05(月) 20:05:17.60constexpr A() : m() { }
int m;
};
constexpr int v
0522デフォルトの名無しさん
2011/12/05(月) 20:09:49.41ほかになんか気をつけなきゃいけないことってある?
0523デフォルトの名無しさん
2011/12/05(月) 20:13:05.230524デフォルトの名無しさん
2011/12/05(月) 20:33:51.33どうなるか解ってると思うが、参考までに。
Type function()
{
return Type();
}
void function()
{
return void();
}
int function()
{
return int();
}
0525デフォルトの名無しさん
2011/12/05(月) 21:09:40.69解ってない
return Type(); → デフォコン呼ばれたType型オブジェクトが返される
return void(); → 予想: わかんない
return int(); → 予想: int型の不定値が返される
0526デフォルトの名無しさん
2011/12/05(月) 21:12:53.510527デフォルトの名無しさん
2011/12/05(月) 21:14:28.89何も返らない
0
0528デフォルトの名無しさん
2011/12/05(月) 21:41:59.670529デフォルトの名無しさん
2011/12/05(月) 22:22:09.46テンプレートで問題が起きないように、
関数型キャストは、全て何らかの初期化になっている。
定数で初期化するより、君が使おうとしてる、関数型キャストの方が
汎用性がたかいんだよ。
0530デフォルトの名無しさん
2011/12/05(月) 23:43:49.82return int(); が 0 を返すってマジかYO。というかマジだった
ローカル変数の初期値は不定値なのに、これは0に初期化されるのか
なんか不思議な感じがするんだけど、この仕様に理由があったりするの?
>>529
static const int baz(100) ←これ
・・・が関数型キャストと呼ばれているの?
それはそうと、自分もテンプレートを作成している際にこれを使った方が色々と都合が良いと思ったんだよね
template <typename T>
T Func() {
T a = 100; // 代入したいんじゃない
T b(100); // 初期化したいんだ
}
0531デフォルトの名無しさん
2011/12/06(火) 00:48:26.83そして非explicitコンストラクタの場合
> T a = 100; // 代入したいんじゃない
> T b(100); // 初期化したいんだ
このふたつは等価だから
template <typename T>
void func(){T t = T();}
と書けばTがPODでも初期化できる
0532デフォルトの名無しさん
2011/12/06(火) 00:58:07.040533デフォルトの名無しさん
2011/12/06(火) 01:52:16.33int n = int();
関数型キャストと言ったのはこっちの事。
言うには言ったけど間違ってたと思う。
int n = int( 100 );ってのは関数型キャストで間違いない。
int()だと多分デフォコンが正しいんだろう。
0534デフォルトの名無しさん
2011/12/06(火) 07:17:27.76等価じゃないよ
T a = 100; は T(int) が public でも
コピーコンストラクタが private なら外では使えない
(たとえコピーコンストラクタの実行が最適化で省略されるとしても)
0535デフォルトの名無しさん
2011/12/06(火) 09:15:32.610536デフォルトの名無しさん
2011/12/06(火) 11:48:08.93T b(T(100));
これなら等価かな?関数宣言と見なされてエラーになっちゃう?
0537デフォルトの名無しさん
2011/12/06(火) 18:33:48.41どちらの記法を使うかは勝手ということか
>>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
0538デフォルトの名無しさん
2011/12/06(火) 19:31:00.93意外と等価なケースばかりではないのよね
0539デフォルトの名無しさん
2011/12/06(火) 19:36:09.47hoge h = {1, 2, 3};
とか
hoge h({5}), g{6};
みたいに書けるんだっけ
なんか気味悪い
0540デフォルトの名無しさん
2011/12/06(火) 20:49:33.23指定のビット幅を持つ整数型を得るにはどうすればいいですか?
0541デフォルトの名無しさん
2011/12/06(火) 20:58:29.710542デフォルトの名無しさん
2011/12/06(火) 21:18:10.45stlにbitset<>(固定ビット数指定)がありますが、
可変ビットを指定出来るにはまだ先になるの?
やっぱりまだboostを使わなきゃならないのかな?
0543デフォルトの名無しさん
2011/12/06(火) 21:26:13.45ビットフラグって予め意味が決められてるから
可変にしても仕方が無いとか
拡張性を考えるとそうとも限らないとは思うけど
0544デフォルトの名無しさん
2011/12/06(火) 21:29:40.15まーポシャったけど。
0545デフォルトの名無しさん
2011/12/06(火) 21:32:15.27速さは殆ど変わらないよね?
0546デフォルトの名無しさん
2011/12/06(火) 21:33:32.960547デフォルトの名無しさん
2011/12/06(火) 21:45:06.52作ったけど別に必要なかったような
除算だけが難しかった
0548デフォルトの名無しさん
2011/12/06(火) 21:48:33.76その時は基数がなにかとか殆どわからなくて言語に依存してたからビット演算を自前で実装出来なかったんだ・・・。Orz
0549デフォルトの名無しさん
2011/12/07(水) 16:38:05.24メモリの書き換えが起こらないときに付けるのかどっちが一般的なんですか?
pImplイディオムを使うときや関数オブジェクトを作る時などにすごく悩みます
0550デフォルトの名無しさん
2011/12/07(水) 16:49:16.89メンバ変数の書き換えが起きない時
0551デフォルトの名無しさん
2011/12/07(水) 17:50:04.43const char *hage;
の const 対象はポインタだけだよね?
hage = new_hage; ← NG??
ちなみに
strcpy((char *)hage, 'hage!');
は通るよね、どう理解したらいいんだい
0552デフォルトの名無しさん
2011/12/07(水) 17:55:04.32ポインタ先の書き換えであってポインタ自体は書き換えていい
あとCスタイルのキャストはconstは外れる
0553デフォルトの名無しさん
2011/12/07(水) 19:35:21.06このポインタが指している変数の変更: 可能
このポインタの変更: 可能
�A const char * hage2;
このポインタが指している変数の変更: *不可能*
このポインタの変更: 可能
�B char * const hage3 = &betsuno_hage;
このポインタが指している変数の変更: 可能
このポインタの変更: *不可能*
�C const char * const hage4 = &betsuno_hage;
このポインタが指している変数の変更: *不可能*
このポインタの変更: *不可能*
0554デフォルトの名無しさん
2011/12/07(水) 19:45:05.40おお、初めて知った
ついでに質問だけど、ある変数を途中からconst扱いにってできる?
0555デフォルトの名無しさん
2011/12/07(水) 20:34:49.43仕様を知りたいわけじゃないなら、
コンパイルしてみたらええがな。
今時、その辺が仕様からズレてる
コンパイラも無いぞ。
0556デフォルトの名無しさん
2011/12/07(水) 21:39:53.83結果をキャッシュして、キャッシュがあればそれを返す、というような場合は、
キャッシュ変数を mutable にして、メンバ関数を const にするような事はある
0557デフォルトの名無しさん
2011/12/07(水) 22:15:00.64無理・・・と考えていい
int x;
if (!tryGetX(..., &x)) { return false; }
こういう状況はよくあるよね。この地点でxを固定したい
0558デフォルトの名無しさん
2011/12/07(水) 22:39:50.01無理なのかーまあ途中からconstで変数増やせばできるといえばできるが
一旦定義してfor文で回した後は固定したいとかよくあるよね
0559デフォルトの名無しさん
2011/12/07(水) 22:51:24.86int tryGetX_(...) {
int x;
if(tryGetX(..., &x)) return x; else throw exception;
}
try {
const int x(tryGetX_(...));
...
}
catch(...) {
return false;
}
0560デフォルトの名無しさん
2011/12/07(水) 22:53:42.48例外使えば良いよってのはない
0561デフォルトの名無しさん
2011/12/07(水) 23:02:58.420562デフォルトの名無しさん
2011/12/07(水) 23:17:49.31const int x = GetX( &is_success );
if( is_success ){}
else {}
throw使いたくないなら引数に判定を持ってくるぐらいしかないだろ
0563デフォルトの名無しさん
2011/12/07(水) 23:29:48.15例外が駄目だっていう人も殆どはただの好みの問題で拒否ってるだけだし
0564デフォルトの名無しさん
2011/12/07(水) 23:39:44.89cont int x = GetX(); // 結局ここでIs〜で取りこぼした分は例外にしなきゃならん。無駄。
0565デフォルトの名無しさん
2011/12/07(水) 23:43:02.550566デフォルトの名無しさん
2011/12/08(木) 10:15:05.17例えばbeginメソッドとか書いても結局使うのはブーストのbegin関数(かそれを真似した関数)を通して使いますよね
テンプレートを使うと特に顕著です
テンプレート型のオブジェクトのメソッドをコールするときは必ずメソッドをコールするだけの関数を通して呼びます
利用者側がカスタマイズする時に助かるからです
でもこんなことなら最初から関数にすればいいのではないでしょうか?
0567デフォルトの名無しさん
2011/12/08(木) 10:44:26.990568デフォルトの名無しさん
2011/12/08(木) 10:48:33.430569デフォルトの名無しさん
2011/12/08(木) 12:49:44.32仮想関数どうすんの?
0570デフォルトの名無しさん
2011/12/08(木) 13:01:14.63>例えばbeginメソッドとか書いても結局使うのはブーストのbegin関数(かそれを真似した関数)を通して使いますよね
>テンプレートを使うと特に顕著です
>テンプレート型のオブジェクトのメソッドをコールするときは必ずメソッドをコールするだけの関数を通して呼びます
boostのbeginは配列とコンテナに同じインターフェースを設けるためだよ
意味不明な理由でインターフェース増やしまくる馬鹿はおまえだけ
0571デフォルトの名無しさん
2011/12/08(木) 13:04:58.90>>559-564といった感じで上手い方法は無い
ループ内の処理が長いのであれば、その部分をinline関数として抜き出して、その関数の戻り値をconstで受け取ればいい
ループ内の処理が短かったり、inline展開されるか不安であれば、我慢して非constで使う
最適化を気にしているのであれば、ローカル変数がconst/非constであることはそれにほぼ関与しないから問題ない
まぁ、throwされた時のコストを気にすべき環境では例外は使わないかな
0572デフォルトの名無しさん
2011/12/08(木) 13:37:08.330573デフォルトの名無しさん
2011/12/08(木) 23:45:25.75>でもこんなことなら最初から関数にすればいいのではないでしょうか?
すればいいんじゃね。
仮想関数との透過的扱いが不要だと思うんなら、全てfriendにするなり好きにしたらいいんじゃね。
いつの日か多重メソッドに対応するものができたら得するかもしれん。
どうでもいいが、C++は、Smalltalkの様にメッセージとメソッドが別れてないから、
メンバー関数のことをメソッドとは言わん。Javaみたいな恥ずかしいことを書くな。
0574デフォルトの名無しさん
2011/12/08(木) 23:49:36.31オモシロクナイですよ、それ
0575デフォルトの名無しさん
2011/12/08(木) 23:52:13.210576デフォルトの名無しさん
2011/12/08(木) 23:58:21.170577デフォルトの名無しさん
2011/12/08(木) 23:58:52.510578デフォルトの名無しさん
2011/12/09(金) 00:02:23.76SimulaはProcedureじゃん
0579デフォルトの名無しさん
2011/12/09(金) 00:19:12.79>メンバー関数のことをメソッドとは言わん。Javaみたいな恥ずかしいことを書くな。
しらんがな、MS に言ってくれよ。
http://msdn.microsoft.com/ja-jp/library/bb3b0dfs.aspx
0580デフォルトの名無しさん
2011/12/09(金) 00:19:58.76言葉以前に構造が全然違う。
メンバー関数は、関数と関数ポインターでしか無いが、
メッセージ&メソッドは、メッセージをキーに対応するメソッドを探し出す。
さらには、転送やら、未対応メッセージに対しデフォルトメソッド起動やら
高機能かつ重い。
0581デフォルトの名無しさん
2011/12/09(金) 00:22:53.14コンパイラからファイルフォーマットから余計な拡張ばっかしやがる
企業なんて追いかけても無駄。数年後にはまた用語が変わる。
0582デフォルトの名無しさん
2011/12/09(金) 00:40:21.29構造をはっきりと意識して使い分けるならば違うとも見れるわけだし、
目くじらたてる必要はないよな
0583デフォルトの名無しさん
2011/12/09(金) 02:25:01.38むしろMFCは変わってないからメソッドのままなんだよ。数年どころか20年間メソッドのままだよ
標準化されたところは標準の用語になってる
0584デフォルトの名無しさん
2011/12/09(金) 03:16:26.48「とりあえず通じてるからいい」
系のレスを途中まで書いては見たものの、かなり低レベルなことに気付いて全部消した
おなかすいた
0585デフォルトの名無しさん
2011/12/09(金) 07:35:34.29引っ張りたくないが、ソースはどこだよ。
http://msdn.microsoft.com/en-us/library/f33y54z5(v=vs.80).aspx
用語なんてどうでもいいじゃんってのは、
「見た目が同じだから、クラスを全部構造体って言えばいいじゃん」
と言われるのと同じ感覚なんだが、言い訳しかしないしどうでもいいや、好きにすりゃいい。
0586デフォルトの名無しさん
2011/12/09(金) 08:50:04.91あおりじゃなくまじで教えて?
0587デフォルトの名無しさん
2011/12/09(金) 08:59:07.19ちげーよバカ
メソッドはオブジェクトのもつ手続きという以上の意味はない
C++のメンバ関数もメソッドで正解なんだよ
お前の言ってるメソッドはメソッドの実装の一つでしかないといことに気がつけモンキー
0588デフォルトの名無しさん
2011/12/09(金) 09:31:55.67private:
struct A{
public:
それぞれ、ブロックの最初にprivateとpublicが暗黙に書かれてると思えばおk
0589デフォルトの名無しさん
2011/12/09(金) 09:34:06.75まず、その「クラス」と「構造体」の定義をした方がいいと思うよ。
C++ の class と struct の話なのか、一般的なクラスと構造体の概念の話なのかで
答えが変わってくるから。
0590デフォルトの名無しさん
2011/12/09(金) 09:36:03.130591デフォルトの名無しさん
2011/12/09(金) 11:28:12.70知ってるくせに()
0592デフォルトの名無しさん
2011/12/09(金) 12:19:36.98class 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++において、実装を含むクラスをインターフェイスと呼べるのでしょうか。
またインターフェイスという仕様に沿うために、実装を完全に派生クラスに移譲する設計をしているのか、
基底クラスに実装を含めたほうがいいと考えられるようなものでも、あえてそうしない理由があるのか、教えてください。
0593デフォルトの名無しさん
2011/12/09(金) 12:31:56.10public:
virtual ~ItemBase(void) {}
ID GetID(void) const { return m_id; }
protected:
void SetID(ID id) { m_id = id; }
private:
ID m_id;
};
俺はこうしちゃうな
0594デフォルトの名無しさん
2011/12/09(金) 12:54:07.73http://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 {
0595デフォルトの名無しさん
2011/12/09(金) 12:55:15.22private:
BasicFunctions bf_;
};
と書くといいよ
0596デフォルトの名無しさん
2011/12/09(金) 15:09:51.43素数判定で思い知った。
目的のインデックスに達するまでループするのと
乗算やmodを使ってインデックスを直接割り出すのとで
対して速度違わねーだろと思ってたのに
10億回も呼び出されるとなると軽く1秒とか2秒の差になるのな^^
そりゃ、日本のゲームが海外のゲームみたいな
綺麗な画面、華麗な動き、活き活きとしたキャラクターを描けないわけだ。
0597デフォルトの名無しさん
2011/12/09(金) 16:54:54.45class 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(仮)関数の名前はどんなのがいいだろう?
0598デフォルトの名無しさん
2011/12/09(金) 17:57:37.03GetXはvirtualにする意味ないだろ
0599デフォルトの名無しさん
2011/12/09(金) 18:33:02.52型を指定して継承って可能?
0600デフォルトの名無しさん
2011/12/09(金) 18:51:46.280601デフォルトの名無しさん
2011/12/09(金) 19:30:27.360602592
2011/12/09(金) 20:35:55.800603デフォルトの名無しさん
2011/12/09(金) 22:19:47.75適当なことを言うな。ProcedureでしかなかったSimulaのVirtual Procedureに対し、
Message送信と処理が分離しており区別する必要があったSmalltalkが導入した語句だ。
Smalltalk, Objects, and Designでも買って読んでみろ。
0604デフォルトの名無しさん
2011/12/09(金) 22:22:27.05んな事をするバカは日本にも稀だ。
ループのコストについても履き違えてる。
0605デフォルトの名無しさん
2011/12/09(金) 22:24:47.20お前が馬鹿だろこのアンポンタン
言葉ってのは時代の流れに乗って変化していくものなんだよ
現代でメソッドっていったらオブジェクトの手続き部分以上の意味はない
0606デフォルトの名無しさん
2011/12/09(金) 22:30:24.62メンバーの実装強要は置いといて、
データメンバーの無い、仮想関数を持ったクラスは親に持っておくべき。
2個めの実装を持ったクラスをつくってもいいが、そのクラスは親に、
データメンバーの無いクラスを持っておいておいたほうがよい。
君のIItemを継承したクラスがidを必ずしも必要とするとは限らないからね。
IItemの子クラスが、メンバー変数に、IDを取得できるオブジェクトをもっていて、
IDをGetIDから返す際は、そのオブジェクトに問い合わせるって実装を作ったら、
IItemのidは死荷重になる。IDがポインタで表現されてるとかだと、大した量でも無いが、
GUIDみたいな物だと、IItemを配列に突っ込んだ時、死荷重の割合が増大する。
0607デフォルトの名無しさん
2011/12/09(金) 22:34:01.41お前はJavaでもRubyでもつかってろって
Smalltalkと対立関係があり、逆にObjective-C++として
近親関係でもあるC++だとMethodはSmalltalkと
Objective-CのMethodを指すんだよ。
0608デフォルトの名無しさん
2011/12/10(土) 00:15:43.03Javaから流れてきた連中でたいていはとんでもないプログラムを書いてプロジェクトを荒らす^^
JavaとC++がまったく別物だということに無頓着なことが多い。弱る。
0609デフォルトの名無しさん
2011/12/10(土) 00:23:12.66活き活きを履き違えてるな。活き活きさせるにはループ内で迅速に関連変数を書き換えないといけない。で、描画する。
その根本の動作はモーションキャプチャで撮ってきてたりするが、
結局どのタイミングで関連変数を書き換えて反映するかの一点しかない。
動きというものがループで生成される画像の連続なんだぞ?
0610デフォルトの名無しさん
2011/12/10(土) 09:08:34.500611デフォルトの名無しさん
2011/12/10(土) 09:26:21.24もういいから老人は放射能で早く死ねよ
new/delete が癌ですかね?それともポインタ?
0613デフォルトの名無しさん
2011/12/10(土) 11:15:38.84C++にはメソッドとかスーパークラスなんて名称はない。
ちなみにメンバ変数なんてのもないし、戻り値なんてのものない。
…通じるからいいじゃん、という意見なら賛成だ
0614デフォルトの名無しさん
2011/12/10(土) 12:06:20.30戻り値の型がvoidなものもfunctionと呼ぶのが気持ち悪かったのだろうか
0615デフォルトの名無しさん
2011/12/10(土) 15:55:15.52bool型のポインタを返すfunc()という関数内で、ポインタの配列ptrを作成し、
同じくfunc()関数内で作成したaという配列のアドレスを代入しました。
その結果、「func ここから〜func ここまで」、を見る限りptrはaのポインタとなっているようです。
このfunc関数でptr[0]を返し、main関数内のmain_aに代入したところ、アドレスは一緒なのに何故か中身が全て0になってしまうのです。(bool型ということが関係しているようで、bool*をint*にするとmain_aでも正常にポインタとして機能してくれます。)
そして、質問なのですが、bool型でも*main_aを正しく表示させるにはどうしたらいいのでしょうか。
ソースと出力結果は次に書きます。
0616615
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;
}
0617615
2011/12/10(土) 15:57:23.76func ここから
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
連投すみませんがよろしくお願いします。
0618デフォルトの名無しさん
2011/12/10(土) 16:02:11.43ローカル変数が破壊された後は、その中身がどうなってるかなんて
神の味噌汁だよ。
0619デフォルトの名無しさん
2011/12/10(土) 16:02:42.280620デフォルトの名無しさん
2011/12/10(土) 16:12:11.340621デフォルトの名無しさん
2011/12/10(土) 16:17:04.05int a = 100;
return &a;
} // この地点で変数 a は破棄される
なので、このようにして
int * b = func();
戻り値として取得した、"破棄された a" を指すポインタ b は何をさしているのか分からない
というか警告出ないのか?
0622615
2011/12/10(土) 16:23:05.070623デフォルトの名無しさん
2011/12/10(土) 16:29:09.76とりあえず2次元からと思い、以下のコードを作りましたが何も表示せず終了してしまいます。問題点を教えてください。
再帰以外の手法でも構いません。
http://ideone.com/Z8vSR
と投稿しようとしたら、ideoneがエラー表示してくれてるのに気付いて(iが未初期化だった)ひとまず再帰での表示は解決しました。
なので、むしろ他の手法についてうかがいたいです。
0624615
2011/12/10(土) 16:29:54.23ありがとうございます!
なるほど。破棄されるんですね。警告はでませんでした・・・
破棄されないようにするにはstatic使えば大丈夫ですよね。
本題とは関係ないのですが、
なぜbool*を全部int*に置き換えてやった場合はmain内でもうまくいったのでしょうか?
たまたまですかねw
0625デフォルトの名無しさん
2011/12/10(土) 17:08:27.56同じ発想をちょっと整理してみた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;
}
0626デフォルトの名無しさん
2011/12/10(土) 18:09:35.81ウイルスの処理とか自分でしてみたいのと
ゲームとか作れるようになりたいんですが
どんな勉強をすればいいんですか?
高くてもいいんでおすすめの本とかを教えてくれると嬉しいです
ウィルス技術は本にはならないだろう。チェルノブイリウィルス(CIH) とかのソースはもしかすると手に入るかもしれない、win95/98/me限定だが。もっとも手が後ろに回る覚悟が必要。
0628デフォルトの名無しさん
2011/12/10(土) 18:59:30.44すいません
言い方がいけなかったです
ウイルス対策のソフトとかを使わないで自分のパソコンに入ってきた
やつをなんとかしたいだけです
あとパソコン自体に詳しくなりたいんですが
何を学べばいいかよくわからなくて
あとは上の通りです
0629デフォルトの名無しさん
2011/12/10(土) 19:01:27.71>ウイルスの処理とか自分でしてみたいのと
ウィルスを作りたいのか、ウィルスを処理するプログラムを作りたいのか?
いずれにしろ、>>627 の言うように公的な本はないと思う。
あと下記Q3〜6 あたりに目を通しておいた方がいいよ。
http://www.moj.go.jp/content/000073750.htm
0630デフォルトの名無しさん
2011/12/10(土) 19:08:03.48ああ、処理する方か。
何とかする方法は、ウィルス毎に違うからウィルス毎に対策するしかない。
個人では事実上無理だと思う。
金をかけたくないだけならフリーの物を入れればいいし、どうしても何とかしたいなら
VMWare / Virtual PC とかの仮想化ソフト上でいろいろやって、ウィルスに感染したら
がっさり捨てると言うのが現実的。
> あとパソコン自体に詳しくなりたいんですが
何のために? パソコンと言っても、いろんな要素があるから、方向ぐらい決めないと
誰もアドバイスできないと思うよ。
0631デフォルトの名無しさん
2011/12/10(土) 19:20:17.02ありがとうございます
>>630
何をやりたいとかというのが漠然としてまして...
というか
なんといったらいいかわからないというか
強いて言うならゲームとかを作ってみたいです
あとロボットとかのプログラミングとかをしたり
そういうことがしたいです
0632デフォルトの名無しさん
2011/12/10(土) 19:30:03.20とりあえず検索をすることを勧める
ゲーム プログラミング
これで検索してからにしな
0633デフォルトの名無しさん
2011/12/10(土) 19:35:21.19すまないありがとう
あと
聞きたいんですけど
イラスト用のソフトとかってどうやって作ってるんですか
これも
それを学べばできるようになりますか
0634デフォルトの名無しさん
2011/12/10(土) 19:37:40.410635デフォルトの名無しさん
2011/12/10(土) 19:42:10.34※ 個人の感想です。
0636デフォルトの名無しさん
2011/12/10(土) 20:07:07.45ゲームはプログラミングとしてあまりに広大な幅を持っているから、
どれからはじめれば・・・というのは悩み所だな
とはいえ成果が目に見てわかりやすい2d,3dプログラミングは楽しいと思う
glfw+OpenGLとか結構お手軽に始められるし。
0637デフォルトの名無しさん
2011/12/10(土) 20:15:16.24ありがとうございます
この二つは上はわかるような気がしますが
したのglfw+OpenGLというのが全くわからないです
おすすめのサイトや本などを教えてくれると嬉しいです
0638デフォルトの名無しさん
2011/12/10(土) 20:15:37.29GUIの入門書でも大体あると思う(全部にあるとは言わんが)
0639デフォルトの名無しさん
2011/12/10(土) 20:15:52.970640デフォルトの名無しさん
2011/12/10(土) 20:22:03.31GUIはC++だと敷居が高くなりがちだし、
C#あたりで始めたほうが挫折しにくいかと
0641デフォルトの名無しさん
2011/12/10(土) 20:38:53.04分かりました
じゃあまずそのC#っていうのから学んでみます
とりあえず本を買ってそれに沿って学んできます
少し調べたんですが猫でもわかるってやつでいいですかね
あと誰か>>636お願いします
0642デフォルトの名無しさん
2011/12/10(土) 20:44:01.41ググればどちらも一番上にあるぞ
0643デフォルトの名無しさん
2011/12/10(土) 20:46:10.20マジですか(-_-;)
0644デフォルトの名無しさん
2011/12/10(土) 20:50:10.44続けてすいません
glfw+OpenGLってググッたら一番上が英語で全くわからなかったです(-_-;)
0645デフォルトの名無しさん
2011/12/10(土) 20:50:51.58日本語のページを検索とかできないのかw
0646デフォルトの名無しさん
2011/12/10(土) 20:53:09.30個別ってどこできるんですか!?
0647デフォルトの名無しさん
2011/12/10(土) 20:55:11.28glfwとOpenGL別々に検索かけろよ
自分で調べる癖付けないとゲームつくろうなんて夢のまた夢だぞ
0648デフォルトの名無しさん
2011/12/10(土) 20:58:46.97すいません(-_-;)
+も普通に名前に含まれてて繋がってるのかと思ってました
0649デフォルトの名無しさん
2011/12/10(土) 22:02:41.12実用的なプログラム書こうとしたら、WGLまでおしえなきゃ如何だろ。
DirectXに人が流れる一因じゃないか?
0650デフォルトの名無しさん
2011/12/10(土) 22:05:26.77たのんだ
0651デフォルトの名無しさん
2011/12/10(土) 22:14:03.630652デフォルトの名無しさん
2011/12/10(土) 22:19:37.93MacならCocoaでバインド。委細は違えど、どの環境でも要るだろ。
0653デフォルトの名無しさん
2011/12/11(日) 06:07:02.85おお……<<をオーバーロード!
シンプルで良いですね。ありがとうございます。
int以外を突っ込んだときの問題も解決されていてありがたい限りです。
0654デフォルトの名無しさん
2011/12/11(日) 11:16:08.04OpenGLはWindows以外で使われる事が多いし〜
WindowsならDirectX使う方が楽だし〜
0655デフォルトの名無しさん
2011/12/11(日) 17:10:20.95virtual void Hoge::Func()
{
const boost::shared_ptr<Piyo> sp(this->pPiyo);
Piyo* const p(sp.get()); // "ここ"
p->SetX(1);
p->SetY(3);
p->Print();
}
上記の"ここ"がないとアセンブリが長くなるんだけど、なぜなんだ?
0656デフォルトの名無しさん
2011/12/11(日) 17:37:58.570657デフォルトの名無しさん
2011/12/11(日) 17:43:07.200658デフォルトの名無しさん
2011/12/11(日) 17:59:32.94でもオーバーロードは
T * operator-> () const // never throws
{
BOOST_ASSERT(px != 0);
return px;
}
これだけで、BOOST_ASSERTは非デバッグ時に最適化で削除される
それでもshared_ptr::pxに関する最適化がされないものなの?
>>657
使われない部分は作成されないのは理解しているけど、>>655の例ではそれはどの部分ですか?
0659デフォルトの名無しさん
2011/12/11(日) 18:12:07.27どのコンパイラ使ってるか知らんけどMSVCならデフォだとinline指定に関わらずinline展開するかどうかコンパイラが勝手に判断するし。
0660デフォルトの名無しさん
2011/12/11(日) 18:14:52.99関数の実体が作られないわけじゃないんじゃないの
多重定義を防ぐために、オブジェクトファイル内で
多重定義があっても無視する属性を付与しておく必要があるだろうし
実験してみたらどうよ
0661デフォルトの名無しさん
2011/12/11(日) 18:48:08.78AってクラスとBってクラスがあります。
それぞれ、privateメンバとして、xとy座標を持っています。
BクラスからAクラスの座標を取得してあれこれしたい場合、
どういう設計が一番いいと思いますか?
思いついたのは、Aクラスの座標を静的メンバにして、
publicのstatic関数を作って、Bから取得する、という方法しか思いつきませんでした。
でもこれかなり変な設計な気がします。
何かアドバイス下さい。
0662デフォルトの名無しさん
2011/12/11(日) 18:52:15.220663デフォルトの名無しさん
2011/12/11(日) 18:56:00.70はぁ〜。なるほど。
頭いいですね。
ありがとうございました。
他にもいい方法があれば書いてくれると嬉しいです
0664デフォルトの名無しさん
2011/12/11(日) 19:02:47.07>BクラスからAクラスの座標を取得してあれこれしたい場合、
これがまずいような気がするんだが。
そのあれこれの処理をAクラス側に持たせるわけにはいかんのか?
できないなら素直にBに座標を読み出すメンバ関数作ればいいだけじゃないの?
0665デフォルトの名無しさん
2011/12/11(日) 19:17:42.36あれこれっていう説明が悪かったですね。
単純に座標を取得して、AとBとの角度を出したかったんです。
でもAとBは完全に独立したクラスなので、
それぞれのクラスをメンバとして持たせたくなかったんです。
第三のクラスを作って、そこからAとBクラスの座標を関数で取得して、
角度を計算することはできるんですが、それではその値は第三のクラスしか取得できません。
その角度をBクラス内で利用したかったので困ってました。
やっぱりこの場合はBクラスのメンバとしてAクラスのオブジェクトを持たせ、
そいつから関数呼び出して取得するしかないですよね。
何かお互いに独立したクラスなのに、お互いをメンバに持つのがなんか気持ち悪いんですよね。
0666デフォルトの名無しさん
2011/12/11(日) 19:19:34.36このAとBの当たり判定をする場合は、
第三のクラス内で当たり判定すべきか、それともA/Bどちらかのクラス内でするべきかどっちがいいと思いますか?
0667デフォルトの名無しさん
2011/12/11(日) 19:34:49.92コンパイラはvc2005。最適化に関する設定はデフォ
operator->自体のinlin展開はされているんだ。
ただ、>>655のとおり、sp->SetX(1) イコール p->SetX(1)にならない理由が知りたい
http://codepad.org/KeVHGvt0
"== Func4" と書かれているものは最適化の結果、Func4として展開されている
0668デフォルトの名無しさん
2011/12/11(日) 19:35:40.670669デフォルトの名無しさん
2011/12/11(日) 19:36:31.84仮にクラスAをインベーダー、クラスBを砲台としよう^^
インベーダーと砲台の衝突判定は、砲台に聞けばいい。
「おまえはインベーダーと衝突しているか?」ってね。
砲台は各インベーダーに自分の位置情報を渡して
「おまえは俺と衝突しているのか?」と聞くに違いない。
情報を要求してはいけない。
情報を与え指示するのだ。
角度もそうだ。角度の情報を画面に表示するのでもなければ、
その「角度」は何か必要な動作のために「情報」に過ぎないはず。
情報を要求してはいけない。動作を指示せよ。
ぬんぱら。
0670デフォルトの名無しさん
2011/12/11(日) 19:39:06.84衝突判定は、弾にやらせた方がいいんじゃね?
0671デフォルトの名無しさん
2011/12/11(日) 19:49:01.04AとBの親クラスで当たり判定X::Conflict( a, b );
0672デフォルトの名無しさん
2011/12/11(日) 19:50:47.53�@ broad-phase で交差する可能性のあるペアを集めて、
�A narrow-phase で物体同士の交差判定を行う
つまり、衝突判定は第3者が行う
0673デフォルトの名無しさん
2011/12/11(日) 19:51:45.19なるほど
すごい参考になりました。ありがとうございます。
>>668
座標を取得するところまでは、お互いのクラスをメンバとして持たせて取得するってことですか?
当たり判定は他のクラスの関数に座標を渡してやれってことですか?
ん〜もうちょっと考えてみます。
0674デフォルトの名無しさん
2011/12/11(日) 19:55:37.52なるほどー
やっぱり当たり判定は親クラスの方が良さそうですね。
当たり判定用の座標は親クラスからなら、
A/Bクラスのpublic関数を呼び出して取得できるので大丈夫そうです。
角度をBクラス内で利用するには、Aクラスのオブジェクトをメンバとして持たせるしかなさそうですね。
皆さんありがとうございました!
0675デフォルトの名無しさん
2011/12/11(日) 20:09:54.29いいから>>660実験してみたらどうよ
0676デフォルトの名無しさん
2011/12/11(日) 21:00:14.35e?実験する内容が分からないぞ。具体的な実験内容を教えてくれ
最適化した後はoperator->(のオーバーロード)のcallは見つからないのは確かだが
0677デフォルトの名無しさん
2011/12/11(日) 21:19:22.96当たり判定して何したいの?
衝突したいだけなら、判定単品はいらないと思うけど。
double 弾.衝突( 障壁[i] );
double 衝突( 障害物 &障害物 )
{
// 判定から、衝突の振る舞いまで、障害物にまかせる。
ベクター += 障害物.破壊衝突( 衝撃量 , this->座標 );
return ベクター.ノルム();
}
0678デフォルトの名無しさん
2011/12/11(日) 21:20:24.59シューティングゲームだったら弾じゃなくて機体のほうがいいと思う
空間登録と1つに対する判定のコストは平均して定数とすると弾と機体の数がそのまま計算コストのオーダーになる
ふつうは弾のほうが多いから弾で判定するのは良くないだろう(まあ弾同士がぶつかるとかだとどっちみち必要だけど)
0679デフォルトの名無しさん
2011/12/11(日) 21:20:35.86それはインライン化された事を確認しただけ
インライン化されたものとは別に、
インライン化されていない関数の実体が存在するかチェックすべし
0680デフォルトの名無しさん
2011/12/11(日) 21:22:36.87switchをifで書いてもぜんぜん差はないよね?
0681デフォルトの名無しさん
2011/12/11(日) 21:25:08.33マジレスしてくれてありがとう。
でも、今の話には弾は関係なかったりするんだな。
インベーダーと砲台の関係なので。
0682デフォルトの名無しさん
2011/12/11(日) 21:45:06.05switch で書ける物は
switch で書いた方が可読性は高いと思うよ
1つの変数の値で分岐してるんだな、というのが一目でわかるので
プログラムは人間も読む物なので、文脈も考えて書くと良いよ
0683デフォルトの名無しさん
2011/12/11(日) 21:53:48.72測ってみりゃいいのに。
0684デフォルトの名無しさん
2011/12/11(日) 21:57:26.640685デフォルトの名無しさん
2011/12/11(日) 22:07:28.510686デフォルトの名無しさん
2011/12/11(日) 22:13:28.23マジで。switchなんか殆ど使わんから初めて知った。
256個ぐらいか?
0687デフォルトの名無しさん
2011/12/11(日) 22:29:49.110688デフォルトの名無しさん
2011/12/11(日) 22:32:01.110689デフォルトの名無しさん
2011/12/11(日) 22:57:00.28処理スタックを下降はできても遡れるようには出来てない。
処理スタックを破壊するgoto化しないように制限は掛けてある。
0690デフォルトの名無しさん
2011/12/11(日) 23:52:00.860691デフォルトの名無しさん
2011/12/12(月) 00:42:23.560692デフォルトの名無しさん
2011/12/12(月) 00:48:51.78エラーメッセージは?
0693691
2011/12/12(月) 00:51:26.24bool型のをchar型に変換してprintfで出力したらおかしくなったんだけどどうにかならないですかね。
int main(){
bool a=1;
printf("%c",(char)a);
return 0;
}
出力: 』 が上下逆転したような文字が・・・
もしかしてcharの1(%c での1)って%dの1じゃないってことですかね?(わかりにくくてすみません)
0694デフォルトの名無しさん
2011/12/12(月) 00:56:39.29char c = '1';は違うってことはわかるよね?
0695デフォルトの名無しさん
2011/12/12(月) 00:59:36.04やっぱ違うんですか・・0~9の数字は一緒だと思ってましたw
boolの1をキャストしてcharでも1と表示させるにはどうすればいいですかね
0696デフォルトの名無しさん
2011/12/12(月) 01:05:56.721と表示するだけならこれだけでいいだろ
charでもっていう意味がわからない
数値の1を文字の'1'にしたいってことか?
0697デフォルトの名無しさん
2011/12/12(月) 01:09:56.71レスさんくす!
それがprintfではなくて、文字を描画する関数に渡すのでchar型にしないといけないんです。おうふ。
0698デフォルトの名無しさん
2011/12/12(月) 01:12:43.99sprintfは覚えといたほうがいい
0699デフォルトの名無しさん
2011/12/12(月) 01:34:48.05これで変換できるハズだが。
char ToChar(bool n)
{
return '0' + n;
}
0700デフォルトの名無しさん
2011/12/12(月) 01:42:41.15ありがとう!!
今アドバイス通り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がイったってのはわかるのですが、それがどういう原因によるものなのかがわからなかったので知恵を貸して下さい。
(何度もすみません)
0701デフォルトの名無しさん
2011/12/12(月) 01:49:09.53size_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);
単に型合わせればこんな感じだろ。
0702デフォルトの名無しさん
2011/12/12(月) 02:18:35.33レスありがとう
boolの配列をcharに組み込みたく、
最初はfor内で
sprintf_s(c[i],1,"%d",b[i])でやってたのですが、
c[i]に下線でエラー(sprintf_sの引数リストと一致しません)ってでたので、
&にしたら直ったのでそのままやってました・・
boolの配列をcharに処理したいです。
0703デフォルトの名無しさん
2011/12/12(月) 07:35:01.96最後にヌル文字つけれ
あと文字コードについて勉強すれ
0704デフォルトの名無しさん
2011/12/12(月) 08:07:41.76static CLASSA a;
ってやっても実行されない?
つまりシングルトンにしたクラスって、
コンストラクタ実行できないの?
0705デフォルトの名無しさん
2011/12/12(月) 08:21:07.320706デフォルトの名無しさん
2011/12/12(月) 08:21:59.240707デフォルトの名無しさん
2011/12/12(月) 08:22:23.27静的メンバ変数 初期化
でぐぐれ
0708デフォルトの名無しさん
2011/12/12(月) 08:53:27.22ありゃと
0709デフォルトの名無しさん
2011/12/12(月) 10:30:40.13char *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);
}
という風で出来かなと思いましたが、うまくいきません。
0710デフォルトの名無しさん
2011/12/12(月) 10:47:14.61"
0711デフォルトの名無しさん
2011/12/12(月) 11:38:26.49void hage( char **result) {
*result = data;
}
void main() {
char *r;
hage(&r);
printf(r);
}
0712デフォルトの名無しさん
2011/12/12(月) 11:46:47.460713デフォルトの名無しさん
2011/12/12(月) 13:29:30.57どうもありがとうございました
BASICからだと、アドレス渡しって点がムズイです。。
0714デフォルトの名無しさん
2011/12/12(月) 15:00:59.86visual 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) で定義されています。」のようなエラーが出たため、考え違いのようです。
いま、英語圏をぐぐっているのですが、あまり英語が堪能ではなく、困っています。
以上、この件で私に不足していると考えられる知識をご存知であれば、御教示お願いします。
0715デフォルトの名無しさん
2011/12/12(月) 15:03:11.84スレ違い。環境依存OKスレでどうぞ。
0717デフォルトの名無しさん
2011/12/12(月) 15:13:50.560718714
2011/12/12(月) 15:28:55.45ありがとうございます。
そちらで出直します。
蛇足ですが、_a_dll.lib というのは、ファイル名の規則かと思ったのですが、libxmlのローカルな表現のような気がしてきました。
0719デフォルトの名無しさん
2011/12/12(月) 17:42:50.11出来るのでしたら書式を教えて下さい
0720デフォルトの名無しさん
2011/12/12(月) 17:53:45.430721デフォルトの名無しさん
2011/12/12(月) 18:06:05.70}
の()にint型とstring型の引数を入れることは出来ますかという意味です
0722デフォルトの名無しさん
2011/12/12(月) 18:07:43.120723デフォルトの名無しさん
2011/12/12(月) 18:10:12.150724デフォルトの名無しさん
2011/12/12(月) 18:37:41.90int A(int i);
int A(const string& s);
の両方を宣言して両方を実装すればOK
0725デフォルトの名無しさん
2011/12/12(月) 18:58:21.63INT_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);
}
};
0726デフォルトの名無しさん
2011/12/12(月) 21:42:59.81内容はどうでもいいが列挙型を大文字で書くな。CとC++のタブーだろうが。
0727デフォルトの名無しさん
2011/12/12(月) 22:22:24.5455 %int Aに代入
7 %int Bに代入
12.6 %double C
上のような感じにして、%以下からその行末までをコメントアウトとしたいです。
このファイルをプログラム起動時に読み込み、コメントのように代入するにはどうしたらいいですか。
使っているのはC++です。 よろしくお願いします。
0728デフォルトの名無しさん
2011/12/12(月) 22:22:52.060729デフォルトの名無しさん
2011/12/12(月) 22:30:58.22よく解からんな。特に2点。
1. iniと書いてるけどオリジナルフォーマットだろ。
2. 行頭に読み込む値があるだけか?
ただこれだけだったら、std::fstreamのreadで全部読み込んで、
1文字(バイトに非ず)ずつ確認して切り落とせば済むだろうけど。
何をしたいのかがいまいち解からん。
0730727
2011/12/12(月) 22:42:15.17さんくす
1,iniにした意味は、txtよりも設定のちょっと大事なファイルとして他人に意識してもらいやすいかなと思ったので。
2,はい。行頭だけです
行頭の値を読み込むのはなんとかわかったのですが、
読み込んだあと、次の行に移るという動作をするにはどうすればいいいのでしょうか。
また、%まで来たら次の行に移るにはどういう方法が考えられますか。
よろしくお願いします。
0731デフォルトの名無しさん
2011/12/12(月) 22:47:17.710732デフォルトの名無しさん
2011/12/12(月) 23:06:23.53FILE* 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++じゃないけど。
0733デフォルトの名無しさん
2011/12/12(月) 23:12:03.54.config は XML のイメージあるし、
.cfg はいい落としどころかもね
0734デフォルトの名無しさん
2011/12/12(月) 23:16:44.33sscanf使うぐらいなら、fscanfだっけ?あれ使えば?
const char *format = "%d%*[^\n]";
fscanf( file, format, &a );
fscanf( file, format, &b );
fscanf( file, format, &c );
0735デフォルトの名無しさん
2011/12/12(月) 23:26:03.65#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);
}
}
0736デフォルトの名無しさん
2011/12/12(月) 23:27:21.70scanf()系はエラー処理が面倒な感じで普段使わないからフォーマット文字列とか
エラーのときの挙動とかよく憶えてないんだよね。
0737デフォルトの名無しさん
2011/12/12(月) 23:28:28.16戻り値で成否数えて、バッファクリアするだけじゃん。
0738デフォルトの名無しさん
2011/12/12(月) 23:41:07.94今回みたいに行単位ならいいけど、そうでなかったら面倒じゃない?
なんか簡単な方法あるのかな。
あと、たとえばscanf("%d %d",・・・) とかやってて、オーバーフローのエラーチェックが必要ですってことになって、
fgets()とstrtol()の組み合わせに変更したら挙動が変わっちゃうけど、最初からfgets()とsscanf()だったら、
strtol()とかで自前でパースするようにしても、ストリームの消費の挙動は変化しないし。
0739727
2011/12/12(月) 23:45:49.53なるほど。iniにフォーマットあるとは知りませんでした。
cfgにさせてもらいます。
>>732
ありがとうございます!
ちなみにこれ、次の行に移る処理はどこで行っているのでしょうか。sscanf()?
>>735
C++でありがとうございます!
C++のが若干面倒くさそうなんですね。
get_value関数内のgetline()の終了で次の行に移るんですかね。この辺の理解が足りてません、、、ぐほう
template<typename T>も分からないので調べてきます。
0740デフォルトの名無しさん
2011/12/12(月) 23:47:43.53ファイルポインタは独自に現在地を保持してて、それの挙動をわかった上でその書き方になる。
0741デフォルトの名無しさん
2011/12/12(月) 23:51:43.28>fgets()とstrtol()の組み合わせに変更したら挙動が変わっちゃうけど、最初からfgets()とsscanf()だったら、
>strtol()とかで自前でパースするようにしても、ストリームの消費の挙動は変化しないし。
ごめん解るようで言いたいことがよく解からん。
0742デフォルトの名無しさん
2011/12/12(月) 23:52:00.63>次の行に移る処理はどこで行っているのでしょうか。
fgets()を呼ぶたびに、一行、次の一行って読み込まれる。
0743デフォルトの名無しさん
2011/12/13(火) 00:00:42.74scanf("%d %d")だと、
「99 100」と一行で入力しても
「99
100」と二行で入力しても同じように動くけど、
これをfgets()に変更して同じ挙動を再現するのって大変じゃん。
あと、エラーがおきて一行クリアとかやってると、上のは二つともクリアされるけど
二つ目はひとつしかクリアされないとか。
細かいことは忘れたけど、scanf()系はいろいろ考えることがあって、テキストの入力はシンプルに
行単位か文字単位を使うことにした。
0744727
2011/12/13(火) 00:06:41.29ほうほう
>>742
そうだったんですか!!よく分かりました!ありがとう!!
同じ行で%以下を読み込まないようにするには
ttp://homepage1.nifty.com/emil/stream.html
上のページにあるように、
basic_istream& getline(char* buf, int size, char term)
を使ってchar termに ' % ' を渡すだけですよね?
0745デフォルトの名無しさん
2011/12/13(火) 00:15:27.39それだめなんじゃない?
「次の読み込は終端記号の次の文字から始まる」ってあるから
%まで読んで、次にgetline()呼んだら%の次から読み込まれそう。
0746デフォルトの名無しさん
2011/12/13(火) 00:38:01.41% を検索してそこで文字列を打ち切れば良い
0747デフォルトの名無しさん
2011/12/13(火) 00:52:12.46は!確かに。。。
>>746
そうすることにします。ありがとうございます。
読み込み位置の指定で次の行にしたいと思い、
さっきのページで、termまで読み飛ばす関数、
ignore(int n, char term)をみつけたので、このtermを '\n' にすればいいですかね。
他にも何か次の行に移るよさげなやり方があればお聞きしたいです。
普通はignoreはそんなに使わないんですかね。
0748デフォルトの名無しさん
2011/12/13(火) 01:34:00.48俺も全然使わないけど、こってみると色々と面白いぞ。
例えばコレとか。 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);
}
0749748
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);
}
0750デフォルトの名無しさん
2011/12/13(火) 04:22:51.010751デフォルトの名無しさん
2011/12/13(火) 07:20:15.27C++らしくなら、マニュピレーター使ってコメントすっ飛ばすぐらいの方がよくね。
int a,b,c;
is >> a >> Skip( "%", "\n" );
is >> b >> Skip( "%", "\n" );
is >> c >> Skip( "%", "\n" );
0752デフォルトの名無しさん
2011/12/13(火) 20:11:35.970753デフォルトの名無しさん
2011/12/13(火) 20:28:37.360754デフォルトの名無しさん
2011/12/13(火) 20:35:23.150755デフォルトの名無しさん
2011/12/13(火) 20:36:23.630756デフォルトの名無しさん
2011/12/13(火) 23:42:01.56お互いのインスタンスをそれぞれのメンバ変数に保持しておく方法はまずい?
0757デフォルトの名無しさん
2011/12/13(火) 23:49:28.130758デフォルトの名無しさん
2011/12/13(火) 23:49:44.250759デフォルトの名無しさん
2011/12/13(火) 23:56:10.58UI部品とコントローラーとか、よくあるパターンじゃん。
ただし、親クラス経由で互いに参照するけどね。
0760デフォルトの名無しさん
2011/12/14(水) 00:24:50.48おおそれです!
実はそんな設計で作っていたので変かな?と思ってたんですけど安心しました
皆さんありがとうございました
0761デフォルトの名無しさん
2011/12/14(水) 08:44:49.92N対Mの参照だったら直接相手の参照を持ちたくないな
リンクのペアのリストを持ったマネージャを共有するほうがいい
0762デフォルトの名無しさん
2011/12/14(水) 09:08:10.530763デフォルトの名無しさん
2011/12/15(木) 00:13:18.12みたいのを配列に一文字ずつ分割して格納していくことって出来ませんか?
abcまでなら何とかなるんですけど”あいう”みたいな日本語が入ると変な結果になってしまいよく分かりません
どなたかお願いします
0764デフォルトの名無しさん
2011/12/15(木) 00:36:12.120765デフォルトの名無しさん
2011/12/15(木) 00:40:02.56mbstowcsでwchar_tに変えてしまえば、楽ではある。
ただし、UTF-16やUTF-8を使用してる場合は、サロゲートペアや
合成文字の問題があるのでかなり難しい。
0766デフォルトの名無しさん
2011/12/15(木) 01:12:28.07聞きなれない単語が多く理解が追いついているか怪しいですが
自分がやりたかった事はひとまず何とかなりそうです
ありがとうございました
>>764
おそらくですけど765氏の >wchar_tに変えてしまえば
と同様の示唆でしょうか?
ヒントを頂いたと思い765氏の書いた事と共にこれから勉強したいと思います
ありがとうございました
0767デフォルトの名無しさん
2011/12/15(木) 07:58:24.68サイトによって言ってることが違ったりする。
0768デフォルトの名無しさん
2011/12/15(木) 08:04:08.640769デフォルトの名無しさん
2011/12/15(木) 12:41:23.280770デフォルトの名無しさん
2011/12/15(木) 12:50:46.980771デフォルトの名無しさん
2011/12/15(木) 22:48:24.06C++のlocaleは死んでるからCかOSのlocale調べて使いな
0772デフォルトの名無しさん
2011/12/16(金) 07:38:45.540773デフォルトの名無しさん
2011/12/16(金) 20:55:28.10public:
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回りてる間に要素が増減する場合ってどうするの?
いちいちコンテナを複製してから回すとコストがかかっていやな気持になる気がします
0774デフォルトの名無しさん
2011/12/16(金) 21:00:37.920775デフォルトの名無しさん
2011/12/16(金) 21:02:09.87ちゃんと実装されてないどころか、
マルチバイトをマトモに扱える仕様じゃない。
0776デフォルトの名無しさん
2011/12/16(金) 21:06:47.36どうでもいいが、どうやったらこんな誤字になるんだろう。
別に責めてるわけじゃない。純粋に気になる。
0777デフォルトの名無しさん
2011/12/16(金) 21:09:33.82gotoとかジョーク言ってみる。
っていうかコードが完全じゃないから意図が読めない。
0778773
2011/12/16(金) 21:19:26.99追加要素の為のバッファーを別途用意すれば余裕でしたね
0779デフォルトの名無しさん
2011/12/16(金) 21:40:22.61禁書じゃないのかなw
0780デフォルトの名無しさん
2011/12/16(金) 21:52:50.52作りがおかしい。bindで委譲してオブジェクトを操作するのは構わない。
ただ、bind関数を呼び出した側は、bindが内部操作のある仕様だと
解ってるはずなんでそういう使用の仕方をしちゃいかん。
あと、ループ中でコンテナの増減なんかしたらループの停止理由が
意味不明になるだろ。1つ前の要素のせいでループが停止し、次の要素が
操作できないとかありうる。その場合、次以降の要素が振る舞いをできなく
なる明確な理由を答えられないだろ。
0781デフォルトの名無しさん
2011/12/16(金) 21:54:00.690782デフォルトの名無しさん
2011/12/17(土) 00:00:32.070783デフォルトの名無しさん
2011/12/17(土) 02:50:56.790784デフォルトの名無しさん
2011/12/18(日) 00:50:46.39cout<<... とか cin>>...
はキモイとか言う奴いるけど、bitのシフトは2のn乗をかけたり、
2のn乗で割ったりしてもできる。
>> や << をビットのシフトに使うC言語の方に問題がある。
0785デフォルトの名無しさん
2011/12/18(日) 01:16:40.89突然どうしたの?発作?
0786デフォルトの名無しさん
2011/12/18(日) 01:28:42.58n乗するのとシフト演算じゃ速度が全然違うの解ってる?
a = m << b;
a = m * c;
cを128とか指定すれば確かに、ビット分ずらせるが、
式を見ただけじゃコンピューターは2の累乗かは判断できん。
なので、乗算したら乗算回路が走る。
乗算回路は、乗算するレジスタのbit数分シフト演算と加算を行うため極めて遅い。
つバレルシフタ
回路によっては瞬時に計算できることも。
0788デフォルトの名無しさん
2011/12/18(日) 04:10:15.42CPUの一部しか使わないのに最大電圧で計算してしまいます
省電力で計算させるAPIはないのでしょうか?
0789デフォルトの名無しさん
2011/12/18(日) 04:18:40.65それは、回路の問題で、APIとか関係ないから。
もししたいなら、マザーボード改造するしかない。
0790デフォルトの名無しさん
2011/12/18(日) 04:27:06.96何が言いたいんだ?
Cにシフト演算子がついてるのがおかしいと言ったから答えたんだぞ。
Cは、ハードウェア制御(OS開発)を目的に作られてて、
NICなんかで必要となる高速演算のためにビット演算子を持ってるのは当たり前だろ。
0792デフォルトの名無しさん
2011/12/18(日) 06:22:24.12iscarry(), isnocarry() を自作してリンクするくらいか。
0794デフォルトの名無しさん
2011/12/18(日) 09:44:33.62> Cにシフトがあるのにキャリー扱えないのが不思議
当時は、キャリーがないマシンとかもあったからね。
0795デフォルトの名無しさん
2011/12/18(日) 10:03:42.39暗号化とか
0796デフォルトの名無しさん
2011/12/18(日) 10:24:30.26特別な理由がなければ使うべきではない
0797デフォルトの名無しさん
2011/12/18(日) 10:28:17.93むやみやたら使うとひどいことになるもんなぁ
0798デフォルトの名無しさん
2011/12/18(日) 10:44:43.190799デフォルトの名無しさん
2011/12/18(日) 12:24:10.53別にいくらオーバーロードしようと構わんけどな
1つのテンプレートで済むものを、クラス用と値型用2つ作るほうが、
ばかばかしいと思うしな
0800デフォルトの名無しさん
2011/12/18(日) 12:54:14.02数学上で定義されてる演算をすべて定義できるわけじゃないし
この*は内積と外積どっちだよドキュメント見るのめんどくせぇよ最初から両方とも関数にしろカスってなるし
0801デフォルトの名無しさん
2011/12/18(日) 13:23:47.07使ってるの見た事無い
*はスカラー積だけ
0802デフォルトの名無しさん
2011/12/18(日) 13:36:56.44要素同士の掛け算てなんて言うんだろうね?
0803デフォルトの名無しさん
2011/12/18(日) 14:22:40.370804デフォルトの名無しさん
2011/12/18(日) 14:31:39.23C++ の << >> は基地外かと思った
0805デフォルトの名無しさん
2011/12/18(日) 15:08:38.300806デフォルトの名無しさん
2011/12/18(日) 15:35:17.310807デフォルトの名無しさん
2011/12/18(日) 16:50:00.540808デフォルトの名無しさん
2011/12/18(日) 23:54:30.51外積はクロス積のこと?だったら×をオーバーロードすべきで、*をオーバーロードしちゃらめでしょ^^
っていうか、ベクトルは複素数で扱うと積の計算簡単でいいね^^
0809デフォルトの名無しさん
2011/12/19(月) 00:05:09.370810デフォルトの名無しさん
2011/12/19(月) 00:47:00.97ベクトルの実装を、2階テンソルで考えれば * はテンソル積を
割り当てるのが妥当。外積、内積は、Dot( t1, t2 ); Cross( t1, t2 );と関数で
計算するほうが自然。
0811デフォルトの名無しさん
2011/12/19(月) 00:51:31.600812デフォルトの名無しさん
2011/12/19(月) 01:21:41.080813デフォルトの名無しさん
2011/12/19(月) 01:45:55.23一つ言わせてもらうなら、
> 外積、内積は、Dot( t1, t2 ); Cross( t1, t2 );
前後で順序が逆になっているのが不自然
0814デフォルトの名無しさん
2011/12/19(月) 01:52:21.75横からだけど、コード組んだことあれば、関数名見るだけでわかるけど。
っていうか、外積と内積という変な名前があんまり好きじゃないな。
0815デフォルトの名無しさん
2011/12/19(月) 05:24:39.36内積 Dot( t1, t2 );
0816デフォルトの名無しさん
2011/12/19(月) 06:11:59.60内積が定義できない空間はあると思うし
ドット積(R3内積)みたいに特定の空間に特化したものにならざるを得ないのでは
0817デフォルトの名無しさん
2011/12/19(月) 07:35:37.39std::inner_productの仕様に合わせてクラスを作るんだ
内積が定義できない空間はそもそも
数学的に定義できないのに求められるわけがない
ナンセンス
0818デフォルトの名無しさん
2011/12/19(月) 08:22:59.09距離が導入できればできるんだろ。
Z/(n)とかだったら距離は入れられないか?
0819デフォルトの名無しさん
2011/12/19(月) 10:42:57.620820デフォルトの名無しさん
2011/12/19(月) 10:58:08.920821デフォルトの名無しさん
2011/12/19(月) 12:42:16.260822デフォルトの名無しさん
2011/12/19(月) 17:59:02.38最初から関数にしておけば時間を無駄にすることもなかったのにな
0823デフォルトの名無しさん
2011/12/19(月) 19:27:55.57それは現実の要請に従った結果であって、
いやならC++を使わなければいい
ただそんだけ^^;
0824デフォルトの名無しさん
2011/12/19(月) 19:32:32.23そろそろ乗り換えるべきクールな言語を開発しないと人類の発展そのものに大きな抵抗が生じる
0825デフォルトの名無しさん
2011/12/19(月) 19:37:05.76で、Goとか出てるけど人気ないし、レガシー引っ張るほうがパイがでかくてコミュニティが大きくなるんだよな。
レガシー切ったほうがいいとは思うけど、再学習コストってやっぱ払いたくないものなのかな。
0826825
2011/12/19(月) 19:42:16.78コレなら、少なくともストップザワールドにはならないとおもうんだけど。
0827デフォルトの名無しさん
2011/12/19(月) 19:43:59.73若い世代には積極的に新しいことやらせたほうがいいよ
前時代的な慣習を押し付けるのは可哀想だ
0828デフォルトの名無しさん
2011/12/19(月) 19:47:12.38新しい言語の時代はいつか来る。その準備が必要だ。
しかし、古い知識は無駄にはならない。
だが自動車の時代にいつまでも馬車で走るのはナンセンスだ^^
愚痴ってないでさっさとやれ^^
0829デフォルトの名無しさん
2011/12/19(月) 19:51:49.52コンパクション無しのGCならできそう
0830デフォルトの名無しさん
2011/12/19(月) 20:41:46.48新陳代謝のサイクルとしてはたしかにそうだよね。
日本は社会的に型システムが更新されないから、大分古くなってきてるよな〜。
受け手もやり手もそっちに合わせないといけないから中間コストがすごいめんどい。
>>828
サーセン。
車と馬車か。なるほど。参考にします。
>>829
確かにできそうですなー。
フラグメントしないように短命な汎用メモリの使用時の最大長を固定しておけばフラグメントはある程度どうにかなりそうですな。
で、コンパクションがネックなんですな〜。
コピーGCを採用しつつアドレスを持つ特定の変数をリファレンスにすれば一発で通知できるかなぁ・・・。
コピー作ってる間も止まらないし、準備して終わったらスワップすればいいのかな。
うーむ、専門外すぎる・・・。でも面白い!!
0831825=830
2011/12/19(月) 20:48:08.910832デフォルトの名無しさん
2011/12/19(月) 21:08:42.07なぜ上げた、俺・・・。Orz
0833デフォルトの名無しさん
2011/12/19(月) 21:10:54.280834デフォルトの名無しさん
2011/12/19(月) 21:12:53.48ネットみてても、Dの噂が聞こえてこないのだけど、進んでるのかぁ。
自分も一回ハマったから期待したいね。
0835デフォルトの名無しさん
2011/12/19(月) 21:17:02.550836デフォルトの名無しさん
2011/12/19(月) 21:17:55.330837デフォルトの名無しさん
2011/12/19(月) 21:35:21.23言語的にも多少手は入ってる
0838デフォルトの名無しさん
2011/12/19(月) 21:57:09.41そもそも演算子オーバーロードへの難癖が発端なのに
だからoperatorは糞なんだよ(キリって・・・
0839デフォルトの名無しさん
2011/12/19(月) 22:12:33.710840デフォルトの名無しさん
2011/12/19(月) 22:19:45.990841デフォルトの名無しさん
2011/12/19(月) 22:24:20.54operatorの使い方はクラス設計者が利用者に強制するべきではないと俺は思うんだよね
//"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なんて極論すると利用者が楽するためのものなんだから
利用者が使いたいように勝手に作るのが筋だろ
0842デフォルトの名無しさん
2011/12/19(月) 22:28:08.290843デフォルトの名無しさん
2011/12/19(月) 22:34:03.68値型のテンプレートを流用できさえすりゃトントンなんだよ。
0844デフォルトの名無しさん
2011/12/19(月) 22:42:10.66普通に関数オブジェクトバージョンも用意されてるから別に組み込み準拠してなくても困らないよな
さらにラムダが普及すればこの傾向はますます強くなるだろう
特定の外部クラスや外部関数のために、そのクラスにとって本質的には必要ない演算子を定義するという邪悪さから解放されるほうが重要
0845デフォルトの名無しさん
2011/12/19(月) 23:19:05.52C++の悪友の事ですね。
0846デフォルトの名無しさん
2011/12/20(火) 00:37:33.96これが出来ればなぁ‥
0847デフォルトの名無しさん
2011/12/20(火) 00:46:31.30そもそもSmalltalkを初めとして、オブジェクト指向言語にとっちゃ
演算子は基本的なメッセージでしかないんだけどな。
OOPL流儀で動作が分かりづらいと思うんなら、他のベターCにでも
移ったほうがいいんじゃない?
Objective-Cならgccやclangのフロントエンドで組み込みにも使えるぜ。
0848デフォルトの名無しさん
2011/12/20(火) 01:05:19.29>>844はクラス依存性の話であって演算子が邪悪って話じゃないでしょ。
0849デフォルトの名無しさん
2011/12/20(火) 12:07:44.950850デフォルトの名無しさん
2011/12/20(火) 12:20:18.76void hoge::func(hoge const & other) {
operator += (other);
*this += other;
add(other);
}
どう考えても3番目がいいだろう
0851デフォルトの名無しさん
2011/12/20(火) 12:36:42.550852デフォルトの名無しさん
2011/12/20(火) 13:28:55.87これってなんなんでしょうか?論理演算子のようなんですけど。
読み方だけでも教えてください。お願いします。
0853デフォルトの名無しさん
2011/12/20(火) 13:35:17.02AND演算子とXOR演算子だったような気がする。
0855852
2011/12/20(火) 13:55:36.19いえ、あってます。読み方と意味は合ってます。ありがとうございます。
ただ、これが
X &~ Y
と書いてあったのでよくわかんないんです。
&~でググってもよくわかんないです。
単純に組み合わせてあるだけなんですかね?
0856デフォルトの名無しさん
2011/12/20(火) 14:02:26.32つまりYに立ってるビットをXから取り除くことができる
~YでYに立ってるビットが反転するっていうのは知ってるよね?
int a = 0x101;
int b = 0x111;
int c = b & ~a; // c == 0x010
0857デフォルトの名無しさん
2011/12/20(火) 14:02:45.660858852
2011/12/20(火) 14:09:22.28どっちもビット演算子だったんですね。
>>856-857
ありがとうございます。よくわかりました。
0859853-854
2011/12/20(火) 14:16:48.82最近自分が置いてかれる側になってきたなぁ。
不味い!
>>856-857
ほえー。勉強になります。
>>858
余計なこと言ってスマナイ。
0860853-854
2011/12/20(火) 14:21:12.50XORはサーカムフレックスだってさ。
俺、ヤバイな。Orz
ttp://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97
0861デフォルトの名無しさん
2011/12/20(火) 17:15:07.54しかし、C++なら素直に bitset<N> を使ったほうが便利なのだった^^
あと、VC++ならvector<bool>でもいいね。最適化で bitset と同等の速度になるから。
ただ、書き込みをバイト単位で行うらしく、マルチスレッドでは使えないけど^^
あと、GCCでは全然高速化しない。なぜなんだろう^^
0862デフォルトの名無しさん
2011/12/20(火) 19:49:55.570863デフォルトの名無しさん
2011/12/20(火) 22:01:51.24public:
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;
}
こう書いた場合に変数の寿命は大丈夫でござるか?
0864デフォルトの名無しさん
2011/12/20(火) 22:26:09.670865デフォルトの名無しさん
2011/12/20(火) 23:06:18.36class CSuper
{
protected:
int m_protected;
};
class CSub : public CSuper
{};
//main.cpp
#include "sample.h"
int main()
{
CSub sub;
sub.m_Protected=1;
return 0;
}
これってできないの?
0866デフォルトの名無しさん
2011/12/20(火) 23:26:32.000867デフォルトの名無しさん
2011/12/20(火) 23:33:28.800868デフォルトの名無しさん
2011/12/20(火) 23:34:34.52親が公開しないと子を通じてもアクセスできないの?
0869デフォルトの名無しさん
2011/12/20(火) 23:37:40.25マイクロソフト的ハンガリアン(悪い方のハンガリアン、システムハンガリアン)を想起させて馴染めないなー^^;
0870デフォルトの名無しさん
2011/12/20(火) 23:38:33.70子クラスも親が、自分以外にメンバーを後悔しないことを
アテにして使用してんのに信用できなくなる
0871デフォルトの名無しさん
2011/12/20(火) 23:41:10.82個人的には、アリだと思ってる。例え、クラスで単位を定義していても、
代入先との単位変換とちったらとんでもないことになるからね。
0872デフォルトの名無しさん
2011/12/21(水) 00:03:24.81hoge_でもいいけどアンスコとmどっちが生理的に受け付けないかの差でしか無い
thisの代わりになって短ければ何でもいい
>>871
数値ラッパーを作って(普通はTMPで)型安全にするからハンガリアンは要らないよ
0873デフォルトの名無しさん
2011/12/21(水) 05:24:43.01g、mの違いは本来のハンガリアンに近いからいいけど、
mm、cmとかの接頭句は無しだと思う。
0874デフォルトの名無しさん
2011/12/21(水) 08:44:43.000875デフォルトの名無しさん
2011/12/21(水) 09:01:00.790876デフォルトの名無しさん
2011/12/21(水) 10:11:27.110877デフォルトの名無しさん
2011/12/21(水) 12:21:04.590878デフォルトの名無しさん
2011/12/21(水) 14:32:29.22ゲームキャラクターとかつくろうとすると概念的に直交したインターフェースを何個も継承してて気持ち悪いんだけど気にしたら負けなのかな
0879デフォルトの名無しさん
2011/12/21(水) 15:03:55.11勉強した手法を総動員したがるな
0880デフォルトの名無しさん
2011/12/21(水) 18:44:03.12どっかの教官が良いそうなセリフ
0881デフォルトの名無しさん
2011/12/21(水) 19:24:10.100882デフォルトの名無しさん
2011/12/21(水) 19:29:53.99インターフェースになるクラス作ってないよな。
DelegaterとかDictionalyとかRegistoryとか、あくまで機能で
クラスを分けなさい。ユーザーサイドの視点でクラスを作ると
無駄が増えるだけ。
0883デフォルトの名無しさん
2011/12/21(水) 22:38:21.29以下のように
例)
Func(NUM,a,b,c...)
一つ目の引数に個数を入れてvar_listを利用する手法がよくありますが、
C++で一つ目に個数を入れずに実現する手法はないでしょうか。
0884デフォルトの名無しさん
2011/12/21(水) 22:46:57.01デリミタを要求する場合は個数は必要ない
ただ、デリミタを書かなかったら暴走する諸刃の剣
素人にはお勧め出来ない
0885デフォルトの名無しさん
2011/12/21(水) 22:58:07.290886デフォルトの名無しさん
2011/12/21(水) 23:16:29.31template<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 ) );みたいな感じで使う。
0887デフォルトの名無しさん
2011/12/22(木) 00:36:13.32えっ
何、じゃあ俺が作ったユニットとそこから派生するプレイヤー、フレンド、エネミークラス破棄した方が良い?
0888デフォルトの名無しさん
2011/12/22(木) 01:13:15.39レスありがとうございます。
可変長引数を解析する関数をどうすればいいか、良い案が浮かばなくて・・・。
>>886
レスありがとうございます。
この方法だと引数の数だけ関数をオーバーロードするってことですよね?
可能であればテンプレート等を駆使して関数は一つだけ定義したいと考えています。
0889デフォルトの名無しさん
2011/12/22(木) 02:47:09.93tuppleの実装とか見る限り、現状では引数の数だけ書くしかないんだろうね。
まさにマクロで書くしかあるまい。
0890デフォルトの名無しさん
2011/12/22(木) 02:59:16.91解ってない気がするので補足するが、_(・・・);って関数は複数定義するが、
Funcの方に関しては、定義は1つでいい。
_(・・・)って関数の中には、目的の処理は書かない。あくまで、可変長引数オブジェクトを
生成するだけだ。_(・・・);はC++03の制約上どうしても複数作成する必要がある。
boostとか有名ライブラリも可変長引数を実装するときは複数定義してる。
大体20個でも引数定義してしまえば、以降定義する必要は無くなるんだから、
そんなに気にしないでいいと思うぞ。200だの300だの引数が必要になるなら、
そもそもコードがおかしいし。
0891デフォルトの名無しさん
2011/12/22(木) 05:00:07.91レスありがとうございます。
やはりマクロしかないですか・・・。
C++ならテンプレートとマクロを駆使すれば
たくさん定義を書かなくて済みそうだと思ったのですが、
無理みたいですね・・・。
>>890
886と同じ人でしょうか?
何度もレスをしていただいて本当にありがとうございます。
886のほうの書き込みは理解できたのですが、
_(a,b,c...)
↑クラス名のこの部分を書かずに済まない方法を探していたので・・・。
確かに気にしなくてもいい部分なのですが
やっぱり取り外せたらうれしいなと^^;
「C++テンプレートテクニック」を読んでから
妙に気持ちが高揚してしまって。
演算子オーバーロードとテンプレートがあればなんでもできる!と
上記二つを過信していたようですorz
色々と相談に乗っていただいてありがとうございました。
0892デフォルトの名無しさん
2011/12/22(木) 07:18:08.45どうとでもなるけどね
0893デフォルトの名無しさん
2011/12/22(木) 09:58:04.81以下のように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です。
0894デフォルトの名無しさん
2011/12/22(木) 10:48:36.434.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
0895デフォルトの名無しさん
2011/12/22(木) 12:13:35.47よく、NULLがオーバーロードでintが呼び出されるか
void*が呼び出されるかが問題視されていますが
これだと、せっかく型の付いた変数に入れているのに
同じような問題が起きそうですね。
これから気をつけようと思います。
ありがとうございました。
0896デフォルトの名無しさん
2011/12/22(木) 12:49:04.56キャスト付き?
0897デフォルトの名無しさん
2011/12/22(木) 15:53:38.07void 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であるということを認識しないといけないな。
0898デフォルトの名無しさん
2011/12/22(木) 16:19:32.35変更できるようなのですが、このような使い方は
問題ないのでしょうか?
int a = 1;
union HOGE{
int &r;
int *p;
} b = { a };
int c = 2;
b.p = &c;
0899デフォルトの名無しさん
2011/12/22(木) 16:47:42.419.5 Union
If a union contains a static data member, or a member of reference type, the program is ill-formed.
0900デフォルトの名無しさん
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
0901デフォルトの名無しさん
2011/12/23(金) 01:22:21.530902デフォルトの名無しさん
2011/12/23(金) 02:00:54.50in.txtの2,3の後に改行がないとか文字コードがUnicode(utf-16)とか?
0903デフォルトの名無しさん
2011/12/23(金) 08:14:41.46混ぜてもいいがsync_with_stdio(true)にする必要がある
そして当然だが遅くなる
0904デフォルトの名無しさん
2011/12/23(金) 11:54:09.490905デフォルトの名無しさん
2011/12/23(金) 12:02:32.770906デフォルトの名無しさん
2011/12/23(金) 12:15:30.230907デフォルトの名無しさん
2011/12/23(金) 12:15:41.260908デフォルトの名無しさん
2011/12/23(金) 13:03:32.04今はどうなのか分からないけど
http://d.hatena.ne.jp/s-yata/20100726/1280138663
falseにするとかなり速くなるらしい
0909デフォルトの名無しさん
2011/12/23(金) 14:10:07.830910デフォルトの名無しさん
2011/12/23(金) 14:15:29.30あるよ。じゃないと走査処理ができない。
[]使うと勝手に要素増えちゃうし。
0911デフォルトの名無しさん
2011/12/23(金) 14:22:05.920912デフォルトの名無しさん
2011/12/23(金) 15:00:10.200913デフォルトの名無しさん
2011/12/23(金) 15:03:49.52挿入と削除にはメンバ関数を使う
insertとerase
但し挿入時のイテレータの値はヒントに過ぎず、どちらにしろ自動的にソートされる
(というか木構造が勝手に変わる)
0914デフォルトの名無しさん
2011/12/23(金) 15:05:25.55i = m.erase(i);
で削除しながら進めるけど
setだとeraseの返り値が無いんですけどどうすればいいんでしょうか
0915デフォルトの名無しさん
2011/12/23(金) 15:08:59.500916デフォルトの名無しさん
2011/12/23(金) 15:15:31.71まさか地図か?
0917デフォルトの名無しさん
2011/12/23(金) 15:16:16.20小学生みたいな揚げ足取りはやめなさい
みっともないですよ
0918デフォルトの名無しさん
2011/12/23(金) 15:17:21.82ダウト
mapのeraseはオーバーロードされていて、値を引数に取ると削除した数を返すが
イテレータを引数にするとsetと同じく何も返さない
0919デフォルトの名無しさん
2011/12/23(金) 15:17:45.21入力するとき、キーもあるからキーをintということにして
始めにイテレーターに入力したやつのキーを0、次を1、次を2、次を3、
次を4、次を5、次を6、次を7のように順番に入れたいと思うのです。
イテレーターから出すときは0から順番に出したいということはできませんよね?
0920デフォルトの名無しさん
2011/12/23(金) 15:18:43.42setはeraseすると次の要素の位置を返すがmapは返さないんだった
つまり>>914は逆なわけだ
0921デフォルトの名無しさん
2011/12/23(金) 15:25:36.26キーでソートされてしまうから取り出す時の順番は大抵全然入力時と関係がない
それにmultimapを使わないと同じキーを入れれないし
std::map<int, int> mii;
mii[1] = 1;
mii[1] = 2;
std::cout << mii[1] << std::endl;
とやると2と出力される
同じキーのsecondは上書きされてしまうわけだ
0922デフォルトの名無しさん
2011/12/23(金) 15:27:49.62setとmapは要素の追加削除で順序が破壊されるからループ中の変更はご法度
0923デフォルトの名無しさん
2011/12/23(金) 15:45:33.51std::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;
}
0924デフォルトの名無しさん
2011/12/23(金) 17:17:29.8798/03
keyを指定する形式のときだけ返却値あり。
11
すべて(keyを指定する形式、単一イテレータを指定する形式、イテレータ範囲を指定する形式)の形式で返却値あり。
0925デフォルトの名無しさん
2011/12/23(金) 17:35:30.34まだまともな規格表もない
0926デフォルトの名無しさん
2011/12/23(金) 17:36:09.950927デフォルトの名無しさん
2011/12/23(金) 17:41:27.400928デフォルトの名無しさん
2011/12/23(金) 17:45:01.36削除命令はキューイングしてどこかで一元管理しないと
0929デフォルトの名無しさん
2011/12/23(金) 17:52:36.59「C++11なら〜がある」というヤツはコミュ障
0930デフォルトの名無しさん
2011/12/23(金) 18:17:39.610931デフォルトの名無しさん
2011/12/23(金) 18:49:01.22それって仕様で定められてるの?
0932デフォルトの名無しさん
2011/12/23(金) 20:12:38.87ったりめーだろ
別にコンテナに限らずマルチプロセス/マルチスレッドではいつもそう
0933デフォルトの名無しさん
2011/12/23(金) 20:13:20.29なんでscanfバリのパターンマッチができないんだ。
0934デフォルトの名無しさん
2011/12/23(金) 21:14:22.21標準規格(98でも11でも)の仕様ではエラーにも未定義動作にもならない
0935デフォルトの名無しさん
2011/12/23(金) 22:29:21.490936デフォルトの名無しさん
2011/12/23(金) 23:07:04.76えっ?
0937デフォルトの名無しさん
2011/12/23(金) 23:36:25.930938デフォルトの名無しさん
2011/12/24(土) 00:00:36.60...
for (set<Hoge>::iterator i(s.begin()); i != s.end();) {
if (check_erase(*i) == true) {
s.erase(i++);
} else {
++i;
}
}
0939デフォルトの名無しさん
2011/12/24(土) 00:03:59.47if( test(i) ) {
s.erase( s.begin() );
}
++i;
}
0940デフォルトの名無しさん
2011/12/24(土) 01:25:42.15マジレスすると本体=コンテナの意味ならコンテナによる。
list、map、setあたりは要素の追加ではイテレータは全く無効にならないし要素を削除したときはその要素を指すイテレータだけが無効になる。
0941デフォルトの名無しさん
2011/12/24(土) 09:09:32.370942デフォルトの名無しさん
2011/12/24(土) 09:22:51.690943デフォルトの名無しさん
2011/12/24(土) 11:39:23.860944デフォルトの名無しさん
2011/12/24(土) 12:47:27.260945デフォルトの名無しさん
2011/12/24(土) 12:51:31.75STLってよく出来てるんだな
0946デフォルトの名無しさん
2011/12/24(土) 14:25:09.06じゃないと無効になるだろ
0947デフォルトの名無しさん
2011/12/24(土) 14:59:30.52§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の規格を部分的に取り入れたのか、とにかく盲目的に
使うとはまりそうだな
気をつけよう
0948デフォルトの名無しさん
2011/12/24(土) 16:25:00.090949デフォルトの名無しさん
2011/12/24(土) 18:45:18.24gccでは通らないだろうし
0950デフォルトの名無しさん
2011/12/24(土) 19:09:12.86-std=c++0x,-std=gnu++0x,-std=c++11,-std=gnu++11 のどれかをつければgccでも通る
0951デフォルトの名無しさん
2011/12/24(土) 23:21:48.19std::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());
と書けばいちおう動くんですがコピーコストが無視できません
0952デフォルトの名無しさん
2011/12/25(日) 08:52:26.88http://d.hatena.ne.jp/redboltz/20110218/1297989050
http://d.hatena.ne.jp/redboltz/20110413/1302698607
0953デフォルトの名無しさん
2011/12/25(日) 10:53:30.51これはすごい
保存しますた
0954デフォルトの名無しさん
2011/12/25(日) 19:24:22.96誰が教えてくれなんて頼んだ?
俺はお前に諮問してるんだろうが
大体お前が人様に物を教える立場か
図に乗るのも大概にしろ
ネットの中だけで偉くなったと勘違いして
少しは外に出て目を醒ませ
0955デフォルトの名無しさん
2011/12/25(日) 19:47:40.460956デフォルトの名無しさん
2011/12/25(日) 19:58:53.320957デフォルトの名無しさん
2011/12/25(日) 20:09:01.35現状は、質問への回答はC++03準拠でいい。
C++11の機能を使いたいヤツにはC++11スレへ行ってもらえ。
0958デフォルトの名無しさん
2011/12/25(日) 20:14:21.40なんて指定すればいいの?
0959デフォルトの名無しさん
2011/12/25(日) 20:27:31.27勝手に俺様ルールつくんなボケ
C++はすべて平等に扱う
0960デフォルトの名無しさん
2011/12/25(日) 20:27:52.83MASMを使うのであれば、
rax みたいに e の代わりに r をつけるのと、あとは r8〜r15 がある
関数コールでの最初の4個だっけ?の引数をレジスタ渡しするとか、
でもその分スタックを開けておかないといけないとか、
rsp を16バイト境界に揃えて call とか、
変更してはいけないレジスタが増えてるとか、64bit では色々癖があるので、
そのあたりもググるといいよ
0961デフォルトの名無しさん
2011/12/25(日) 20:28:54.38関数コール前後で内容を維持しないといけないレジスタ、ね
0962デフォルトの名無しさん
2011/12/25(日) 20:31:00.97使えなかったのか・・・
サンクス
0963デフォルトの名無しさん
2011/12/25(日) 20:38:49.50インラインでない普通のアセンブラなら使える
拡張子 .asm にしてなんかちょっと設定いじれば使えたはず
0964デフォルトの名無しさん
2011/12/25(日) 20:54:00.540965デフォルトの名無しさん
2011/12/25(日) 21:33:11.83こういうコードって安全ですか?
0966デフォルトの名無しさん
2011/12/25(日) 21:48:53.710967デフォルトの名無しさん
2011/12/25(日) 22:39:08.330968デフォルトの名無しさん
2011/12/25(日) 22:40:10.00どこが気になってるのかぐらい書けよ。
まあ、data[1] で宣言して、領域たくさん取るから data[10] とかでも大丈夫か?
ということだと思うが、ダメだったはず。
0969デフォルトの名無しさん
2011/12/25(日) 23:51:32.780970デフォルトの名無しさん
2011/12/25(日) 23:56:07.040971デフォルトの名無しさん
2011/12/26(月) 00:02:34.29data[1]の後ろの追加領域のアラインメントも問題なく取れてるし
0972デフォルトの名無しさん
2011/12/26(月) 01:17:09.15変数ならば、定義の変わりにローカルなスコープだけで使いたいときにconst使うかなーと思うんですけど
0973デフォルトの名無しさん
2011/12/26(月) 01:27:20.98T& this じゃなくて T const& this が欲しいんだよ。
0974デフォルトの名無しさん
2011/12/26(月) 01:40:54.14どこかで見た記憶があったがようやく思い出した。BITMAPINFOだ
[]演算子は結局のところアドレスのオフセット計算(*(data+n))だから、
オフセットしたアドレスがアクセス可能であることを担保できれば良いと
>>972-973
関数にconst使うってこっちじゃないの?(w
int hoge() const { ... }
~~~~~~
0975デフォルトの名無しさん
2011/12/26(月) 02:14:01.19>>973がなぜ参照にしたのかはわからんけど
struct T{
int hoge() { this } // T*
int hoge() const{ this } // const T*
};
0976デフォルトの名無しさん
2011/12/26(月) 08:18:18.41これか
int (*const f)()
の事言ってんじゃないの?
メンバー変数へのconstとかコンパイルすりゃ
気づくような事を質問するとも思えん。
0977デフォルトの名無しさん
2011/12/26(月) 10:11:18.33Microsoft が決めた API で MSVC での動作保証がされているだけで、
一般的には data+n が配列範囲外を指すと未定義動作だからね。
(最後の要素の次を指す場合は * で参照するまでセーフだけど。)
0978デフォルトの名無しさん
2011/12/26(月) 20:04:09.74仮想関数を使わない限りはね。
因みにMSのclだったかg++だったか
両方だったか忘れたが長さ0の配列を作れる。
用途はあんたがしようとしてること。
0979デフォルトの名無しさん
2011/12/26(月) 23:17:08.85placement new 使え
これならコンストラクタが呼ばれるから仮想関数があっても安全に使える
デストラクトも忘れずに
オーバーロードされていないnewで確保したメモリは確か、
どのオブジェクトでもアラインメントが揃うアドレスが返されると保証されてたはずので
mallocよりoperator newを使った方が規格的に良い
(まあnewは大抵mallocそのままで実装されてんだろうけど)
あと、Delete の引数に const は必要ないというかあるべきじゃない
参照先を破壊するんだし・・・
どーでもいーけど、規格的には inline や void や return 0; は必要ない(あってもなくても同じ)
分かって敢えて書いてるのなら別にいいけどね
ttp://codepad.org/0g0HtQe2
0980デフォルトの名無しさん
2011/12/27(火) 00:37:29.080981デフォルトの名無しさん
2011/12/27(火) 01:02:20.98return 0; になる
0982デフォルトの名無しさん
2011/12/27(火) 01:10:45.68§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;
0983デフォルトの名無しさん
2011/12/27(火) 01:14:27.00調べる労力のほうが無駄だわ
0984デフォルトの名無しさん
2011/12/27(火) 01:15:38.41無知は恥
0985デフォルトの名無しさん
2011/12/27(火) 01:45:58.07仮想関数を使わなくても未定義動作になるよ。
>>979
placement new を使っても未定義動作になるよ。
oeprator new も malloc もアライメントの要求は同じだよ。
0986デフォルトの名無しさん
2011/12/27(火) 01:56:00.86先頭には先頭に書いたメンバがいる前提で外部からその先頭アドレスをいじって仮想関数テーブルぶっ壊してるのを見たことがある
0987デフォルトの名無しさん
2011/12/27(火) 02:13:53.60全部省略できるようにするか全部できないように統一したら
>>982の文章少し短くできるんじゃないの
0988デフォルトの名無しさん
2011/12/27(火) 02:19:59.25ユーザー定義が前提となる関数で戻り値の型と意味が規格で定められていると言う点で
main() はとっても特殊。特別扱いしても何の不思議も無い。
0989デフォルトの名無しさん
2011/12/27(火) 02:23:07.540990デフォルトの名無しさん
2011/12/27(火) 02:28:17.640991デフォルトの名無しさん
2011/12/27(火) 03:00:51.26C++相談室 part93
http://toro.2ch.net/test/read.cgi/tech/1324922431/
0992デフォルトの名無しさん
2011/12/27(火) 03:42:25.110993デフォルトの名無しさん
2011/12/27(火) 03:50:42.13お前が必要でなかろうと、規格化されてるんだから事実なんだよ。
0994デフォルトの名無しさん
2011/12/27(火) 09:16:27.150995デフォルトの名無しさん
2011/12/27(火) 11:01:22.81人の話を聞かない奴が何を言ってるんだかね。
0996デフォルトの名無しさん
2011/12/27(火) 11:28:54.230997デフォルトの名無しさん
2011/12/27(火) 11:31:38.190998デフォルトの名無しさん
2011/12/27(火) 11:49:00.09未定義では困るので暗黙的return 0。
0999デフォルトの名無しさん
2011/12/27(火) 11:56:46.73C++標準化はオープンなプロセスでありそのような資格基準は存在しない。
文句があるならしかるべき場所ではっきりと言えばそれでいい。
1000小倉優子 ◆YUKOH0W58Q
2011/12/27(火) 11:57:49.78( ・∀・) 1000ならジュースでも飲むか
( )
し─J
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。