C++相談室 part11
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
NGNGあなたにぴったりの言語、C++。
(´∀`).。o(関連URLは>>2-5の辺り)
0002デフォルトの名無しさん
NGNG0003v(^・^)v
NGNGhttp://www.kuzbass.ru/docs/isocpp/
Boost
http://www.boost.org/
STLport
http://www.stlport.org/
Loki
http://www.moderncppdesign.com/
Loki for VC7(LokiPort)
http://www.geocities.com/rani_sharoni/LokiPort.html
0004v(^・^)v
NGNGPart1
http://piza.2ch.net/tech/kako/980/980175292.html
Part2
http://pc.2ch.net/tech/kako/996/996640937.html
Part3
http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
Part4
http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
Part5
http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
Part6
http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
Part7
http://pc.2ch.net/test/read.cgi/tech/1021787032/
Part8
http://pc3.2ch.net/test/read.cgi/tech/1025010364/
Part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/
part10
http://pc3.2ch.net/test/read.cgi/tech/1029315669/
0005v(^・^)v
NGNGhttp://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
■関連スレ■
VisualC++相談室 3
http://piza2.2ch.net/tech/kako/993/993186053.html
VisualC++相談室 4
http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
VisualC++相談室 5
http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
VisualC++相談室 6
http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
VisualC++相談室 【7】
http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
VisualC相談室 【8】
http://pc.2ch.net/test/read.cgi/tech/1022499000/
C++Builder相談室
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=969458279
新C++Builder相談室(C++Builder相談室 Part2)
http://pc.2ch.net/test/read.cgi/tech/997074601/
C Builder相談室 Part3
http://pc3.2ch.net/test/read.cgi/tech/1016065855/
0006デフォルトの名無しさん
NGNGC++を使いこなしているといえますか?
あと、C++を覚えただけじゃプログラムは作れないと聞きましたが、
他にどんな事を知る必要がありますか?
数学関係とかの知識なら大丈夫だと思います。
0007デフォルトの名無しさん
NGNGギリギリスレ勃テ乙ー
0008デフォルトの名無しさん
NGNG//が使えれば大丈夫。
0009デフォルトの名無しさん
NGNG>オブジェクトを直接宣言する場合と、
> CTest oObj(Hoge);
>一旦ポインタの形で宣言しnewする場合は、
> CTest* pObj;
> pObj = new CTest(Hoge);
>どのように使い分ければいいのでしょうか?
>375 名前:デフォルトの名無しさん sage 投稿日:2002/09/18(水) 03:10
>スコープを外れても残したい時はnew
前スレで↑を見て「なるほど」と納得していたのですが、
newするしたらdeleteしなければならない、となぜかわからずでも覚えてるの
ですが、この場合スコープ抜けちゃうとdeleteできませんよね?
本にはnet<->deleteとセットで書かれているので
理解できません。どうしてでしょうか?
0010デフォルトの名無しさん
NGNGコンストラクタでnewしてデストラクタでdeleteするとか。<スコープ抜けてからdelete
>>6
ちょとずれるが,C++プログラミングとSTLプログラミングは何となく毛色が違うと思う。
自称C++プログラマがListクラスとか作っててアフォかとオモタ。
001110
NGNGだからSTLバリバリの人はSTLプログラマと名乗って欲しい。
で,「C++を使いこなしている」とは
・>>8
・クラス
・iostream
ぐらいでよいのでは?
001210
NGNG・例外
も。
0013デフォルトの名無しさん
NGNGということは変数をクラスに持たせるということですよね。
そうすると、クラスに
CTest oObj(Hoge);
で宣言するのと
CTest* pObj;
pObj = new CTest(Hoge);
で宣言しnewするのとはどのように使い分ければいいのでしょうか?
と>>9の代わりに質問してみるテスト
00159
NGNGえっとさっきの例で話すと、
CTest *pObj(Hoge);
pObj=new CTest(Hoge);
って領域確報しちゃうとスコープ抜けたら
領域は確保されたままですが、*pObjはもう使えないですよね?
スコープ内でdelete pObjとするならわかるのですが、
この例だとスコープ抜けたらdeleteできないんじゃないんでしょうか?
deleteする必要はあるんですよね?
001610
NGNGfunc()
{
CTest* pObj;
pObj = new CTest(Hoge);
return;
}
だと思ってるの?
たぶん前スレ375はそういう風には捕らえてないと思われ。
00179
NGNG元質問者の方のオリジナルのコードは
VCでMDIを作成する時に自動作成される↓なんですが、
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MDITYPE,
RUNTIME_CLASS(CMDIDoc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CMDIView));
この例だと>16に書かれている形式と同じですよね?
もちろんこの後deleteはありませんでした。
スコープ抜けたらdelete pDocTemplateはできないでしょうし、
なぜdeleteしなくていいのか、というのが悩みの種です。
0018デフォルトの名無しさん
NGNG正しくは?
001910
NGNGdeleteしてないんだったらしてないんじゃない?
>>18
CTest* pObj; // どこか(グローバルとかクラス面罵とか)
---------------------
pObj = new CTest(Hoge); // どこか
だと思ったんだと思う…。
0020デフォルトの名無しさん
NGNGdeleteしなくてメモリリークは起きないの?
0022デフォルトの名無しさん
NGNGどこかに登録とかしてるはずなんだが。
もし、そうでないならリークしてるかnewをオーバーライドしてる
00239
NGNGじゃなぜ>17のコードはdeleteしてないんでしょうか?
>21を見るとnew したら deleteしなきゃいけないんですよね?
少なくとも>17のコードはreturn TRUE;までの間に
delete pDocTemplate;
という文はありませんでした。
deleteしなければメモリリークが発生するというなら
どこでdeleteしてるのでしょうか?
話しがVCに流れてますがVCスレへ戻った方がいいでしょうか??
0024デフォルトの名無しさん
NGNGリークしても別に構わない程度の物だとは思うが。
002610
NGNG何かかたくなに「deleteしなきゃいけない」って思いこんでるみたいだけど,
deleteしないコードは動かないってわけじゃないですよ。
実装がちゃんとしてる環境ではdeleteしなくてもプログラム終了時には解放されますよ。
(細かく突っ込まないでね。fjじゃないんだからさ)
あとC++の話題だと思うんで大丈夫だと思います。
00279
NGNG確かに基底クラス(CObject)でオーバーライドされてました。
void* CAge::operator new(size_t nSize)
{
return malloc(nSize);
}
こんな感じです。
私は「malloc」のことよくわかっていないので
これ以上追求できないようです。
基本的にnew したら deleteしなければならないのは確か。
ということはわかりました。
またおいおい覚えていきたいと思います。
ありがとうございました。
0028デフォルトの名無しさん
NGNGちゃんとデストラクタは呼ばれますか?
00299
NGNG>26を読ませてもらったところ間違いだと早速気付きました。
newすればかならずdeleteしなくてはならないというわけではない。
に訂正いたします。
実際私のレベルではこれ以上ついていけないっぽいので
例外を除いてdeleteは必ずしろっ、
と覚えておきますw
ありがとうございました。
0031デフォルトの名無しさん
NGNGmallocはメモリを確保する命令。確保した後はfreeで解放しなければならない。
003210
NGNGいや,deleteはしなきゃいかん。
が,deleteしてないからといって「動かない」というわけではない。
しかし,「動く」と言っても,「完全に設計どおりに動く」というわけではない。(>>28が指摘してるけど)
0033デフォルトの名無しさん
NGNGdeleteしない終了時に解放されるのはメモリだけということですか。
deleteして終了するのとdeleteしないで終了するので違いがあるということですね。
003410
NGNGしかし,「動く」と言っても,「完全に設計どおりに動く」というわけではない。(>>28が指摘してるけど)
↓
しかし,「動く」と言っても,「完全に設計どおりに動く」とは限らない。
「設計通りに動くかもしれないし動かないかもしれない」(>>28が指摘してるけど)
0036デフォルトの名無しさん
NGNG>>23
特に CMultiDocTemplate に関して言うなら、こいつはコンストラクタの中で自分を
CDocManagerというクラスのオブジェクトに自分を登録しておいて、
// pDocTemplate = new CMultiDocTemplate(IDR_MDITYPE, ... );
// ここの中でDocManagerに登録↑
で、例えばCDocManagerのデストラクタの中からdeleteが呼ばれる
ようになっているのでとりあえず心配は要らん。
00379
NGNGあぁ、なるほど、
全て納得いきました。
そいういう流れだったんですね。
全部納得いってすっきりしました。
ありがとうございました。
感謝。
0038デフォルトの名無しさん
NGNG答えが出てないみたいだから。
15 :9 :02/09/18 20:28
>10
えっとさっきの例で話すと、
CTest *pObj(Hoge);
pObj=new CTest(Hoge);
って領域確報しちゃうとスコープ抜けたら
領域は確保されたままですが、*pObjはもう使えないですよね?
スコープ内でdelete pObjとするならわかるのですが、
この例だとスコープ抜けたらdeleteできないんじゃないんでしょうか?
deleteする必要はあるんですよね?
0039デフォルトの名無しさん
NGNG混乱させるな
0042元質問者
NGNGまず、
>25
これは私が書いたコードではなくVC++というツールが吐く
スケルトンです。
なぜMDIスケルトンがnewを使うかを確認するために、下記にコード変更
staticCMultiDocTemplate oDocTemplate(
IDR_TEST33TYPE,
RUNTIME_CLASS(CTest333Doc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CTest333View));
AddDocTemplate(&oDocTemplate);
ビルドして実行すると、予想に反して何事もなく動作しました。
(アプリ抜けるときに例外発生するけど、もともとnewを想定した>36辺りの処
理の問題だと思われます。あまり重要でないと思う。)
→普通のオブジェクトでいいものを何でnewしてるんだろう?
→Win9X系のリソース(640KByteの)問題で、ヒープにCMultiDocTemplate
のエリアを確保したかったのでは?(子ウインドが何枚開かれるのか分か
らないので)
と言うことでリソースメータを起動して、オブジェクトの場合とnewの場合と
で、それぞれ子ウインドを1000枚開いて比較。
→結果、リソース使用量変わらず。
ここまでやって、”なんか知らんがnew使った方がいいんだろう。”
という結論に達しました。また気が向いたら解析することにします。
(今度はこっちがスレ違いに、、、)
0043元質問者
NGNG>42 ではリソース問題の確認にならない可能性大。
0044デフォルトの名無しさん
NGNG>>42
> 普通のオブジェクトでいいものを何でnewしてるんだろう?
その CMultiDocTemplate っつーのをクライアントが動的に生成できる
ようにするためなんでは。
しかし、おれは 36 の説明じゃ訳分からんかったよ。42 の
> AddDocTemplate(&oDocTemplate);
で分かったけど。36 もこのことが言いたかったんだね。
>>43
> よく考えたらstaticもヒープに取られるんだっけ?
んなことはない。
0045デフォルトの名無しさん
NGNGうお、じゃstaticはどこに取られるんだ?急に足下がおぼつかなく
思えてきたYO…。
0046デフォルトの名無しさん
NGNGCWinAppのメンバ
CDocManager* m_pDocManager;
オブジェクトにCDocTemplate*渡されてポインタ管理が任されているみたいだね。
それで
CDocManager::~CDocManager()できちんと解放されているようだ。
delete m_pDocManager;
はCWinAppのデストラクタで呼ばれている。
staticにするとアプリ終了時に2重にデストラクタが呼ばれるから例外が呼ばれる
ようだけど。
0048デフォルトの名無しさん
NGNGクラスAがクラスBをメンバに持ちたい時
実体持ちの場合のクラスAのサイズ=sizeof(クラスA)+sizeof(クラスB)
ポインタ持ちの場合=sizeof(クラスA)+sizeof(ポインタ)
となって、実体持ちだとコピーの時にオーバーヘッドが発生
という事であってますか?
更に突っ込んで、実体持ちだとクラスBの実装が変わってサイズも変わったりすると
クラスAに関しても再コンパイルが必要になるけど
ポインタ持ちだとクラスBの再コンパイルだけでいいって事であってますか?
0049デフォルトの名無しさん
NGNG0050デフォルトの名無しさん
NGNGCreateFontしてGetDCしてSelectObjectしてみたのですが変わりません
やり方的にはこれでいいんでしょうか?
0051デフォルトの名無しさん
NGNGスレ違い。
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/
0052!=49 だが
NGNG49> 全然違う、だけじゃアレなんで (w
> 実体持ちの場合のクラスAのサイズ=sizeof(クラスA)+sizeof(クラスB)
実体持ちの場合のクラスAのサイズ=sizeof(クラスA) だが?
というツッコミは置いといて、48 の言いたいことは、
実体持ちの場合のクラスAのサイズ=sizeof(クラスA - クラスBのメンバ) + sizeof(クラスB)
ってことだろうけど、メンバを4バイトとか8バイト境界にアライメント
させてる場合は、違ってくる可能性がある。
> 実体持ちだとコピーの時にオーバーヘッドが発生
ポインタ持ちだとオーバーヘッドが発生しないわけでもない。
クラスAのコピーコンストラクタの作りによる。
> ポインタ持ちだとクラスBの再コンパイルだけでいいって事であってますか?
これは合ってるかな。この場合は、クラスAを定義しているところで
クラス B を定義しているヘッダファイルをインクルードしないようにね。
005352
NGNG> > ポインタ持ちだとクラスBの再コンパイルだけでいいって事であってますか?
> これは合ってるかな。
合ってない(w
クラス A の定義をインクルードしている、他のファイルは再コンパイルの
必要がない。クラス A の実装ファイルは、(たぶん クラス B を使っているので)
再コンパイルが必要だろう。
0054デフォルトの名無しさん
NGNG005552
NGNGようするに、クラス A の実装からクラス B の実装が見えるのなら再コンパイル。
見えないなら不要、ということ。クラス間の依存はできるだけ減らすようにがんがれ。
ちなみにおれは、pimpl パターンがお気に入りだ。
0056デフォルトの名無しさん
NGNG何を基準にして「これ以上」なのか知らんが、書き方に気をつけると、それなりに
は速くなる。インターフェースと実装を分離して、ヘッダファイル間の依存関係を
減らすとかさ。
(あと gcc は遅すぎ)
0057デフォルトの名無しさん
NGNGでも、家では警告だけだった
char* a = NULL;
を
char* a = (char*)NULL;
に直さないと駄目になりました。
なぜでしょうか?また直さないでコンパイル通したいのですが駄目ですか?
0058デフォルトの名無しさん
NGNGC++だから NULLが(void *)0などと定義されているためエラーになったの
だろう。
検索かけてNULLを0にしる。
0059デフォルトの名無しさん
NGNG#undef NULL
const int NULL = 0;
0060デフォルトの名無しさん
NGNGちょっとstddef.hを覗いてみて欲しい。次のような行が書かれてないか?
#ifndef NULL
# if defined(__cplusplus)
# define NULL 0
# else
# define NULL ((void *)0)
# endif
#endif
0061デフォルトの名無しさん
NGNG0062デフォルトの名無しさん
NGNGみんな、がりがとう。自分で
#define NULL((void*) 0)
と定義してたのが不味かったみたいです(w;
0063デフォルトの名無しさん
NGNG下の(a.*pP)()のところでコンパイルエラーになってしまいます
書き方が違うのでしょうかおしえてください
class A{
private:
int a;
public:
void (A::*pP) ();
A(){pP = Print;}
void SetA(int s){a = s;}
};
int main()
{
A a;
a.SetA(100);
(a.*pP)(); //error
return 0;
}
0064デフォルトの名無しさん
NGNG開発効率
とくにバグとりのときに、
1. バグをとる
2. コンパイルする
3. テストする
のサイクルが遅いと嫌。
0065デフォルトの名無しさん
NGNG精神的ストレス
0066デフォルトの名無しさん
NGNGえーと・・・
ネタ?
0067デフォルトの名無しさん
NGNGPrintってAのメンバなのかい?
006863
NGNGA::Print() がぬけてました
0069デフォルトの名無しさん
NGNGコンパイルに12時間もかかるプロジェクトとかやったやつ、いる?
そんな本読んだよ。
0070デフォルトの名無しさん
NGNG0071デフォルトの名無しさん
NGNGもっぺんソースさらせ
0072デフォルトの名無しさん
NGNG0073デフォルトの名無しさん
NGNG俺のプロジェクトは大体20秒だな。
0074デフォルトの名無しさん
NGNGそれだ!
0075デフォルトの名無しさん
NGNG100万行くらい?
0077デフォルトの名無しさん
NGNGclass A {
private:
int a;
public:
void (A::*pP)() const;
A() { pP = &A::Print; }
void SetA(int s) {a = s;}
void Print() const { std::cout << "a = " << a << std::endl; }
};
int main()
{
A a;
void (A::*pP2)() const;
pP2 = A::Print;
a.SetA(100);
(a.*(a.pP))();
(a.*pP2)();
}
0078デフォルトの名無しさん
NGNG手元のテンプレートライブラリ使いまくりの C++ 20,000 行のコードで、フルビルド
2分30秒。Pentium III-M 800MHz / VC6 / 最適化 速度優先
C++ が危険なのは、注意して書かないとファイル間に依存関係が容易に発生
してしまい、ひとつファイルを書き換えたらフルビルドに近い状態になってしまう
こと。上でも誰かが言ってた pimpl イディオムや、インターフェースと実装の分
離を徹底しないと、規模が大きいプロジェイクトでは破綻するよ。
0079デフォルトの名無しさん
NGNG・インライン展開
・コードの短縮、簡略化
0080デフォルトの名無しさん
NGNG具体例のあるやつ。
0081デフォルトの名無しさん
NGNGプリコンパイル済みヘッダは適切に設定してる?
テンプレート使いまくり、33万行のC++コード
Pentium III 800MHz / VC6 / 最適化 速度優先
でフルビルド2分。
0082前スレ979
NGNGintやらshortやらも含めて全てのクラスの基底にvoid型のクラスがあるという仮定での話。
この仮定の下ではvoid *はvoidを指すポインタと言う事ができる。
0084デフォルトの名無しさん
NGNG前者は、それは使いどころを間違ってる。pimpl を使って実装を隠すべき
なのは、もともと仮想関数経由で呼ばれるような部分。
0085デフォルトの名無しさん
NGNG勿論そんなことわかってるよ。
ただ、テンプレート使いまくりでのコンパイル速度の低下の
解消法として使った場合は>>79のようになるだろ?
0086デフォルトの名無しさん
NGNGテンプレートの場合には、ヘッダ間の依存関係は (それほど) 発生しないと
思うんだが。気のせい?
0087デフォルトの名無しさん
NGNG0088デフォルトの名無しさん
NGNGフルビルドの場合はそういう側面が強いが、
差分コンパイル(という言い方あるよな)なら処理系に依存しない
テクニックがあってよくネタになる。
上の pimpl イディオムとかな。
0089デフォルトの名無しさん
NGNG処理系間の比較みたいな話になると、逆にこのスレの方が良いかも。gcc スレ
や VC スレだと、その処理系以外の話はスレ違いだからねぇ。
0090デフォルトの名無しさん
NGNGclass Foo {
public:
template<class T> void func( const T& obj );
};
template<> void Foo::func( const int& obj ) { } // これがエラー
int main(){
Foo().func( int() );
return 0;
}
foo.cpp(5) : error C2511: 'func' : オーバーロードされたメンバ関数が '<Unknown>' にありません。
というようなエラーになるんだけど。
0091デフォルトの名無しさん
NGNG2分や40秒もかかるのかよ。
0092デフォルトの名無しさん
NGNG0093デフォルトの名無しさん
NGNG009493
NGNGプログラム作って穴開けてもらって実行してもらって結果もらうまでが1週間ですた
0095デフォルトの名無しさん
NGNG0096デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNGだから分割コンパイル重要なんですよ。
0098デフォルトの名無しさん
NGNGこの間のリゾルバの騒ぎのときは、リコンパイルに20時間かかった。
0099デフォルトの名無しさん
NGNGじゃなくて
template<int> void Foo::func( const int& obj ) { }
だったりしなかったっけ。
0100デフォルトの名無しさん
NGNGVCはまだクラス定義の外でのスペシャライゼーション定義には対応してないよ。
010190
NGNGしかたがない、非メンバ関数でやることにします。
でも、クラス内で specialization できても意味ないよねぇ。
たんなる多重定義と変わらんもん。
0102デフォルトの名無しさん
NGNGまったく無意味でもないかな
ユーザーによるクラス定義外でのスペシャライゼーション
定義を可能にすることは、隠蔽されるべき非公開メンバへの
自由なアクセスを許すに等しいからね。
0103デフォルトの名無しさん
NGNGということは、非メンバ関数のテンプレートでも friend にしたら
同じ問題をかかえるということか。
0104デフォルトの名無しさん
NGNG{ int a; };
struct B : A
{ int b; };
void func(A arry[4])
{
for(int i = 0; i < 4; i++)
arry[i].a = 0;
}
void test(void)
{
B m[4];
func(m);
}
これコンパイル通るのっていいの?
0105デフォルトの名無しさん
NGNG何か問題?
func(A arry[4])はfunc(A *arry)と同等で
func(m)ではmが標準変換でB*に変換され
B*からA*へのアップキャストは標準だから
0106デフォルトの名無しさん
NGNGでも、一般的に、親クラスの配列(の先頭要素へのポインタ)が求められているところに
子クラスの配列を渡してはいけない。参照扱いでも同様。
理由はEffective C++(Moreかも)に書いてあったと思った。
0107104
NGNG実はそれが本題でなく…
後少し時間をください。
0108104
NGNGstruct A
{
T a,b;
};
struct B : A<int>
{
//関数だけ
};
template<class T>
void func(A<T> *a)
{
}
void test(void)
{
B m[3],*n;
func(m); // NG
func(n); // OK
}
'B [3]' から 'A<T> *' に変換できません。
と言われます。なぜm[3]を*mと解釈してくれないんですかねぇ?
0109デフォルトの名無しさん
NGNGキャストが行われないから
0110デフォルトの名無しさん
NGNG配列の個数を取得する方法がわかりません、教えてアルゴマン。
0111デフォルトの名無しさん
NGNG0112104
NGNGfunc<int>(m);
func(&m[0]);
なら可能なんですが、他の型同様にfunc(m)で素直に渡したいと考えいるので・・・
なんとかfunc(m)で渡す方法はないですか?
飯買いに行ってきます。
0113デフォルトの名無しさん
NGNG0114デフォルトの名無しさん
NGNG「テンプレート引数の推測によって決まったテンプレート関数引数には、
格上げ、標準変換、ユーザー定義変換を適用することはできない」とある。
ということは、引数の推測の際には、継承関係などは全く考慮されない
ということではないか。
0115デフォルトの名無しさん
NGNGのであれば、
inline void func(B *a) { func<int>(a); }
でも定義しておけばよいかと。
0116デフォルトの名無しさん
NGNG0117デフォルトの名無しさん
NGNG実際問題として、変更されたら困ることが多いからだろう。struct B にメンバ変数が
あったら func 内で a[1] とかに触ると、確実に値を壊すし。
っつか継承を使うなら配列は忘れて vector 使え。その方が身のためだ。
0118デフォルトの名無しさん
NGNG継承との関わりで、配列とvectorの間に特別な違いは無いと思う。
どっちを使っても一緒。
そして、継承するようなオブジェクトの実体はvectorなどに入れるべきでは
ない。m1, m2, m3という3個の変数と同じ程度の気持ちで配列に入れるのは
問題ないけど、vectorを使う、ということは実行時に値を追加したい、
ということで、その場合はvector<B*>かvector<shared_ptr<B> >を使うべき。
0119デフォルトの名無しさん
NGNG> 継承との関わりで、配列とvectorの間に特別な違いは無いと思う。
いや delete[] の罠がある。
0120デフォルトの名無しさん
NGNG0121104
NGNG色々やって見ましたが駄目でした。
func(T *a)で取って、内部でA<T>に変換するこで妥協を…
こんな感じに↓
template<class T>
void func(T *a)
{
A<T::value_type> *b = a;
// (;´Д`)ハァハァ・・・な処理
}
やっぱり標準変換ということで引っかかってるようでした。
func(&m[0])は通るのに・・・
標準変換とかでエラーをだすのはVCだけなんかな?bccはOkらしいし。
STLは覚え中なんで今度の機会に・・・。
mで渡すのにこだわっていたのは&m[0]でしか渡せないのは
非常に分かりにくいと思いまして。(実はもう少し複雑)
ご迷惑お掛けしました。そしてありがとうございました。
寝ます。
0122デフォルトの名無しさん
NGNG// (;´Д`)ハァハァ・・・な処理
どんな処理やねん(w
0123デフォルトの名無しさん
NGNGエラーの中身を見るとchar型にint型を入れることができないと言うことなのですが
どうすればよいかイマイチわかりません。わかる方、教えてください。
main()
{
int a,b,c,title;
char file[64];
char name[64];
FILE *fp;
a=0;
b=1;
c=10;
title=10;
for(int x=0;x<title;title++)
{
name=title".dat";
strcpy(file,name);
fp=fopen(file,"a");
for(a=0;a<c;++a)
{
b=b+b;
printf("%d\n",b);
fprintf(fp,"%d\n",b);
}
fclose(file);
}
}
0124デフォルトの名無しさん
NGNGname=title".dat"; <-- ここ
C++は int(整数) から文字列への自動変換はサポートしていないので
自分で、やらなければならない。
しかし、このプログラムにはそれ以外にも
title=10;
for(int x=0;x<title;title++)
fclose(file);
などなど、バグだらけだからもう一回初めから作り直した方が
良いと思ふ
0125123
NGNGありがとうございます。
一から書き直します
0126デフォルトの名無しさん
NGNGそれと逆の場合。
0127デフォルトの名無しさん
NGNGint → string ... stringstream
0128デフォルトの名無しさん
NGNG> みんなstringをintにするのどうしてる?
> それと逆の場合。
その時次第。
0129デフォルトの名無しさん
NGNG0130デフォルトの名無しさん
NGNGsnprintf( name, 64, "%d.dat", title );
# snprintf がなければ sprintf っすか。
# C++ というよりは C なので sage
0131デフォルトの名無しさん
NGNG#include <boost/lexical_cast.hpp>
#include <string>
void f(){
std::string s = "10";
int i = boost::lexical_cast<int>(s);
i += 2;
s = boost::lexical_cast<string>(i);
}
0132126
NGNGちなみに俺は、>>127さんと同じです。
もちろん、ケースにもよりますが。
実は、ちょっとatoiはなんか古臭い感じがして、
stringstreamは大げさな感じがしていたのですが、
ちょと安心しますた。
0133デフォルトの名無しさん
NGNG0134デフォルトの名無しさん
NGNGlexical_castは内部でstringstreamを使ってるので、ちょこっといじれば出来るようになる。
0135デフォルトの名無しさん
NGNG特殊化すれば出来る。
0136デフォルトの名無しさん
NGNGおいおい、文字列を扱う部分をフル実装しなけりゃならんの?
0137デフォルトの名無しさん
NGNG0138デフォルトの名無しさん
NGNG0139デフォルトの名無しさん
NGNG激しく短くても、lexical_cast<const char*>を特別化したら
自分で中身を全部かかなきゃだめと言ってみるテスト
0140デフォルトの名無しさん
NGNGそれは仕方ないかと。
lexical_castは拡張を予想して作られたものではないだろうし。
0141デフォルトの名無しさん
NGNG0142デフォルトの名無しさん
NGNG全部ったって、中身は5行だぞ、確か。
0143デフォルトの名無しさん
NGNGTarget lexical_cast(Source arg, Manip manip)
{
# ifdef BOOST_LEXICAL_CAST_USE_STRSTREAM
std::strstream interpreter; // for out-of-the-box g++ 2.95.2
# else
std::stringstream interpreter;
# endif
Target result;
if(!(interpreter << manip << arg) || !(interpreter >> result) ||
!(interpreter >> std::ws).eof())
throw bad_lexical_cast();
return result;
}
0144デフォルトの名無しさん
NGNGC++のキャストの構文と違うからダウト
0145デフォルトの名無しさん
NGNGお前ヴァカだろ。
0146デフォルトの名無しさん
NGNGclass manip_adapter
{
T val;
Manip manip;
public:
manip_adapter(const T& v, Manip m) : val(v), manip(m){}
friend std::ostream& operator<<(std::ostream& os, const manip_adapter& rhs)
{ return (os << rhs.manip << rhs.val); }
};
template<typename T, class Manip>
manip_adapter<T, Manip> make_adapter(const T& v, Manip m)
{ return manip_adapter<T, Manip>(v, m); }
int main()
{
std::string temp( boost::lexical_cast<std::string>(
make_adapter(make_adapter(100, std::hex), std::showbase)));
std::cout << temp << std::endl;
return 0;
}
おもっきり実装依存だが
つか、ここまでするくらいなら素直に stringstream 使えって言われる罠
0147デフォルトの名無しさん
NGNGなぜでしょうか?
マクロは危険?
副作用はありますが,
#define N_MAX 100
とかなら安全のような気もしますが
constの方が,コンパイラが厳密にミスを見つけてくれるということでしょうか?
0148デフォルトの名無しさん
NGNG0149デフォルトの名無しさん
NGNG>>148に追加
マクロはコンパイラではなく、プリプロセッサで処理される。
処理系によってはconstやenumにしておけばデバッガから
シンボルとして追えたりするので便利なことも多い。
マクロの場合は#undefすれば再定義できるので危険。
他になんかあるかな?
0150デフォルトの名無しさん
NGNGf=100.0/3.0;
warning C4305: '=' : 'const double' から 'float' へ切り詰めます。
なぜに?
小数の計算は,元々doubleで計算されるから?
0151デフォルトの名無しさん
NGNG0152デフォルトの名無しさん
NGNGyes
0154デフォルトの名無しさん
NGNGs="metjgetijgse;9gjser;0gj;sejge09u4g5;4sejgso4ejmo;gnje;oirjge905gjm;e0j5g:;ejmg;e5jge5jg;0erjg;erjhgo59rhjg;rhjgn0p;strhjg";
可能?
0155デフォルトの名無しさん
NGNGconst定数は宣言した分のメモリ空間しか占有しないけど
マクロ定数は利用されているところに展開されるから
いっぱい使われてると、その分メモリ圧迫するとか
そういう事ってあったりするんでしょうか?
というか、そういう違いを吸収するのがコンパイラの性能なんでしょうか?
0156デフォルトの名無しさん
NGNG> const定数は宣言した分のメモリ空間しか占有しないけど
その代わり変数アドレスをそこら中にばらまくことになるから、大差ない。
0157デフォルトの名無しさん
NGNG0158デフォルトの名無しさん
NGNGと
#define ZERO std::complex<double>(0)
はエライちがいじゃないか。
0159デフォルトの名無しさん
NGNG一方が const で他方が非 const だと、全く意味が違うと思われ。
(言いたいことは分かるが)
0160デフォルトの名無しさん
NGNGこれを複数の cpp ファイルにインクルードしたとき、実行時には
cpp ファイル毎に定数のためのメモリが取られるんでしたっけ。
(最適化で変わることもある?)
0161デフォルトの名無しさん
NGNG#define はめったなことじゃ使わないで欲しい
Winプログラムしてると泣けてくる
0162デフォルトの名無しさん
NGNGa[6]={1,1,1,1,-1,1};
while(a[i] != -1)
{
//処理
++i;
}
この場合,別にi++でも問題ないよね?
普通は,どっちを採用した方がいいんだろうか?
0163名無しさん@XEmacs
NGNG++i
0164デフォルトの名無しさん
NGNGかわらない
0165デフォルトの名無しさん
NGNG#define N '\n'
cout << "a=" << a << N;
ウマー
0166デフォルトの名無しさん
NGNG0167デフォルトの名無しさん
NGNG素直にendl使えよ。
ところで、streamって<<演算子呼ばれたら勝手にflush呼ぶんだっけ?
<<演算子じゃなくて、endlん中でflushしてるんじゃなかったっけ?
ostream& endl(ostream& outs)
{
return flush(outs.put('\n'));
}
operator<<()ではflushしてないっす。
0170デフォルトの名無しさん
NGNG0171デフォルトの名無しさん
NGNGgccでconst intの場合を試してみたら、Cの時は実体が作られたけど、
C++の場合は最適化すると実体が消えるみたい。
最適化をしなくても、constを付けるとファイルスコープになるらしく、
hoge.c(cc):
extern const int i;
int main(void) {
return i;
}
moge.c(cc):
const int i = 1;
fuga.c(cc):
const int i = 2;
とすると、Cでコンパイルするとmultiple definition of 'i'に
なって、C++でコンパイルするとundefined reference to 'i'に
なった。
ちなみに、Cで最適化ありの場合、
static const int i = 0;
int main(void) {
return i;
}
をコンパイルすると、return i;はxorになって、iはどこからも
使われていないのに、iの実体だけは作られていた。
Cのこの挙動の理由が分かる人いない?
0172139
NGNG> 最適化をしなくても、constを付けるとファイルスコープになるらしく、
> とすると、Cでコンパイルするとmultiple definition of 'i'に
> なって、C++でコンパイルするとundefined reference to 'i'に
> なった。
仕様だ。C++ では、const つけるとディフェルトはファイルスコープになる。
0173デフォルトの名無しさん
NGNGディフェルト?どういう意味?
0175デフォルトの名無しさん
NGNG乗りツッコミにワラタ
0176デフォルトの名無しさん
NGNG0177デフォルトの名無しさん
NGNGThx.
なんでそんなこと聞いたかというと、
>>165はstd::flushを呼び出してないので、
画面に表示されないこともあるのかなぁ…と。。。
でも、どこかで、'\n'を書き込んだら自動的にフラッシュされるとか
書いてあったような気がする。。。
自信がなくてスマソ
0178vcpp6
NGNGすみません。質問させてください。
クラスのメンバ関数のデフォルトの引数は、
class A{ void func( int = 1 ); }; void A::func( int i ){}
↑以外の方法で指定できますか?
ホントは↓のように指定したいのですが、エラーが出ます。
class A{ void func( int ); }; void A::func( int i = 1 ){}
0179デフォルトの名無しさん
NGNG{
void func();
void func( int i );
};
void A::func(){ func( 1 ); }
void A::func( int i ){}
0180vcpp6
NGNGまあ、ほんの2行ですが。>>179さん回答どうも
引数が複数あるときはその引数数×2行分長くなりますね。
0181デフォルトの名無しさん
NGNGまぁ、しょーがないよ
class A{ void func( int ); };
と宣言されたメンバ関数を
a.func(); と呼び出すことは不可能だもんよ
コンパイラは
void A::func( int i = 1 ){}
なんてされてるなんて知らないからね
0182vcpp6
NGNGなんか、インラインなら出来そうですが、
インラインはやめたほうがいいでしょうか。
メモリを食うとか、何とか、デメリットが有ったような気がします。
↑この辺忘れてしまったので御教授お願いします。
0183デフォルトの名無しさん
NGNGそのアプリケーションのウィンドウ名ということですが、
他の方の作ったアプリケーションのウィンドウ名の
取得はどのようにすればよいのでしょうか?
0184デフォルトの名無しさん
NGNGインライン化しても意味無いと思う
>>183
スレ違いだと思う
0187デフォルトの名無しさん
NGNGインライン(ヘッダに実装がある)ならば技術的に実装は可能だろうけど、
仕様がそれを許してないから意味無い
0188160
NGNG>gccでconst intの場合を試してみたら、Cの時は実体が作られたけど、
>C++の場合は最適化すると実体が消えるみたい。
やっぱりそうですか。
宣言の数がかなり多いので、cpp ファイル毎に領域が取られると
すると無駄になってしまいますよね。最適化を考えない場合は
素直に extern したほうが無難ですかね。。
以前 const 定数について、& 演算子で定数のアドレスを取るなど
しない限りにおいては、#define のように値が定数の使用個所に
埋め込まれる(ことがある?) というような話を聞いたことが
あります。激しくうろ覚えですが、最適化の話だったかも
しれません。
0189デフォルトの名無しさん
NGNGC++だとconstはデフォルトでstaticだから、
アドレス参照などで必要にならない限り実体を持つ必要はない。
念のために書いておくけど、実装上は&を使うかだけでは判断できない。
複合型やdoubleなんかの場合は使っただけで割り当てられる場合もある。
0190デフォルトの名無しさん
NGNGcout << KAKOU(a) << N;
ウマー
0191デフォルトの名無しさん
NGNG0192189
NGNG0193190
NGNG0194デフォルトの名無しさん
NGNG(どっかに実体があってって話わわかるけど、
あんまり使えないっつーこってす。)
0195デフォルトの名無しさん
NGNG0196ブタ
NGNG0197デフォルトの名無しさん
NGNGコンパイラは?
0198デフォルトの名無しさん
NGNGそれか、mainをint型にして0で終了汁
0199ブタ
NGNGC:\Windows\デスクトップ\Hossaka\新しいフォルダver2\visual.c(190) : warning C4715: 'mean' : 値を返さないコントロール パスがあります
って警告がでます.どうしたらいいのでしょうか?
0200デフォルトの名無しさん
NGNGint func1( int i )
{
if( i )
return 3; // 警告。i == 0 では何も返さない。
}
こういうこと
俺はそういう場合,elseをつける派
0203デフォルトの名無しさん
NGNG{
・・・
switch(i)
{
case 1: return 1;
default: return 0;
}
}
これは警告オプションとかきつくしたりしても警告出ませんか?
0204デフォルトの名無しさん
NGNG(i?1) return 1:return 0;
そっちは知らんけど,必ず実行されるならいいんでない?
おすすめはしないけど
0205デフォルトの名無しさん
NGNGそれを書くなら return (i == 1) ? 1 : 0; だろう。
0206204
NGNG0207ブタ
NGNG{
int i,buf;
buf=0;
for(i=0;i<27;i++){
buf+=(int)c[i];
return(buf/27);
}
}
ってなってます
0208デフォルトの名無しさん
NGNGint mean( unsigned char c[])
{ return c[0]/27; }
とどう違うのか?
0209デフォルトの名無しさん
NGNG0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNGと
extern "C"{}
でなぜ同じキーワードを使うのかワカラン
0212デフォルトの名無しさん
NGNG予約語を増やしたくないから。
0213188
NGNG>C++だとconstはデフォルトでstaticだから、
>アドレス参照などで必要にならない限り実体を持つ必要はない。
なるほどです。
このことは言語仕様で決められているとかではなくて
各コンパイラが、こういうケースでは実体は必要ないと
解釈しても良い(実体を生成しなくても良い)という
ことでしょうか。
>念のために書いておくけど、実装上は&を使うかだけでは判断できない。
>複合型やdoubleなんかの場合は使っただけで割り当てられる場合もある。
例えば double 型の定数に記憶が割り当てられるか
どうかは、それぞれのコンパイラの解釈に依るという
ことですよね。
0214デフォルトの名無しさん
NGNGconst はデフォルトでは static linkage だから、それをヘッダに書くと
翻訳単位毎に別々の実体が割り当てられるが。
0215214
NGNGところで extern で const int a; とかとったとしても
printf("%d", a);
というプログラムをコンパイルすると「変数 a のアドレス」が出てくる。
オブジェクトコードのサイズだけ見ると
printf("%d", 1);
も全く変わらんぞ。
0216デフォルトの名無しさん
NGNG0217デフォルトの名無しさん
NGNGなにゆえ?
0218デフォルトの名無しさん
NGNGextern const char str[];
cout << str << endl;
と
cout << "asdfghjklqwertyuiopzxcvbnm" << endl;
が同じだったら考え直す
0219デフォルトの名無しさん
NGNGアセンブリ言語のコード吐かせて比較汁。
0220引きこもり
NGNGinterrupt思い浮かべるか?
0221デフォルトの名無しさん
NGNGint32ならinteger
0222デフォルトの名無しさん
NGNGinterruptはINTって大文字じゃなきゃ。
0223デフォルトの名無しさん
NGNG0224デフォルトの名無しさん
NGNG0225デフォルトの名無しさん
NGNG0226デフォルトの名無しさん
NGNG> IRQは俺だけか、、、
俺もだよ。68系は IRQ だからな。でも、68系のソフトウェア割り込みは、SWI か TRAP だから 86 みたいに混乱 (はしてないようだが...) は無いね。
0227デフォルトの名無しさん
NGNGしかし、断じてこれはintegerではない!
intはintなのだ。ひとつの単語なのだ。
あ〜int、愛しのint・・・
0228デフォルトの名無しさん
NGNGintは積分記号だろ?
TeXnicianですね( ̄ー ̄)ニヤリッ
>>227
>しかし、断じてこれはintegerではない!
分かる気がする…Pascalとかでhoge:integerという表記を見るとなんか違和感がある。
hoge:intじゃないのか、と。たまに人のDelphiのソースいじったりすると、hoge:intと書いて
コンパイラに怒られています…(;´Д`)
0230デフォルトの名無しさん
NGNG0231デフォルトの名無しさん
NGNGほんとうは文字列でもなんでもないくせに、自分の所在をchar *で表すようなやつはダメ。
0232デフォルトの名無しさん
NGNGBYTEならいいですか?typedefで見せ掛けだけですが・・・
ofstreamでバイナリで開いてもバイナリで書き込んでくれませんが
こんなにファイルサイズが勿体無い仕様にしたのは何故でしょう?
0233デフォルトの名無しさん
NGNG?
0234デフォルトの名無しさん
NGNGofstream fout("aaa.a",ios::out|ios::trunc|ios::binary);
fout<<0x12345678<<'\n';
fout.close();
とやってもファイルには
305419896
と書かれるのですが・・・
0235デフォルトの名無しさん
NGNG0236デフォルトの名無しさん
NGNG0237デフォルトの名無しさん
NGNG0238デフォルトの名無しさん
NGNGどういう結果を期待してたの?
0239234
NGNG0241234
NGNGfin>>iで
iのサイズとれば値を取得できるような・・・
0242234
NGNGテンプレート関数内でTのサイズ計れなかったですか?
計れるのならばバイナリで直接数値をぶち込んでも問題はないかと
時間なのでもうすぐ帰ります
0243デフォルトの名無しさん
NGNG> typedefで見せ掛けだけですが・・・
身分詐証、それがイカンのよ。
0244デフォルトの名無しさん
NGNG>いやバイナリで開いてるんだから数値を直接入れてくれてもいいのかなと
ネタとしか思えん…
0245デフォルトの名無しさん
NGNGそう純粋に信じていた無垢な時代が、漏れたちにだって……なかったなあ
0246デフォルトの名無しさん
NGNG0247デフォルトの名無しさん
NGNGってそろそろ来るんだろうな・・・。
0248デフォルトの名無しさん
NGNGどうしたらいいでしょうか?
0249デフォルトの名無しさん
NGNGcppファイル1つにhファイルが2000、とかの状況に萌えろ。
0250デフォルトの名無しさん
NGNGC++ 廃業する。
0251デフォルトの名無しさん
NGNGpimpl をただの構造体として使っているとか?
メンバ関数も持たせて、処理を移譲するようにしてやると少しは
オブジェクト指向らしくなると思う。
オレは昔は純粋仮想関数からなるインタフェースクラスを継承することに
美を感じていたが、最近では多態が不要なところでそれをやるのは
ダサいと思うようになってきた。そういうところは、pimpl を使って
処理を移譲するほうが美しい。
0252デフォルトの名無しさん
NGNGただの構造体隠蔽として使う方がまだ美しいと感じる。
ガワと中身という違う物を実装しているとはいえ、
見てくれ(インターフェイス)が同一な物を2度作らなきゃならんのがダサいと思う。
>最近では多態が不要なところでそれをやるのは
同一の理由により、インターフェイス継承もやりたくない。
0253デフォルトの名無しさん
NGNG男は黙ってコンパイルせい!!
Pentium 166MHzで!!!
0254デフォルトの名無しさん
NGNG・・・・あ、structureのことか。
日本語キモくって最近使って無かった(w
0255デフォルトの名無しさん
NGNG大和言葉を使いなさい
0256デフォルトの名無しさん
NGNG国賊め!!!
北朝鮮に拉致されてしまえ!!!
0257デフォルトの名無しさん
NGNGデータ構造だのprivate関数だのを外に晒す必要も無くなるだろうに。
あとメンバtypedefやメンバconstの類も。
operator newがあれば前方宣言だけでインスタンスまで作れる。
0258デフォルトの名無しさん
NGNGそのかわり間接参照が一回増えるのが嫌…っつー時代に設計された言語だ。
そこを責めてくれるな。
0259デフォルトの名無しさん
NGNGVisual C++の場合
cl /GX /P smp1.cpp -/Pスイッチで前処理だけしてsmp1.iファイルを作る
というふうに本に書いてあったのですが,意味がわからないのですが・・・
あと,cstdioとかは,ネームスペース名は,std;ではなくてどういうのになるんでしょうか?
0260デフォルトの名無しさん
NGNG考えた方法は
1.バッファを確保し strncpy 後に NULL を追加して <<(ostream&, char*)
うまくいくだろうけどバッファの動的確保のコストが気になる。
2.ループで指定文字数まで <<(ostream&, char)
うまくいくだろうけど効率悪すぎ
3.std::setw
指定文字数より長い場合には何もしてくれない
4.同期化された静的バッファにコピー後に <<(ostream&, char*)
バッファ長より長い文字列の場合に結局ループしながら書き出さなければならない & 同期化のコストもちょっと気になる。
何か良い方法はないでしょうか?
0261デフォルトの名無しさん
NGNGない
0262デフォルトの名無しさん
NGNGそんな冷たい事言わずに…
「ない」って言い切るくらい凄腕な方なら、私が考えた例よりも
効率の良い方法とかもいくつか思い浮かんだりするでしょう?
トレードオフの問題も絡めて、私の愚考よりも少しでもいい方法とかあったら
教えてください、よろしくお願いします。
0263260
NGNG0264デフォルトの名無しさん
NGNGスタック上にインスタンス作ったり、operator newが無かったりする時は、
クラスの定義が必要、となっていれば、別にオーバーヘッドは無いだろ。
0265デフォルトの名無しさん
NGNG単純に
basic_ostream::write( const char_type *, streamsize )
でダメなのか?
0266デフォルトの名無しさん
NGNGcout << (cin >> n) << endl;
なんか変な数値が出るんだけども,cin関数の戻り値が表示されてるってこと?
0267デフォルトの名無しさん
NGNG効率の良い方法を求めてるわけ?
答えは簡単。
ostreamを捨ててどっかからファイルクラスを拾ってくる。
これ、最強。
0268デフォルトの名無しさん
NGNGMSDNより
cin
extern istream cin;
このオブジェクトは、標準入力からバイト ストリームを抽出します。オブジェクトが生成されると、cintie() を呼び出し、&cout を返します。
0269デフォルトの名無しさん
NGNG{
};
struct B
{
friend void func(A& a)
{
}
};
struct C
{
friend void func(A& a)
{
}
};
void test()
{
A a;
func(a);
}
これってエラーにならんのね(VC)
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNGstruct B と C のどっちのfuncを呼んだのだろう?と思って
舌のようなコードにしたら、Bが呼ばれてた。
struct B
{
friend void func(A& a)
{
printf("struct B\n");
}
};
struct C
{
friend void func(A& a)
{
printf("struct C\n");
}
};
…Cのほうは?
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNGデフォルトのメンバがprivateかpublicか。
0274デフォルトの名無しさん
NGNG+キーワードの違い
0275デフォルトの名無しさん
NGNGstructはprivateなメンバがないクラスを記述するのに使うとよい。
0276デフォルトの名無しさん
NGNGoperataor new というか、ファクトリを前クラスに定義しろって話か?
できそうな気はするが、多重定義や名前空間に絡んで、予期せぬ名前解決された
ときにリンクするまで(あるいは実行時エラーが出るまで)トラブルが判明しないとい
う嫌なバグを作り込みそうな気がする。
0277デフォルトの名無しさん
NGNGVCがヴァカなだけでは?
0278デフォルトの名無しさん
NGNG0279デフォルトの名無しさん
NGNGfuncがすでに定義されてると。
iostreamはストリームの状態を表す為にoperator void*()とoperator!()をオーバーロードしてるんだよ。
std::cout << (cin >> n) << std::endl;
この場合、istream::operator>>(istream&, T)は第一引数を参照で返すから、
(cin >> n)はcinそのものを返す、と。
で、そのあとcinを出力する為にistream::operator void*()を呼び出す為、
一見不可解な値が表示されるというわけ。
0281デフォルトの名無しさん
NGNG0283デフォルトの名無しさん
NGNG0284デフォルトの名無しさん
NGNGあきらめろ、おまえには無理だ。
0285デフォルトの名無しさん
NGNG最初は誰でもわからない、特にC++はCとは違って体系的な学習が
不可欠だ。
取り敢えず入門書1冊読破せよ。
0286デフォルトの名無しさん
NGNGはるひこさんのビギナー編ファイル入出力意外全部読みました
C++やると,C言語に戻りたくないですね
0287デフォルトの名無しさん
NGNG読むだけではなく、手間を厭わず打ち込んで試してみた?
そういう一見無駄な努力が、実はとても役に立つのだ。
0288デフォルトの名無しさん
NGNGすごくうちまくったよ
とはいわないけど,50回くらいは,
cout << "a=" << a << '\n';
進化
cout << "a=" << a << endl;
とか打ちましたよ
まーもっと打てよぼけとか言われそうですけど
C++覚えると,就職有利になりますかね?
c/c++募集ってとこにいきたいんですけど,C言語だけしか覚えていないんですよね
0289デフォルトの名無しさん
NGNG晴彦はどうかと思うが…。
まあ次は何かアプリ作ってみなさいってこった
0290デフォルトの名無しさん
NGNGあとは using namespace std; を外して、std::を識別子の前に付ける
ようにすればよい。
就職は、ほとんど会社に入ってから覚えさせられる事が多いので、
まずは自分でバグ取りできるだけの力をつけるようにする。そうすれ
ば進歩が速い。
0291デフォルトの名無しさん
NGNGクラス内でusing namespace std;とかする分には
問題ないんじゃ?
0292デフォルトの名無しさん
NGNG0293デフォルトの名無しさん
NGNGかといってC++の#includeはいやだ・・・う〜〜む・・・
0294デフォルトの名無しさん
NGNG> C++覚えると,就職有利になりますかね?
C++ 使う職場なら、もちろん有利になる。
0295デフォルトの名無しさん
NGNGstd::ios::noreplace
がないんだけど。
他に変わる物もみたらないのですが、どうすればよいのでしょうか?
0296デフォルトの名無しさん
NGNGhttp://www.microsoft.com/japan/developer/library/vccore/_core_differences_in_iostream_implementation.htm
古いiostreamを使うのが一番手っ取り早いかと。
0297デフォルトの名無しさん
NGNGヘッダなんて無駄なだけだろ
0298295
NGNGありがとうございます。
古いバージョン使うのあまり気が進まないです。(将来使えなくなりそうなので)
先にファイルOPENして確認するとかしかないか...。
0299デフォルトの名無しさん
NGNG分けないとネストが深くなりすぎてみにくくなる。
まぁ、オレもC/C++の#includeはちょっと好きじゃないけど。
C++なんてnamespaceがあるんだからヘッダのネストとかで悩ませられるのはどうかと思う。
0300デフォルトの名無しさん
NGNGそもそも2度同じこと(プロトタイプ宣言とか)を書かないといけないのがスマートじゃない…。Cは仕方無いとして、
C++はなんでヘッダがあるんだろう…?
0301デフォルトの名無しさん
NGNGテンプレートライブラリのため
0302デフォルトの名無しさん
NGNGただC++によってそのコードは今生かされているだけなのです。
0304デフォルトの名無しさん
NGNGなら、ヘッダに全部書けよ。
0305デフォルトの名無しさん
NGNG0306デフォルトの名無しさん
NGNG0307デバックの名無しさん
NGNG0308デフォルトの名無しさん
NGNGランダムマスターでも使え。
http://www2.toshiba.co.jp/efort/market/rmaster/index_j.htm
0309デフォルトの名無しさん
NGNG0310デフォルトの名無しさん
NGNGhttp://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=%E4%B9%B1%E6%95%B0%E7%99%BA%E7%94%9F%E6%B3%95
0311デバックの名無しさん
NGNGC++でやりたいんです。
0312デフォルトの名無しさん
NGNGhttp://www.emit.jp/mt/mt.html
0313デフォルトの名無しさん
NGNGhttp://www.boost.org/libs/random/index.html
0314デフォルトの名無しさん
NGNGある意味、保証されているが、そういう認識の仕方は少し問題だと思う。
0315デフォルトの名無しさん
NGNGどういう事ですか?
Cで比較演算の真偽値が0/非0と言うのは理解してますが、
C++だと0/1が保証されているという記事を読んだので、どうなのだろうと。
0316デフォルトの名無しさん
NGNG厳密にはC++で比較演算の結果はbool型のtrue/falseを返す。
これを整数に変換すると1/0になるという認識が正しい。
0317デフォルトの名無しさん
NGNGされてる場合もあるからなあ。。
0318デフォルトの名無しさん
NGNGなるほど。
サンクスコです
0319デフォルトの名無しさん
NGNGstd::ofstream TestFile("./test.txt");
として
TestFile << "test message...";
とやった場合、メッセージの部分は
fstreamの内部にあるバッファへ溜め込まれているだけ
という認識でいいんでしょうか?
TestFile.flush()するまでファイルアクセスは無いですよね?
fstreamのソースみてもわけわからないです・・・
0320デフォルトの名無しさん
NGNG0321デフォルトの名無しさん
NGNGそんなもん実装依存だよ
flushすれば確実に吐き出されることが保証されているだけ
0322デフォルトの名無しさん
NGNGバッファが一杯になると自動的にフラッシュされる。
0323デフォルトの名無しさん
NGNG参照できるような関数ってあるんでしょうか?
例えばTestFile.c_str()みたいな・・・
0324デフォルトの名無しさん
NGNGrdbuf()
0325デフォルトの名無しさん
NGNG検索したらゾロゾロ出てきました
ありがとう
0326デフォルトの名無しさん
NGNG0327デフォルトの名無しさん
NGNG全表示する。
#include <iostream>
#include <fstream>
int main()
{
std::fstream ifs("rdbuf.cpp");
std::cout << ifs.rdbuf();
}
0328デフォルトの名無しさん
NGNGそれも実装依存。
0329デフォルトの名無しさん
NGNG327です。
ソースきぼん。
俺のソースはC++標準ライブラリ、P603、§13.9。
0330デフォルトの名無しさん
NGNG0331デフォルトの名無しさん
NGNGstd::endl std::ends std::flush の実体ってどこで宣言(定義)されてるんでしょうか?
ヘッダファイル群にGREPしたところ、ヤツらの型が
basic_ostream& (*pf)(basic_ostream&)で受け取れるとこまではわかったんですけど
受け取ってからどうやって振り分けたものか悩んでおります
ストリームのラッパークラスなんて初心者が手を出すような領域じゃ無いのかな・・・
0332デフォルトの名無しさん
NGNGbasic_ostreamのような気がする。継承を見ていくと。
0333デフォルトの名無しさん
NGNG実装によるのでコンパイラと使ってるiostreamライブラリぐらいは書いた方が。
今俺の手元にあるSTLPort for DegitalMarsC++ だと stl/_ostream.h にあったが。
つーか、振り分けって具体的に振り分けて何をするつもりだ?
endl をトラップして自前の改行文字を書くフィルタを作るとかか?
0334331
NGNGファイルクローズの際に、またその時の時刻の文字列をファイルの終端に書き足すクラスで
標準ストリームのように、<<演算子で次々挿入できるようにして
endlとflushを受け取ったときに標準ストリームと同じ様な挙動にしたいなぁと
とりあえず<<演算子のオーバーロード(&受け取った型毎オーバーライド)と
endlを捕まえてバッファの内容を吐き出すところまでは実装できたんですが
そういやflush受け取ったときはどうしよう・・・と悩んでいる最中です
0335331
NGNGパブリックなメンバ作ればいいじゃねぇかと言う話かもしれませんが
mystream.lpfstream << "なんたらかんたら" << endl; とかやると
↑の部分が見苦しいナァと思いまして・・・
贅沢言うな!ってとこなんでしょうか
0336デフォルトの名無しさん
NGNGそれだったら、basic_fstreamをpublic継承して、endl, ends, flushだけを
オーバライドすればいいのでは。
0337331
NGNGfstreamってバッファがいっぱいになると勝手にファイルに書き込んじゃうらしいので
明示的に「書き込め!」って指示するまでひたすらバッファへ溜め込むようにしたいんです
>336氏の方法だと、ファイルオープン/クローズ時の
現在時刻の書き込みはどう実装すれば良いんでしょうか?
0338デフォルトの名無しさん
NGNG0339デフォルトの名無しさん
NGNGコンストラクタ/デストラクタまでオーバライドする必要があるなあ。
しかもbasic_ostreamのヘッダを覗いていたら、endl, ends, flushなど
のマニピュレータは、basic_ostreamのメンバ関数ではない様子。
そうなるとオーバライドできないですね。
やはりここは myendl, myends, myflushなど名前を変えた方がよいかも。
rdbuf(pointer)で、大きなストリームバッファは設定できるけど、
出力に合わせて拡張するストリームバッファなんてどうやって実現
していいものやらさっぱりわかりません。
0340331
NGNG可変長バッファの問題はクリアだと思います
flushをendlと同義に扱うか、もっと研究してflushの正体を暴くか
どちらかかと思うのですが・・・
ちなみに以前myendlなどで実装しようと目論んだ事がありましたが
マニピュレータのやり方がわからず、グローバルなmyendlクラスを定義して
お茶を濁すという、なんとも恥ずかしい過去がありまして
今度こそスマートに実装しようとがんばってみましたが、ちょっとお手上げ状態です・・・
0341デフォルトの名無しさん
NGNGそれだったら何とかなるかも。ユーザー定義のマニピュレータですよね。
template <class charT, class traits>
inline
std::basic_ostream<charT, traits>&
myendl(std::basic_ostream<charT, traits>& strm)
{
strm << std::endl;
// ここにさせたい処理を書く
}
のような感じでどうでしょう。
0342デフォルトの名無しさん
NGNG0343デフォルトの名無しさん
NGNG移植性を考えたときによく分からなくなってきたので質問させていただきます。
最初は以下のようにしました。
void writeInt32(std::ostream &o, long v)
{
o.write((char*)&v, sizeof(v));
}
これだと以下のようなことが気になりました。
・long*をchar*にした結果は実装依存?
・sizeof(long)が4とは限らない
・longが負の時のビットパターンが2の補数表現とは限らない
というわけでとりあえず次に以下のようにしました。
o.put(v & 0xff);
o.put((v >> 8) & 0xff);
o.put((v >> 16) & 0xff);
o.put((v >> 24) & 0xff);
ところが、putの引数はcharなんです。
プログラミング言語C++第三版の付録C.3.4(p.942)の下の方には
> void f(char c, signed char sc, unsigned char uc)
> {
> c = 255; // 限定無しのcharがsignedで8ビットなら未定義
とあります。
つまり、(v & 0xff)の結果が255の場合、o.put(v & 0xff)は未定義なのではないでしょうか?
あと、負数が2の補数表現でない場合も考えないといけなそうです。
結局標準C++の範囲内でなんとかするのは不可能なのでしょうか?
0344デフォルトの名無しさん
NGNG0345デフォルトの名無しさん
NGNG符号付き整数の右シフトも怪しいから、
unsigned long l = (unsigned)v;
としてからo.put(l & 0xff)として書き込むのが良いかと。
0346デフォルトの名無しさん
NGNGcharに127を超えるintを代入した時だけが未定義なのであって、
(v >> 8) & 0xffをputするのは別に代入ではなくて関数の引数
だから大丈夫では?
0347343
NGNG>数値表現の可能性を論じてたら先に進まない。
全くその通りですね。2の補数ではない時を考えて負だったらビット反転させて1足して……とかアホなことをやろうかと思ったところで目が覚めました。
>unsigned long l = (unsigned)v;
>としてからo.put(l & 0xff)として書き込むのが良いかと。
実用上これで問題ないと思うのですが、C++標準でsigned charの範囲以上の値を使用した場合の動作が未定義となっているならちょっと怖いなと思ったもので。
どなたかこのコードでうまくいかない環境をご存じの方いらっしゃいますか?
>>346
私もその可能性はあるかなとは思いましたが、一応値渡しですし、代入していることになるのかなと。うーん……
0348デフォルトの名無しさん
NGNGビットパターンでの表現を絶対に保つ必要があるキャストということなら、
o.put( reinterpret_cast<char>( l & 0xff ) );
で一応定義された範囲の動作にならんかなぁ。自信ない。
0349デフォルトの名無しさん
NGNG普通の数学的処理(比較、商、剰余)をすればよい
0350デフォルトの名無しさん
NGNG0351デフォルトの名無しさん
NGNGJavaにできてc++にできないのはものすごく悔しいんですが...
Singletonを応用すれば動的確保限定で継承できないclassが作れますが、
静的なインスタンスが作れないのと、カッコワイルので誰かエレガントな実装を教えてください。
0352デフォルトの名無しさん
NGNGヘッダに「継承したら頃す」とか書いとけ
0353デフォルトの名無しさん
NGNG0354Java厨
NGNG悔しいかぁ
>^_^<ぎゃははははは−(爆w
0355デフォルトの名無しさん
NGNGのときは、
hoge = new char[10];
とやればいいと思っているのですが、
char hoge[];
と宣言されている変数を初期化するには、
hoge[10]
とかやればいいの?
0356デフォルトの名無しさん
NGNG__sealed
とか言ってみる
0357デフォルトの名無しさん
NGNGこれはコンパイル通らないのではない?
0358デフォルトの名無しさん
NGNGコンストラクタをprivateにする。
0359デフォルトの名無しさん
NGNGvoid f(char hoge[]){
// ...
}
...って、どっちも初期化の必要は無いな。正直俺の手には負えません
0360デフォルトの名無しさん
NGNGstd::cout << "max(long double): " << std::numeric_limits<long double>::max() << std::endl;
gcc3.2(MinGW)です。
0361デフォルトの名無しさん
NGNGreturn NULL; するのはマズいですか?
const char* const hoge() の方がいいかな・・・
0362デフォルトの名無しさん
NGNG値返しだから前者でいいです
0363デフォルトの名無しさん
NGNGあのー、できるだけC++ではNULLの代わりに0を使った方がいいです。
0364デフォルトの名無しさん
NGNGネタ?
0365デフォルトの名無しさん
NGNGC++の時は、NULLは0になるのでしょうか。
0366デフォルトの名無しさん
NGNGC++ thirdを読みましょう。
# ドッチデモイイキガスルケド
0367デフォルトの名無しさん
NGNG#ifndef NULL
# if defined(__cplusplus)
# define NULL 0
# else
# define NULL ((void *)0)
# endif
#endif
ほとんどの場合 (void *)0で問題ないけど、>>57-62のような
環境もあるから、0を使った方が無難かと。
0368デフォルトの名無しさん
NGNG62 は環境の問題じゃなくて自分で勝手に
#define NULL ((void*)0)
したせいでうまくいかなくなったって話じゃないの?
NULL は所詮マクロだから処理系依存だけど、
ほとんどの環境で 0 になってるし、なってなけりゃ自分で#defineすればいいだけの話。
むしろ
p = 0; //( p は int* )
とかなってて、この近辺でバグってるっぽい時に、
本当は *p = 0 なのか p = 0 なのかいちいち見直さなきゃいけないのは時間の無駄。
NULL はソースの可読性を上げるためのもんなんだから使ったもん勝ちでしょ、
と漏れは思います。
0369デフォルトの名無しさん
NGNG0370デフォルトの名無しさん
NGNG/* A null pointer constant. */
#if defined (_STDDEF_H) || defined (__need_NULL)
#undef NULL/* in case <stdio.h> has defined it. */
#ifdef __GNUG__
#define NULL __null
#else /* G++ */
#ifndef __cplusplus
#define NULL ((void *)0)
#else /* C++ */
#define NULL 0
#endif /* C++ */
#endif /* G++ */
#endif/* NULL not defined and <stddef.h> or need NULL. */
#undef__need_NULL
となっているから、やはり 0 になるようですね。NULLを使っても現時点の
コンパイラでは問題が出ないようになっているのかなあ。
0371デフォルトの名無しさん
NGNGmember-declaration:
decl-specifier-seqopt member-declarator-listopt ;
function-definition ;opt
::opt nested-name-specifier templateopt unqualified-id ;
using-declaration
template-declaration
という部分がありますが上から三番目ってなんですか?
class c {
std::vector<int> ;
};
とかやっても結局一番上のやつが適用されているように見えます。
(まぁコンパイルエラーですが)
あと、unqualified_id に template_id が含まれているのもようわかりません。
unqualified-id:
identifier
operator-function-id
conversion-function-id
~ class-name
template-id
誰か教えて♥
0372デフォルトの名無しさん
NGNGマシンによるnull pointerの実際の表現がどんな形であろうと,
ソースの方が0であれば何の問題もない。
で,NULLはnull pointerであることを明示するためのものだから,
#define NULL 0
が正解
(C++では)
0373デフォルトの名無しさん
NGNG0374デフォルトの名無しさん
NGNGmalloc/free?
0375デフォルトの名無しさん
NGNG0376デフォルトの名無しさん
NGNG0377デフォルトの名無しさん
NGNG0378デフォルトの名無しさん
NGNG1 無価値の,効果のない,重要でない.
2 ない,存在しない,ゼロの,ゼロに等しい.
3 〔数〕(集合で)空(くう)の
a 〜 set 空集合.
4 特徴[表情]のない,無表情な.
NULLスレの余寒
0379デフォルトの名無しさん
NGNG俺の会社では 0 を使っているが。(C++ 3rdに従っている)
>>368氏の意見にも一理あるが、処理系が異なっても NULLの
意味合いを維持できるかちょっと心配がある。
0380デフォルトの名無しさん
NGNG0381デフォルトの名無しさん
NGNGそりゃ char* p; if ( p == NULL ) ...
が通らなくなるからねえ
0382デフォルトの名無しさん
NGNG0383361
NGNGぼくが聞きたかったのは、constポインタを返す関数なのに
NULLつーどこに実体があるのか知れないモノを返して良いものかという疑問なワケでして・・・
const char& hoge() だとコンパイルエラーだし、ホンマにえぇのんかっちゅー・・・
0384デフォルトの名無しさん
NGNGC++標準ライブラリでは全ての識別子はstd名前空間内で定義されることに
なっていると思いますが、NULLはどうしてstd::つけなくていいんでしょうか?
NULLは<cstddef>で定義されるとありますが、同じcstddef内で定義される
size_tはよくstd::size_tと書いてあるのを見ます。
でもstd::NULLというのは見たことが無いのですが……
(というか、コンパイル通りませんでした。いや、書きたくもないですが(笑))
#define NULL 0じゃstdに入れられないのは分かるけど
C++3rd 5.1.1のようにconst int NULL = 0;とかにすればできなくはないでしょうし。
このあたりのtypedefやマクロの頭につけるstd::の有無はコンパイラによって
かなりばらつきがあるみたいです。ホントのところどうなってるんでしょう?
0386デフォルトの名無しさん
NGNGconst int NULL = 0; ってポインタに変換できるの?
コードに直接書かれた 0 だけだと思ってたんだけども
0387デフォルトの名無しさん
NGNG0388361
NGNGそんなもんスレ読んどりゃわかるわカス
スレがメチャクチャなりだしたから
なんであんな阿呆な質問したんか説明しに来ただけじゃドアホ
0389デフォルトの名無しさん
NGNG0390デフォルトの名無しさん
NGNG0391デフォルトの名無しさん
NGNG0392デフォルトの名無しさん
NGNG0393デフォルトの名無しさん
NGNGC++3rdの5.1.1「ゼロ」の最初によると
「ゼロ(0)は、int型である。しかし、標準変換(C.6.2.3)があるので、
0はすべての整数系データ型、浮動小数点数型、ポインタ型、
メンバへのポインタ型の定数解いて使うことが出きる。……」
ってなってます。で、C.6.2.3「ポインタとリファレンスの変換」を見ると、その中に
「0と評価される定数式は、暗黙のうちに任意のポインタまたはメンバ型への
ポインタに変換できる。」
とあるので、0になる定数式ならなんでもNULLとして使うことができるのでは
ないかと思います。たぶん。
0394デフォルトの名無しさん
NGNGNULL NULL してきたのですがこれって病気でしょうか?
0395デフォルトの名無しさん
NGNGサンクス
定数式なら桶なのねん。
・
・・
・・・・・・・・
char* p = ( 50+20*4 )/5 - 26 も null ポインタになるのかしらん?
0396デフォルトの名無しさん
NGNGint a = 1;
a--;
char *p = a;
あ、コンパイル時に無効なアドレスに変換できないからダメなのかな。
0397デフォルトの名無しさん
NGNG当然
>>396
だめぽ
0398デフォルトの名無しさん
NGNGclass Foo
{
template<typename T> class Bar;
};
::Foo::template Bar<int>; // 三行目
ってことじゃないの?
見てのとおり、メンバークラステンプレートのスペシャライゼーションの
宣言だけれど。
template_id はテンプレートのスペシャライゼーションを表すものなんだから
unqualified_id に入るのも当たり前な気もするけど。
詳しく知りたいなら、一度 ISO/IEC 14882 に目を通すことを進める。
0399デフォルトの名無しさん
NGNGclass CTest {
:
public:
CTest mFuncA();
CTest& mFuncB();
:
}
Ctest Ctest::mFuncA(){
return *this;
}
Ctest& Ctest::mFuncB(){
return *this;
}
0400399
NGNG下記のコードをコンパイルしてステップ実行したのですが、
戻り値が CTest と CTest& の違いがよく分かりませんでした。
どのように使い分けるのでしょうか?
class CTest{
public:
int a;
CTest mFuncA() {return *this;}
CTest& mFuncB() {return *this;}
};
int main() {
CTest ct1,ct2;
ct1.a = 10;
ct2.a = 100;
ct2 = ct1.mFuncA();
ct1.a = 20;
ct2.a = 200;
ct2 = ct1.mFuncB();
ct1.a = 30;
ct2.a = 300;
return 0;
}
0401デフォルトの名無しさん
NGNG前者はイヤンな一時オブジェクトを生成する。
後者が返すのはthisそのもの。
# (゚Д゚;)
0402デフォルトの名無しさん
NGNGspecialization というか、qualification だよね。
C++ 3rd, C.13.6 に書いてある。
0403401
NGNG違うかも。
0404デフォルトの名無しさん
NGNG合ってるよ。
referenceを返す方は当然
ct1.mFuncA().a = 20;
ct2.mFuncA().a = 30;
のような書き方ができて、元のオブジェクトのメンバを変えられる。
ct1.mFuncB().a = 20;
ct2.mFuncB().a = 30;
はエラーではないが、一時変数を変更するだけで、その値は捨て
られるので何の効果もない。
0405デフォルトの名無しさん
NGNG0406デフォルトの名無しさん
NGNG関数funcの引数としてB,Cをとりたいとき、
1. template <typename hoge> func (hoge tmp)
2. func (A tmp)
実行速度を含めてどっちがいいんでしょうか?
0407デフォルトの名無しさん
NGNG顔を洗って出直して来ること。
func ([const] A* tmp);が正解。
func (const A& tmp);もまあOK。
0408371
NGNGありがとうございます、が意味がよくわかりません。
>::Foo::template Bar<int>; // 三行目
のとこはクラスの外側だから「三行目」にはならないと思うんですが。
(templateもいらない(あってはならない?)ような?)
>見てのとおり、メンバークラステンプレートのスペシャライゼーションの
>宣言だけれど。
ということですが、これはなんか意味を持っているのですか?
int;
ってするのと構文的には同じ(block-declaration -> simple-declaration)
ように見えます。
実際、gcc2.95では
> declaration does not declare anything
っていわれます(templateは削って)。
>詳しく知りたいなら、一度 ISO/IEC 14882 に目を通すことを進める。
そこから文法を引用しました。本文は長いので眺めただけですが。
0409402
NGNG0410デフォルトの名無しさん
NGNGC++3rd買うくらいならIS買う人もいるんだから
持ってるのが当然って言い方はどうかと :P
0412402
NGNGでも、後続する unqualified-id が template であることを明示する、
という機能では同じものかと思う。ところで、今、
template<class T> class Foo {
T::template hoge<int>;
};
とか試したけど、g++ 3.2 じゃ、エラーになるね。
ISO C++ forbids declaration of `hoge' with no type
`::hoge<int>' is not a valid declarator
とか言われる。書き方が間違ってる?
0413デフォルトの名無しさん
NGNGtypename T::template hoge<int>; とすればよい。
0414371
NGNGえーとつまりキーワード「template」について
nested-neme-specifier や qualified-id や上述の member-declaration で
同じ意味(次の'<'は演算子ではない)で使われているということ
を言ってるのですか?
それならその通りだと思いますが、>>371の質問の意図は「上から三番目」
がどの場面で適用されるのか?ということなので。
>>412で挙げてある例(?)に>>413の修正をしたものも明らかに>>371の
「一番上」が適用されると思うし(typenameがあるから三番目にはならない)。
勘違いがあれば突っ込んでね♥
あ、あと>>371でunqualified-idにtemplate-idがなぜ含まれるのかわからん
って書いてるのはusing-declarationで使うからっていうことで自分では
納得できたので、この理解で問題なければ触れていただかなくて結構です。
0415デフォルトの名無しさん
NGNGこっちの方が適切と思うのでこちらにだけ繰り返し
張らせていただきます.ごめんなさい
<困ってること>
継承を介してメンバ関数のオーバーロード
ではなく多重定義を狙ったのですがうまくいきません.
<詳細>
親クラスから継承して子クラスを作りました.そのとき,
親クラスで定義したSet(int)というpublicな
メンバ関数があるのですが,これと同じ関数名で
引数の違うSet(int,int)という関数を定義しました.
これで,子クラスにSet(int)とSet(int,int)という
多重定義されたメンバ関数が定義されたと思い
まして,喜び勇んで子クラスで宣言した変数a
からa.Set(int)を呼び出したらgccに
「そんなメンバ関数無いよ」と起こられました.
誰か,こんな現象について知っている方
解説お願いします.
0416デフォルトの名無しさん
NGNG親の関数は引数にかかわらず全て隠されてしまいます。
0417デフォルトの名無しさん
NGNG0418デフォルトの名無しさん
NGNGExceptional C++という本にも説明があったと思う。
今実験したんだけど、virtualでも隠されるとは思わなかった・・・
0419デフォルトの名無しさん
NGNGusing 親::Set;
って書けばよいです。
なぜこんなことになるかというと
オーバーロード解決はその識別子が見つかった時点で親にさかのぼるのを
やめてしまうからです。
つまり 子::Set があるので 親::Setは候補に入らないのです。
で、using-declarationによって 親::Set が 子::Set と同じレベルに置かれるので
OKになるっていうことだと。
0420デフォルトの名無しさん
NGNGどうもありがとうございます.
なるほど,そうでしたか!!このように隠れてしまわない
ためにできる方法はないでしょうかね?ちなみに技術評論社
「決定版 はじめてのC++(塚越一雄)」では
これができるとし っかり書いてありました
が,騙されたということですね.それにしても
分かってよかったです.大変お世話になりました!!
0421デフォルトの名無しさん
NGNG適当な拡張はあるの?
0422398
NGNGC++標準はメンバークラステンプレートの任意のスペシャライゼーションを、
クラス定義の外部で宣言することを許している(クラス内部に存在しなければ
定義もOK)。
だから、クラス定義の外で問題ない。
>これはなんか意味を持っているのですか?
宣言だけしといて、定義しなけりゃその型のスペシャライゼーションを
抑止できるような気もするが……気のせいかもしれない。
#手元にVC7しかないので……
>そこから文法を引用しました。本文は長いので眺めただけですが。
あるなら、せめて9.2とか14.2 とか、ちゃんと読んでみてほしいな
0423デフォルトの名無しさん
NGNG自重しる
0424デフォルトの名無しさん
NGNGExceptional C++にはちゃんと書いてあったんですね!
購入を検討します.
>> 419
かっこいいですね!ちゃんと隠蔽の回避方法があるとは!
みなさん,丁寧な説明痛み入ります.ありがとう!!
0425デフォルトの名無しさん
NGNG0427399 = 400
NGNG>>404 >>405
おっしゃるような現象が確認できました。
(ct2.mFuncA().a = 30; の方はコンパイルエラーになりましたが、)
なんとなく違いが分かりました。どうもありがとう。
0428デフォルトの名無しさん
NGNGあなたがback_inserterだからです
0429421=428
NGNGサンクスコ
0430デフォルトの名無しさん
NGNG基底クラスのメンバは異なるスコープに属しているので、両方に
同じ名前のメンバ関数があるときは多重定義されるのではなくて
派生クラスのものが基底クラスのものを「隠す」ということに
なるようです。
0431430
NGNG0432371
NGNGもしかして自分は大前提を知らないのかもしれないので
まずひとつだけ教えてください。
スペシャライゼーションってどういう意味で使ってますか?
自分が知ってるのはクラステンプレートでは
template</* ... */> class templ_name<int> { /* ... */ };
っていうのだけなんですが、これのほかに
最初に「template」が置かれない「スペシャライゼーション」と呼ばれるもの
があるのですか?
( >>398では ::Foo::template Bar<int>; を
「スペシャライゼーション」といってるのですよね?)
0433デフォルトの名無しさん
NGNGS-JISのコードを指定して出力っていうのが、どうしても半角になってしまうんです。
どうしたら全角で出すことが出来るでしょうか?
0434デフォルトの名無しさん
NGNG{
puts("これでも半角になるのかYO!");
}
0435433
NGNGありがとうございます。
でも、変数にs-jisの文字コードをいれて、
それをs-jisだと指定して、全角で出力するにはどうするといいでしょうか?
よろしくお願いします。
0436デフォルトの名無しさん
NGNG0437デフォルトの名無しさん
NGNG0438デフォルトの名無しさん
NGNG{
std::string s = "これでも半角になるのかYO!";
std::cout << s << std::endl;
}
0439デフォルトの名無しさん
NGNGもしかしてint型の変数に全角のコードを入れてらっしゃるとか?
0440デフォルトの名無しさん
NGNGputchar(0x82a0);//←「あ」
とかやってるとか?
0441デフォルトの名無しさん
NGNG0442デフォルトの名無しさん
NGNG0443デフォルトの名無しさん
NGNG0444デフォルトの名無しさん
NGNGヲ■
0445デフォルトの名無しさん
NGNG0446デフォルトの名無しさん
NGNG0447デフォルトの名無しさん
NGNGを class Bar : public Foo { ... }; に書き換えても、
sizeof(Bar) が変化しないことって保障されていますっけ?
VC++の6では無変化かなと思うのですが。
0448( ´-`).。oO(なんでだろう……)
NGNG#include <cstdio>
int main()
{
std::puts("hogehoge"); // error C2039: 'puts' : '_STL' のメンバではありません。
}
0449デフォルトの名無しさん
NGNGピアノ音みたいなのが出るじゃないですか。
で、MIDIででる、ギターとか好きな音を大体のですがどうすればいいでしょうか?
また、ピアノ音は自然に消えますよね?で、鳴らしつづけるにはどうすればいいでしょうか?
0450デフォルトの名無しさん
NGNGBarに一つでも新しいデータメンバ or 仮想関数が付け加わったら、
サイズは大きくなるよ。sizeof()という事になるとパディングの問題も
あるけど、おおむね大きくなると見て良い。
0451デフォルトの名無しさん
NGNGcstdio.hで全体をstdのネームスペースで包んでいない。つまり、STLPortが
適用されていない可能性あり。
0452デフォルトの名無しさん
NGNGBarの変化でサイズが変わるのはOKです。Fooを継承したことで
サイズが変わり得るかどうかだけ知りたい感じでしょうか。
Fooは常にカラです。
0453デフォルトの名無しさん
NGNG答えになっているのか?
0454デフォルトの名無しさん
NGNG基底クラスに仮想関数があったら、変わるんじゃない?
0455デフォルトの名無しさん
NGNG便乗だけどメンバ変数の無いクラスのsizeofの値って決まってたっけ?
0456デフォルトの名無しさん
NGNG只今、モナー版にて、「☆☆モナー海を渡る☆☆」
というスレで、その手のプロ(海外版windows等に詳しい方、
AA、モナー職人様、英語のプロ(パソコン用語詳しい方)、
などを臨時必要としています。手の空いている方、
腕に覚えのある方,興味のある方はぜひご参加くださいませ。
0457447
NGNG似たような構造体が大量にありまして、それ一つ一つにメソッド
書いてられません。
コーディング規約の縛りで、Cプログラマが見る可能性のある部分に
templateを使ってはだめなので、そういう構造体を一様にFooから派生
させちまえ、という作戦です。void* よりいくらかマシかなと。
Fooで受けたあと、僕の好きになる部分では、templateで各構造体への
処理を共通化する予定と。
0458デフォルトの名無しさん
NGNG仮想関数は使う予定?
0459デフォルトの名無しさん
NGNGFooにもBar(群)にも仮想関数は使わない予定。というか
両方ともメソッドなしのホントのstruct。
0460デフォルトの名無しさん
NGNGメソッド無しのstructなら、なぜ継承しなければならないのかと小一時間。
0461デフォルトの名無しさん
NGNG乗ろうぜ!乗ろうぜ!?
0462デフォルトの名無しさん
NGNGstruct Bar1 : public Foo { ... };
struct Bar2 : public Foo { ... };
class Hoge {
public: void SetBar( const Foo& foo );
};
SetBarを複数書きたくないから。 >>460
0463デフォルトの名無しさん
NGNGあとはnewとmallocが混在しなければ大丈夫・・・かなあ
0464デフォルトの名無しさん
NGNG0465デフォルトの名無しさん
NGNG0466デフォルトの名無しさん
NGNG0467デフォルトの名無しさん
NGNG0468デフォルトの名無しさん
NGNGtemplate< typename type > void templateSetBar( type& s )
{
}
0469デフォルトの名無しさん
NGNGダウンキャストすりゃわからないはずもないけど?
というか、前に書いたように、別のメソッド
private: template <typename T> void ProcessBar( const T& bar ) { ... }
に渡して、bar.member_name に直接アクセスする予定。
Bar1とBar2で、少なくとも俺が触らなければいけない部分は、
メンバ名、型ともに同一なんでね。
で、Bar1とBar2は、sizeofの値が変わるとまずいらしいのね。
多分構造体の直書きとかしてるんでしょう。Cじゃシリアライズ
も糞もないだろうから。
# なんのために説明してるんだろう。。。
0470デフォルトの名無しさん
NGNGそうしようかな・・・・・・・
文句きそうだけど。。
0471デフォルトの名無しさん
NGNGそんなこと(゚ε゚)キニシナイ!!
0472デフォルトの名無しさん
NGNGごめん。469は俺の失言。
どうしよ・・
0473デフォルトの名無しさん
NGNGメンバ変数だけの構造体の扱いなんて すっかり忘れていた罠。
ど失礼しましたー。
0474デフォルトの名無しさん
NGNG窓の辺にドスンドスン体当たりしてくる音が聞こえて開けたら
物凄いデカイ蛾だった・・・
一瞬ツバメかと重多よ
0475ん?
NGNG0476デフォルトの名無しさん
NGNG0477デフォルトの名無しさん
NGNG0478デフォルトの名無しさん
NGNG●●●●●●●●「オセロさえ納期内に作れない=OO役立たず 」祭り●●●●●●●
/| | |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ
| | | ̄ ̄ ̄ /| ||
| | | / /|TTTTTT TTTTTTTTTT||TTTTT
| /\ | /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^
| / / |// / /|
| / / |_|/|/|/|/|
| / / |文|/ // /
|/ /. _.| ̄|/|/|/ Λ_Λ
/|\/ / / |/ / (___)
/| / / /ヽ /〔 非OO 〕〕つ
| | ̄| | |ヽ/l `/二二ヽ
| | |/| |__|/ Λ_Λ / /(_)
| |/| |/ ( ´∀`) (_) Λ_Λ
| | |/ // / ^ ̄]゚ (` )
| |/ ゚/ ̄ ̄_ヽ ⊂〔〔 非OO 〕
0479デフォルトの名無しさん
NGNG0480名無しさん@Emacs
NGNGコピーコンストラクタと operator= のオーバーロードって
どんなときに使い分けるんですか?
どっちも同じでいいじゃん、と思うのですけど。
0481デフォルトの名無しさん
NGNGコピーコンストラクタ:
代入以外でも使える(引数とか戻り値)
const なメンバが初期化できる
operator=:
右辺が同じクラスじゃなくても使える
とか
0482デフォルトの名無しさん
NGNG初期化と同時に複製するか、
初期化の跡に代入するか、の違い。
0483デフォルトの名無しさん
NGNGポインタが( )で囲まれている場合の
通常のポインタとの違いを教えてください。
例
(*Labels)[key]=Value や
(*P).first など。
また,* が後ろについている場合の
前につく場合との違いをおしえてください。
例 関数の戻り値が,クラス名*
0484デフォルトの名無しさん
NGNGそんな簡単なこともわからないのかよ。だっせー。
0485デフォルトの名無しさん
NGNG要するに答えられないわけですね(^^)
0486デフォルトの名無しさん
NGNGそう、答えられないの。要するにお前は俺と同レベル、もしくはそれ以下(藁
0487デフォルトの名無しさん
NGNG×要するにお前は俺と同レベル、もしくはそれ以下(藁
○要するに俺はお前と同レベル、もしくはそれ以下(藁
0488デフォルトの名無しさん
NGNGたしか a[] は *a よりも「くっつきやすい」ので、
カッコをつけないと
*(Labels[key])=Value
*(P.first)
のように解釈されてしまうんだと思う。
これは全然意味がちがっちゃうよね。
あと、char* など、 * が後ろについている場合は
それは「char*」という型名の一部、前についている場合は
演算子。
こんなとこでいいかな?
0489デフォルトの名無しさん
NGNG1・
括弧は演算の優先順位を変えるだけ
2.
変数に付いてるなら * は常に前にある、
型なら常に後ろにある
int * p;
変数の後ろに * が来たらそりゃ積演算子だ
0490483
NGNG初プログラムがC++の初心者なので,
Cとの差異がわからず申し訳ありませんでした。
にもかかわらずレスいただいて感激です。
まず,1つめについては +激しく理解+ です。
2つめについては…もちょっとよろしいですか?
つまり,* が後ろにあってもやはりポインタ型を表す
ということでよろしいでしょうか。
今読んでいる本から抜粋しますと
Vertex* Edge::souce()
となっており,Vertexは自作のクラスです。
0491483
NGNGあ,返事を書いているうちに新たな回答が
ありがとうございます。
つまり,変数とクラスを判別するために,
前と後ろに書き分けるということでしょか。
0492デフォルトの名無しさん
NGNGここはちょっと難しいねぇ。
* には3種類の意味があるんだ
型の後ろに付いてポインタ型を表すもの
変数の前に付いて間接参照するもの(typedef含む)
変数の後ろに付いて積演算するもの
変数とクラスを判別するために前と後ろに分けるんじゃなくて
それぞれ意味が違うから書き分けるの
0493492
NGNG(typedef含む)は脳内消去してくれ、ちょっと意味が違う
0494デフォルトの名無しさん
NGNG()は関数呼び出し演算子の可能性もあるYO!
0495483
NGNGここは,ポインタ型なんだ!と割り切った方がいいのでしょうか。
今,初心者本1冊目の最終章なのですが
例題のプログラムが急に難しい応用や
既出じゃないことが出てきたような気がして
辟易しています。
性格上,全部きっちり理解するまで次に進めないのですが
そもそも,このような勉強方法が間違っているのでしょうか(藁
もっとポインタやクラスについて詳しい本を,次々読んだ方がいいのかな。
0496デフォルトの名無しさん
NGNGん〜〜漏れがぴきぴきドカーンと来た説明に
変数や関数の宣言は型の右っかわに書いた式がそのまま左にある型と同じくなるように作られたってやつ。
int * p は int* 型の p というより、むしろ *p の型が int と理解すると早いです。
Vertex * Edge::source() は、Edge::source() の戻り値が Vertex* という意味なんだけれど、
むしろ *Edge::source() の型が Vertex と思ったほうがいいです。
そう理解しておくと複雑なポインタ宣言
int (*(*pfunc)(int, int))(void) = func;
みたいなのも理解しやすい
0497483=495
NGNG念力集チューしてみましたがだめぽ…。
ますますこんぐらがってきた!!
Vertex *p_souce がVertexクラスのオブジェクト(ポインタ)
P_souceを宣言しているということは
わかるのですが,
戻り値が Vertex* という意味がどうしてもわかりません。
>int (*(*pfunc)(int, int))(void) = func;
括弧がいっぱいですね。泣きたくなってきました。
0498デフォルトの名無しさん
NGNGVertex *v[];
が (array of) (pointer to) (Vertex)
って読めるのはわかるかな?
これがわかってるんなら、関数と変数を分けて考えずに、
Vertex *f();
ていうのは上の「〜の配列(array of 〜)」 が
「〜を返す関数(function retunring 〜)」に変わっただけだと考えるのはどうかな?
つまり、 * も [] も 引数を示す() も変数名(あるいは識別子)に付く「飾り」
っていうような・・。
0499483=495
NGNGバカでごめんね。・゚・(ノД`)・゚・。。つきあってくれてありがとね。
Vertex *f();
Vertexクラスにポインタを返す関数fということでしょうか…。
そこはかとなくわかってきたような気も…。
ただ,例題のプログラムの中で *の位置を
Vertex* Edge::source();
Labels *getlabels( );
というようにわざわざ書き分けてあるので
何か意味があるのかと思っていたのですが…。
※Labels というのは,map<string string>をtypedefしたものです。
0500デフォルトの名無しさん
NGNGクラスに返すってどこにポインタが入るのよ
>Vertex* Edge::source();
>Labels *getlabels( );
書き分けは意味なし気分次第でしょう
0501500
NGNGあ、これならスペースが無いとコンパイル通らないかも
0502483=495
NGNG重ね重ね申し訳ないです。
>書き分けは意味なし気分次第でしょう
ま,マジですか…これで一週間悩んでますた。
だって,ポインタの説明の章で
int *p ,int* p のどちらの書き方でもかまわないが
本書では,int *pで統一します ってわざわざ断り書きしてあったの。
で,Vertex* これは何だ?と。
小○俊夫タンめ〜ヽ(`Д´)ノ
でもおかげでいろいろ勉強になりました。
コレ以上厨質問すると怒られそうなので,また自習に戻ります。
またどうしようもなくなったら来ますのでよろしくお願いします。
0503デフォルトの名無しさん
NGNG0504デフォルトの名無しさん
NGNG0505デフォルトの名無しさん
NGNG馬鹿質?
0506デフォルトの名無しさん
NGNG実装とインタフェイスを分けて、実装が変わっても大丈夫なようにする
ハンドルを使うのが一般的なんでしょうか?
0507デフォルトの名無しさん
NGNGスタート→プログラム→アクセサリ→エンターテイメント→サウンドレコーダ
0508503
NGNG洒落のわからんやつばかりだ。
もてねーだろ、おめーら。
0509デフォルトの名無しさん
NGNG0510デフォルトの名無しさん
NGNG>実装とインタフェイスを分けて、実装が変わっても大丈夫なようにする
と
>ハンドルを使うのが一般的なんでしょうか?
の繋がりがよーわからん。
0511デフォルトの名無しさん
NGNG0512デフォルトの名無しさん
NGNG「pimplイディオム」で検索すれ。
0513鬱
NGNGDirectXはquaternionだしよ、わからねえっつうの
寝転がったままオナーニしたら精子飛び散るしよお
P4ねえからSSE2命令使えねえしデザパタも全然まだだし
かなりやることがあるのに全然消化できてない
鬱だよぉ(=;ω;)
0515 ( ´-`).。oO(なんでだろう……)
NGNG#define _STLP_NO_USING_FOR_GLOBAL_FUNCTIONS
をコメントアウトしたら、>>448のコードがコンパイルできるようになった。ほっほっほ。
0516デフォルトの名無しさん
NGNGtemplate<int N>
struct A
{
template<int M>
A();
template<> A<1>(int x){}
template<> A<2>(int x, int y){}
A<N>;
};
A<2> a(1,2);
見たいなことなんですが。
0517デフォルトの名無しさん
NGNGコンストラクタの多重定義、もしくはデフォルト引数では不足なのか?
0518デフォルトの名無しさん
NGNGベクトルを扱うクラスを自作してるんですが、
内部に持ってる変数をv[N]と定義してるため、
v[1]に対しA(int x, int y)が呼ばれてしまうのは都合が悪いです。
0519デフォルトの名無しさん
NGNGなにか方法をご存知ですか?
0520黒飴なめなめ♪
NGNG0521デフォルトの名無しさん
NGNG0522デフォルトの名無しさん
NGNG0524デフォルトの名無しさん
NGNGここで質問させてもらいます。
人から貰った関数の引数に double *&a というのがあるのですが、これって
どういう意味なんでしょうか?
0525デフォルトの名無しさん
NGNG0526デフォルトの名無しさん
NGNGthx!
0527デフォルトの名無しさん
NGNG還元してください。
0528516
NGNG還元できるほどの大した事はやってないです。
派生先にB(int x) : base(x)、B(int x, int y) : base(x,y)…を用意して
基本クラスにN個とるコンストラクタが無ければエラーが出るようにしただけです。
0529デフォルトの名無しさん
NGNG結果の重要性はともかく、
質問した時と同じくらいの情報が、そんなふうに結論として出ると、
なんとなく収まりがいいもんですな。
0530デフォルトの名無しさん
NGNGきちんと報告するのが良い質問者の姿勢です
0531デフォルトの名無しさん
NGNGことがあるのでお訊きします。
class foo {
...
void A();
void B(int signum);
...
};
void
foo::B(int signum)
{
(シグナル処理)
}
void
foo::A()
{
...
signal(SIGTERM, B);
...
}
というような構成ですと、コンパイル時に
no matches converting function `B' to type `void (*)(int)'
という文句を言われてしまいます。B を class foo の外の
関数にすると何も言われずにコンパイルが通ります。
foo 内だと何故駄目なのかよく判らないのですが...
0532デフォルトの名無しさん
NGNGcin >> n;
cout << n << endl;
aを入力したら,変な数値が出てきたんだけど・・・
なぜに?
0533デフォルトの名無しさん
NGNG単にnの初期化されて無い値がそのままでたんでは?
int n=893;とするとどうよ。
0534532
NGNG0535デフォルトの名無しさん
NGNGあんまり必要なさそうなんで,やりたくないんですが
0536デフォルトの名無しさん
NGNG大抵のマニピュレータは単なるシンタクスシュガーだ。
必要無さそうだと思うならやらなくて良し。
俺は使うけどな。
0537デフォルトの名無しさん
NGNGえーと、ハンドルクラスを使うと依存関係が少なくなると
いうのを本を読んだのですが、クラスの数が増えるのと
ややこしくなるため、ほんとにこんなことするのかなって
おもたのです。
>512
どうもありがとうです。
0538デフォルトの名無しさん
NGNG一旦staticメンバ関数あるいは単なる関数で受けないとダメ
0539デフォルトの名無しさん
NGNGhttp://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-32.2
0540デフォルトの名無しさん
NGNG(ここには例外処理が書いてある)。
ファイル classA.h
#include "exception.h"
ファイル main.cpp
#include <iostream.h>
#include "classA.h"
#include "exception.h"
みたいな事をしていいのでしょうか?
この場合、exception.hファイルがmain.cppに2回インクルードされていることに
なり、おかしなことになりますか?
何かいい方法があれば教えてください。
また、include等を詳しく説明したサイトがあれば、教えてくれると助かります。
0541デフォルトの名無しさん
NGNGちなみに、
#include <iostream.h>
#include <iostream.h>
とかやってみな。おかしくなんないだろ ?
<iostream.h> の最初の方に、
#ifndef _INC_IOSTREAM
#define _INC_IOSTREAM
と書いてあるので、上みたいに2回呼ばれた時にこれがどういう動作するのかよく考えましょう。
0542デフォルトの名無しさん
NGNG0544540
NGNGありがとうございます。
検索して調べて、理解できました。
0545デフォルトの名無しさん
NGNG> インクルードガードとは?
>>542 は、親切にもインクルードガードで「ぐぐる。」って書いてあるんだから、まずはその通りにしたら ?
0547デフォルトの名無しさん
NGNGちょっと遅かったね
0548540
NGNGすいませんした。
ついでに、またまたくだらない質問でもうしわけないですが・・・
class Samp
{
private:
int m;
double *p;
public:
Samp(){ m = 0; p = new double; }
Samp(int i) { m = i ; p = new double [i] }
~Samp() { delete [] p }
};
とやった場合、引数なしコンストラクタでのpを開放しようとしたら、
delete p;
となるが、上記のデストラクタでは、なっていない。
これは合法ですか?
0549
NGNGデストラクタでmで判定してdelete演算子を使い分ける。
もしくはSTLを使う。
0550540
NGNGおお!使い分けですか!
単純なことなのに全然気づきませんでした。
ありがとうございます。
STLでうまいことできるんですか。調べてみます。
0551デフォルトの名無しさん
NGNGdouble なら多分大丈夫だけど、クラスだったりしたらまずいと思う。
まあ、
Samp::~Samp()
{
if(0 < m){
delete [] p;
} else {
delete p;
}
}
とするか、引数無しの時も m = 1 にして配列を確保してしまうのがいいかと思う。
0552デフォルトの名無しさん
NGNGそうしたいならせめてconst bool m;とかにしといてよ。
別にnew[]で統一すればいいのでは?
0553552
NGNG0554
NGNGSamp(){ m = 0; p = null; }
mが1で初期化されるときとmが0で初期化されるときで
オブジェクトの個数が同じく一つであることに問題が生じる
可能性があるかも。
0555554
NGNGSamp(){ m = 1; p = new double[1]; }
0556540
NGNG>552
ご意見ありがとうございます。
クラスならまずいということですが、次の場合はどうなんでしょう。
class Array{
private:
int m;
double *p;
public:
Array(){ m = 0; p = NULL }
Array( int i ) { m = i; p = new double [i] }
~Array(){
if( p != NULL) { delete [] p }
}
}
class ArrayDX{
private:
int m;
Array *p;
public:
ArrayDX( int i ){ m = i; p = new Array [i] }
~ArrayDX(){delete [] p}
}
何かいろいろし、ArrayDXのインスタンスを作成し、
メンバのArrayの配列もきちっと作成する。
の場合。ArrayDXでインスタンスを作成し、破棄したら、メンバのArray *pの
デストラクタはきちっと行われるのでしょうか。
0557デフォルトの名無しさん
NGNG> ArrayDXでインスタンスを作成し、破棄したら、メンバのArray *pの
> デストラクタはきちっと行われるのでしょうか。
delete [] p; なら行われる。
つーか、new [] で確保したら delete [] するのが基本。
double で多分大丈夫と言ってるのは、大方の実装が大丈夫そうだからと言うだけのこと。
規格上はまずいよ。
0558540
NGNGありがとうございます。
それは、オブジェクトポインタがスコープからはずれたら、
デストラクタが呼ばれて、そのなかにあるオブジェクトポインタ
のデストラクタもよばれて・・・・でいいのでしょうか?
0559デフォルトの名無しさん
NGNG> >>556
> ありがとうございます。
自分に礼かよ !! と言う突っ込みは置いといて...
> それは、オブジェクトポインタがスコープからはずれたら、
> デストラクタが呼ばれて、そのなかにあるオブジェクトポインタ
> のデストラクタもよばれて・・・・でいいのでしょうか?
オブジェクトとポインタ って ? よくわかんないけど、
void foo()
{
ArrayDX X(100);
...
}
で、foo() の終了時のこと言ってるなら、その通り。
0560デフォルトの名無しさん
NGNGスコープから出れば「オブジェクト(を指している)ポインタ」のデストラクタは呼ばれるが、
「オブジェクトポインタの指すオブジェクト」のデストラクタは呼ばれない。
0562540
NGNGあ・・・。ほんとだ、自分に・・・
>>559
>>560
ってことは
void foo()
{
ArrayDX *X = new ArrayDX(100);
...
delete [] X;
}
の場合は正確でしょうか?
すんません。おなじようなことばっかで
0563デフォルトの名無しさん
NGNGX は配列を指していない。
この場合は
delete X;
が正しい。
0564デフォルトの名無しさん
NGNG必要なところだけ自分でメモリ管理すればいいじゃん。
Cでいちいち標準関数再実装してるようなバカがいないのを見習おう。
0565デフォルトの名無しさん
NGNGNULLじゃないけどアクセスできないポインタ・・・鬱だ
0566デフォルトの名無しさん
NGNGしかも、使えないのに delete[] p; としないとメモリリークになる。
なお鬱だ・・・・
0567デフォルトの名無しさん
NGNG言わないんですた。
解放し忘れとでも言うのかな。
0568デフォルトの名無しさん
NGNG0569デフォルトの名無しさん
NGNG講義の場所と日時と費用を教えてください。
0570デフォルトの名無しさん
NGNGそうなの???
0571デフォルトの名無しさん
NGNG小一時間も解説するほどではないが。Effective C++にしつこいほど
繰り返し書いてある。
簡単に説明するとすれば、ある領域を指しているポインタがあり、いつ
でも解放できる状態であればメモリリークとは言わないらしい。
有効なポインタが他の値を代入することによって、その元のポインタ
が指していた領域を解放する手段が永久的に失われてしまった時、
初めてメモリリークと言うそうだ。
0572デフォルトの名無しさん
NGNG0573デフォルトの名無しさん
NGNGで、解放し忘れとの違いは・・・
0574デフォルトの名無しさん
NGNG解放し忘れであれば、deleteを書いてやればよい。しかし、メモリリークが
起きたポインタをdeleteすると、何が起きるかわからない。
0575デフォルトの名無しさん
NGNGoperator[] をオーバーロード。配列はクラスにする。
0576デフォルトの名無しさん
NGNG自己レスです。「メモリリークが起きたポインタをdeleteしても、解放できない。」
でした。
0577デフォルトの名無しさん
NGNG0578デフォルトの名無しさん
NGNG俺はなんとなく分かったけど…。
0579デフォルトの名無しさん
NGNGdeleteできないならもう開放済みなんじゃ?
0580デフォルトの名無しさん
NGNG例えばの例。
char* p = new char[100];
p = 0;
pが指していたchar[100]の領域は、p = 0; とすることによって恒久的に
解放できなくなった。
0581デフォルトの名無しさん
NGNGそれ自体をメモリリークといいます
0582デフォルトの名無しさん
NGNG0583デフォルトの名無しさん
NGNGだからそう言っているのでは?
0584デフォルトの名無しさん
NGNG// ここは(ある意味)開放し忘れ
…
…
p = 0; // この瞬間からメモリリーク
ということなのだと思われ。
0585デフォルトの名無しさん
NGNGchar* p;
{
p = new char[100];
}
// 開放し忘れ
---------------------------
{
char* p = new char[100];
}
// メモリリーク
0586デフォルトの名無しさん
NGNG0587デフォルトの名無しさん
NGNG開放→解放
0588デフォルトの名無しさん
NGNGインスタンスはクラスから生成されるもの
オブジェクトはクラスやインスタンスの総称
0589デフォルトの名無しさん
NGNGほんと?
0590デフォルトの名無しさん
NGNG0591デフォルトの名無しさん
NGNGクラスは「クラスというオブジェクト」という意味でしょうか?
お馬鹿な俺に教えてちょ。
0592デフォルトの名無しさん
NGNGお!そこまで想像できるなら問題ないのでは。
JavaとかC#とかを触るとクラスもオブジェクトだなーというのが
実感できまっせ。
0593デフォルトの名無しさん
NGNGこれであってる?
0594デフォルトの名無しさん
NGNG誤解を恐れずに言うと、クラスはインスタンスの工場で、
生成されたインスタンスがどんなものかを全部しってる。
メモリに確保されるかどうかは言語や処理系次第ッス
0595デフォルトの名無しさん
NGNGあ,合ってるんですか。嬉しいです。
C++だけの時はオブジェクト=インスタンスだったんですけど
Reflection触ってから>>591と思うようになったのです。
0596デフォルトの名無しさん
NGNGメモリ上に確保されないインスタンスとは具体的に
どんなやつ?
0597デフォルトの名無しさん
NGNG生地からドーナツを切り抜くところを連想してください。
この場合、生地がメモリ。
ドーナツを切り抜く型がクラス。
切り抜かれた部分そのものがインスタンス。
切り抜かれた部分にドーナツと名前を付けました、名前であるドーナツが
オブジェクト。
0598デフォルトの名無しさん
NGNGこれって何?
0599デフォルトの名無しさん
NGNG(;´Д`)いやその・・・この手の話って
クラスにしろインスタンスにしろ、操作にたいする振る舞い、あるいは
それらどうしの関係についての話でしかないですヨ。
どのように実装するかについては各言語あるいはフレームワークで決めていただくと。
lisp系ならクラス定義もcell内の情報だろうし(違うかも)、
C++だとクラスそのものは実体が確保されないこともあるわけで。
0600デフォルトの名無しさん
NGNG0601ミッターマイヤー
NGNGデザパタ本はJavaばっかりなので、わかりません。
既出だったらごめん。
0602デフォルトの名無しさん
NGNG最後の一行だけ嘘っぽい・・・
0603デフォルトの名無しさん
NGNG0604デフォルトの名無しさん
NGNGint data(int a, int b,int c=100);
data(100,200);
どうなりますか?
0605デフォルトの名無しさん
NGNG[]演算子はオーバーロードできますが
double ClassA::operator[][](int i, int j)
ってできますか?
もしくはそれに類するクラスを2次元配列のように
あつかう方法とかありますか?
0606デフォルトの名無しさん
NGNGどっちを呼び出せばいいかわからないから、コンパイルエラーになる。
0607デフォルトの名無しさん
NGNG(例えば文字列中にある文字が存在するか調べる関数)
失敗したかどうか条件判断を行いたい場合、比較とビット反転とどちらがスマートなんでしょうか?
int result = hoge(arg);
if (!result) cout << "ERROR" << endl; //ビット反転と
if (result == 0) cout << "ERROR" << endl; //比較
0608デフォルトの名無しさん
NGNG==0 のほうがスマート
失敗すると偽、成功すると真が返ってくる関数なら ! のほうがスマート
0609デフォルトの名無しさん
NGNGビット反転演算子は、'!' じゃないよ、'~' だ。'!' は、論理否定演算子。
[A] > if (!result) cout << "ERROR" << endl; //ビット反転と
[B] > if (result == 0) cout << "ERROR" << endl; //比較
俺なら、成功した時の戻り値が数値的な意味をもっている (例えば文字列中にある文字が存在するか調べる関数で、成功した時は何文字目かを返すとか) なら、[B]
そうでない (単純に成功/失敗しか返さない) なら [A] でコーディングする。
まあ、好みの範疇だと思うよ。
0610デフォルトの名無しさん
NGNG二次元までで良いなら、今既にある配列クラスを
その配列クラスを返す[]演算子を持ったクラスで包む
class node //既にある配列クラス
{
詳細略
double operator[](int index);
};
class MyArray //既にある配列クラスを包括する二次元配列クラス
{
詳細略
node& operator[](int index);
node m_node;
};
>605でやりたかったであろうアクセスを行うと、以下のように解釈される
MyArray[1][5] → (node)[5]
0611605
NGNGなるほど。ありがとうございます。
自己解決ですが、こんなんありました。
()演算子をオーバーロードする。
operator()(int i, int j)
こんな感じ
0612デフォルトの名無しさん
NGNGデフォルトの振る舞いとかは全部あるんですけど、
絶対に包括じゃなくて継承して使って欲しいんです
もちろん基底クラスのメソッドを直コールするのもNGな雰囲気で・・・
無理なら無理でOKです
0613デフォルトの名無しさん
NGNGコンストラクタをprotectedにする
0614デフォルトの名無しさん
NGNG純粋仮想関数を基底クラスで作る。
0615デフォルトの名無しさん
NGNG0616デフォルトの名無しさん
NGNGclass ダミー派生クラス : public 直接使われたくない既定クラス {};
ダミー派生クラス obj;
obj.結局直接呼ばれる既定クラスのメソッド();
とかされてもOKですか?
0617デフォルトの名無しさん
NGNGそれだと
class Test :public base
としたとき
Test->base::hoge()
とかで基底クラスのメソッドを呼べちゃいませんか?
どうしてもTest->hoge()とさせたいんです
かといって、virtual base::hoge() = 0; では困るんです
0618デフォルトの名無しさん
NGNGそうですそうです
結局基底クラスが呼ばれていようと、派生クラスのメソッドにアクセスしてるように見えたいのです
0619デフォルトの名無しさん
NGNG注文の理由が訳ワカメ。
0620デフォルトの名無しさん
NGNG0621デフォルトの名無しさん
NGNGTest->hoge();は桶で
Test->base::hoge();は駄目か・・・
全部のメソッドをprotectedで継承して
派生クラスでpublicなラッパを提供するしか漏れには考え付きませんが。
0622612
NGNG{
public:
int hoge() {return 1};
};
class Test :public Base
{
};
int main (){
Base A; //これはコンパイルエラーにしたい
Test B;
cout << B.Base::hoge(); //これもコンパイルエラーにしたい
cout << B.hoge(); //これはSTDOUTに1を流したい
}
ということです
0623612
NGNGまだ設計段階なので無理なら無理でOKなんです
0624デフォルトの名無しさん
NGNG*演算子関数を定義したとき、その演算子関数の戻り値のメンバに
-> を使ってアクセスすることは、可能ですか?
class X
{
public:
int m_x;
};
class Y
{
public:
X m_y;
X& operator*() { return m_y; };
};
Y y;
(X&) *y; //普通にアクセス ○
(*y).m_x; // X のメンバ にアクセス。○
y->m_x; //こういう書き方は可能 ?
0625デフォルトの名無しさん
NGNGそういう設計にせにゃならない理由を是非お伺いしたいであります。
0626デフォルトの名無しさん
NGNG無理じゃないかな・・・operator ->()が別にあるし
0627デフォルトの名無しさん
NGNG> やっぱりかなり強引なことをしないと無理っぽいですか・・・
> まだ設計段階なので無理なら無理でOKなんです
何でそんなことが必要なん ?
0628612
NGNG自由度を狭める事で、逆にインターフェースを簡潔にできないかという目論みです
カスタマイズされることが大前提のクラスなので、なんでもできてしまうのはちょっと困るのです
0629デフォルトの名無しさん
NGNGなるほどー
ありがとうございました。
0630デフォルトの名無しさん
NGNG> カスタマイズされることが大前提のクラスなので、なんでもできてしまうのはちょっと困るのです
そのわりには、「結局基底クラスが呼ばれていようとも...」なの ?
一体誰から何を守りたいのかよく考えた方がいいと思うよ。
0631デフォルトの名無しさん
NGNGpublic:
int hoge(){ return 1;}
virtual void LONGLONG_MEANLESS_FUNCTION() = 0;
}
class Test : protected TestImpl{
public:
virtual void LONGLONG_MEANLESS_FUNCTION() {};
};
で、Testを継承させるのはどうだ。
0632デフォルトの名無しさん
NGNG0633デフォルトの名無しさん
NGNG多分
class Test : public Base
が、後々の変更で
class Test : public CustomizedBase
になる可能性もあるから、
直接
pTest->Base::hoge();
とかやられると、
基底クラスを変更したときに困る、とかじゃないかな
0634デフォルトの名無しさん
NGNGTHIS_CLASS_CANT_BE_INHERITED_DIRECTLY()
とかの方がいいかな。
0635デフォルトの名無しさん
NGNGガクガクブルブル
0636612
NGNG誰からかは不明瞭ですが、守りたいのは「簡潔さ」です
「利用者の大半がカスタマイズするだろうし、もしかしたら自分もそのうちカスタマイズするかもしれんから
とりあえず継承しておけ」というクラスなんですが
かといって、「とりあえず継承はしたけど、どうせここは基底クラスを使ってるんだからTest->Base::hoge();でいいや」
とやられないようにしたい
後で結局カスタマイズした場合に、その部分を直し忘れてエラーになったりしないように
もちろん>>633みたいな怖ろしい事は考えていません
0637デフォルトの名無しさん
NGNGそっちの話 (かならず継承してから使って欲しいクラス) は、>>613 で OK だと思う。
問題は、「基底クラスのメソッドを直コールするのもNG」の方だろ。
>>632
話の内容についてこれないなら書き込むな、ヴォケ。
>>633
クラスの仕様書に、「直コールは止めてくれっ。」と書いておけば、規定クラス名が変更された時に困るのは変なことしてる奴なんだから別にいいと思う。
どっちにしても、基底クラス名を変更したら継承している所は修正しないといけないしね。
そもそも、基底クラス名なんてそんな簡単に変更しないと思う。
0638633
NGNGModernなtemplateプログラムしてると当たり前のように基底クラスは変わるよ。
あんまり怖がりなさるな、おのおの方。
0639デフォルトの名無しさん
NGNG「基底クラスのメソッド直コール」ってのは
> cout << B.Base::hoge(); //これもコンパイルエラーにしたい
ってことだろ。
なら、
class Test : protected TestImpl{
0640デフォルトの名無しさん
NGNGclass BaseImpl{...};
class Base : proteced BaseImpl{...};
class Test : public Base {...} ;
ってことで。
0641デフォルトの名無しさん
NGNG> Modernなtemplateプログラムしてると当たり前のように基底クラスは変わるよ。
だから ? template 使ってるって自慢 (にもなってないけど) したいだけなのか ?
0642612
NGNG何か修飾子付けるだけとか簡単な解決方法はあるのかなーと思っただけですので・・・
0643デフォルトの名無しさん
NGNG635と636が怯えてるから、よくあることだと書いたまでですが
0644デフォルトの名無しさん
NGNG0645デフォルトの名無しさん
NGNG0646デフォルトの名無しさん
NGNG知っている方教えて下さい。お願いします。
0647デフォルトの名無しさん
NGNGdouble*** p;
p = new double**[10];
for (int i = 0; i < 10; i++) {
p[i] = new double*[20];
for (int j = 0; j < 20; j++)
p[i][j] = new double[30];
}
double[10][20][30] が使える。
0648デフォルトの名無しさん
NGNGもう少し簡単な方法。
double (*d)[20][30];
d = new double[10][20][30];
0649646
NGNG有難うございます。
2次元配列と同じ感じなんですね。
やはりポインタの理解が足りないな…
0650デフォルトの名無しさん
NGNG0651デフォルトの名無しさん
NGNG0652デフォルトの名無しさん
NGNGtemplate< int N > class Nd_vector;を自作する話か?
0653デフォルトの名無しさん
NGNGchar hoge[10] = { ... };
string s( 10, '\0' );
memcpy( &s[0], hoge, 10 );
というのは有効な操作ですか? 有効である場合、これは
s.assign( hoge, 10 );
と同じ効果が得られるでしょうか。
0654デフォルトの名無しさん
NGNGなんか2ちゃんでもcppllでもそんな話題ばかり見かけるなぁ。
なんでmemcpyなんてしたいんです?
> char hoge[10] = { ... };
なぜに { } なんだと小一時間…
0655デフォルトの名無しさん
NGNGmemcpyした場合の結果は保証されません。
push_backもしくはback_inserterを使うようにしましょう。
0656デフォルトの名無しさん
NGNGして多次元配列のクラス作ろうとしたけど、よくわからん。
std::vector<std::vector<std::vector<double> > > v;
v.resize(10);
for (int i = 0; i < 10; i++) {
v[i].resize(20);
for (int j = 0; j < 20; j++)
v[i][j].resize(30);
}
for (int i = 0; i < 10; i++)
for (int j = 0; j < 20; j++)
for (int k = 0; k < 30; k++)
v[i][j][k] = i * 600 + j * 30 + k;
for (int i = 0; i < 10; i++)
for (int j = 0; j < 20; j++)
for (int k = 0; k < 30; k++)
std::cout << v[i][j][k] << ' ';
0657デフォルトの名無しさん
NGNGv.resize(10);
for (int i = 0; i < 10; i++) {
v[i].resize(20);
for (int j = 0; j < 20; j++)
v[i][j].resize(30);
}
for (int i = 0; i < v.size(); i++)
for (int j = 0; j < v[i].size(); j++)
for (int k = 0; k < v[i][j].size(); k++)
v[i][j][k] = i * 600 + j * 30 + k;
for (int i = 0; i < v.size(); i++)
for (int j = 0; j < v[i].size(); j++)
for (int k = 0; k < v[i][j].size(); k++)
std::cout << v[i][j][k] << ' ';
0658デフォルトの名無しさん
NGNGmemcpyじゃなくてstd::copy
0659デフォルトの名無しさん
NGNGresize一気にかますときとか
0660デフォルトの名無しさん
NGNGvector<vector<vector<double> > > v(10 ,vector<vector<double> >(20, vector<double>(30)));
0661デフォルトの名無しさん
NGNGこんなのはダメなのか?
void square(int& elem)
{
elem *= elem;
}
std::for_each(coll.begin(), coll.end(), square);
標準C++ライブラリp317〜318より
0662デフォルトの名無しさん
NGNGへえ〜、コンストラクタの結果をクラスの型として返せるのか。初めて知った。
0663デフォルトの名無しさん
NGNG0664デフォルトの名無しさん
NGNGどういう意味ですか?
0665デフォルトの名無しさん
NGNGんー勘違いしていました。コンストラクタの結果をコンストラクタに
引き渡しているんですね。
0666653
NGNGつまり、memcpy と同じインタフェースを持つ関数があって、
それを使って string の内容を更新したいということなんです。
いったん、配列なり vector なりで受けてから、それを
string にコピーすればいいんでしょうが、2回コピーすることに
なるのがちょっといやかな、と思ったので。
>>655
s.resize(10) しておいてから memcpy でもだめなんでしょうか。
vector みたいに、&s[0] が配列を指す、という保証はないのかな。
0667デフォルトの名無しさん
NGNGん?
単に要素の初期化をしてるだけだけど。
0668653
NGNGああ、そうか、std::copy なら begin() とか back_inserter() が
返すイテレータを使えるんですね。
やっぱり古くさいインタフェースを持つ関数は捨てて、ちゃんとした
ライブラリを作り直そうかな。
0669デフォルトの名無しさん
NGNGclass X {
publuic:
template<class T> X(T t){ ... }
};
0670デフォルトの名無しさん
NGNG0671デフォルトの名無しさん
NGNGさんくす
0673デフォルトの名無しさん
NGNGvoid hoge(const std::string& str);
...
hoge("this generates temporary obj.");
とかいう話ではなくて?
0674デフォルトの名無しさん
NGNGそうか。
参照は,値を書き換えてもいいんでしたね。
constは,必要か
ポインタで渡すのは,文字列か構造体ですしね
0675デフォルトの名無しさん
NGNGリファレンス渡しは値渡しよりも効率が良いが、呼び出し先で引数に
代入してしまうと呼び出し元の変数まで変更されてしまうので、
constをつけて、値が変わる危険性を避けつつ効率を維持できる。
0676デフォルトの名無しさん
NGNG0677デフォルトの名無しさん
NGNG呼び出し元で引数に&を付ける必要があるけどな。
0678デフォルトの名無しさん
NGNGってそれがメリットか?
0679デフォルトの名無しさん
NGNGそれを言ったら、newしたオブジェクトを参照渡しするときは
*をつけなきゃいけないじゃん。
0680デフォルトの名無しさん
NGNG構文上必要な場合(コピーコンストラクタや演算子定義)はconst
参照にして、ポリモーフィズムを使う場合やオブジェクトの同一性
が問題になる時はポインタ渡しにしている。
このくらいが妥当じゃないかなあ。
0681デフォルトの名無しさん
NGNGあと>>678も言ってるけどnullが来ることを許可したい時。
0682デフォルトの名無しさん
NGNGまたヌルヌル論争になるから null pointer って書いてくれ
0683デフォルトの名無しさん
NGNG演算子のオーバーロードするときに、いちいち
&つけるのかっこ悪いじゃん。
0684デフォルトの名無しさん
NGNG構造体の場合はほとんど全部"値渡しの最適化"とみなせるのでたいていは参照、
std::stringとかみたいな値重視のクラスも参照、
ポリモーフィックなクラスの場合ポインタ使ってるっぽい。
0685デフォルトの名無しさん
NGNGtemplate<typename value_type>
value_type TypeAdjast(const (void*)& value) {
return boost::lexical_cast<value_type>(value);
}
int a = 100;
string s;
s = TypeAdjast(a);
みたいにして、関数の返値が格納される先(左辺値)の型に応じて
返す型を変える関数って作れるものなんでしょうか?
0686デフォルトの名無しさん
NGNGint foo();と
string foo();は同時に存在できなかったはずだけど、、
s = TypeAdjast<string>(a) のように呼べば作れるけど、
そういうことじゃないよね?
0688デフォルトの名無しさん
NGNGやっぱりそうなりますか・・・
テキストで保存してあるデータを
型に合わせてロードする関数を考えているんですが
std::string LoadDataAsStr();
int LoadDataAsInt();
unsigned int LoadDataAsUInt();
:
:
みたく型毎に関数用意したり、とか
やたら型キャスト使ったり、とかが鬱陶しいので
できるだけスマートに書けるようにしたいのであります
やっぱり左辺値の型情報を渡して
それに合わせてロードするようにするのが一般的ですか
TypeAdjast(s, a) とすればいいんじゃ?
adjastってのもかなりかっこ悪いが。
IOStream風でいいじゃん。
class mystream;
template <typename Target>
mystreamr& operator >>(mystream& s, Target& target)
{
// ...
return s;
}
void f(mystream& s)
{
int i;
std::string str;
s >> i >> str;
}
0691デフォルトの名無しさん
NGNG2| test string
3| 5.003
というデータに対して
string s1 = GetData(1行目);
string s2 = GetData(2行目);
int a = GetData(1行目);
float f = GetData(3行目);
としたときに
s1 = "10"
s2 = "test string"
a = 10
f = 5.003f
とできるようなGetData()の実装は「無理」って事ですか?
もちろん
int b = GetData(2行目);
は「危険なキャスト」として例外投げてかまわないんですが・・・
0692デフォルトの名無しさん
NGNG危険なキャストっていうか、「不可能なキャスト」と決めつけてしまってもOKなわけですが
0693デフォルトの名無しさん
NGNGそのVariantな型から各型へのキャストを
書けば、実現できるかも。
つまり、
class Variant { string data;
public: operator int(){ ...}
operator double(){ ...}
};
で、Variant GetData(int line);とか。
0694デフォルトの名無しさん
NGNGずっと「なる」だと思っていたし、周りに聞いてもみんなそう言う。
「ぬる」はここへ来て初めて知った・・・ドイツ系の人が広めたのでしょうか?
0695デフォルトの名無しさん
NGNG0696デフォルトの名無しさん
NGNGごめんなさいわかりません・・・
最終的な利用方法は
string s = (int)GetData(1行目)
ということですか?
この関数の目的の大部分は、キャストしないで利用できるようにすることなので
もし上記のようなら無理に1つの関数にまとめる必要は無いのです・・・
0697デフォルトの名無しさん
NGNGNULLの所へback_inserterと読みます。
「ぬるぬるの所へバックから差し込む」
0698デフォルトの名無しさん
NGNG0699デフォルトの名無しさん
NGNG0700デフォルトの名無しさん
NGNG「ぬむべる」の間違いでは?
0701デフォルトの名無しさん
NGNGせめてこれくらいのテストはしてから、そういうことを言ってほしい。
#include <stdio.h>
struct Variant{
operator int() { return 1;}
operator double() { return 2.0;}
};
int main(){
Variant v;
int i = v;
double d = v;
printf("%d, %f", i, d );
}
0702デフォルトの名無しさん
NGNGクソどうでもいいレスに流されるとホント腹が立つ
はっ・・・漏れの質問も同じくらいどうでもいいのか・・・
0703デフォルトの名無しさん
NGNGすげー
0704デフォルトの名無しさん
NGNG申し訳ない。ところで君の質問はどれよ。
0705デフォルトの名無しさん
NGNGおお・・・すみません・・・
ということは、それくらい明らかな実装だと
既に標準ライブラリや準標準ライブラリに
同じ様な汎用型に関する取り扱いがあったりはしないのですか?
「自分のコードが一番信用できない」ってのがポリシーなので
既にあるならそっちを使いたいです
0706デフォルトの名無しさん
NGNG>>685からの一連のヤツです・・・
0707デフォルトの名無しさん
NGNGすでに>>690までで解決しているのかとおもてた。
0708デフォルトの名無しさん
NGNGちゃんと流されずに詳しい人にレスもらえてるじゃん。
おれはパスだが、、
つーことは、
class GetData {
const char *s;
public:
GetData(const char *s_) : s(s_) {}
operator int() const {return boost::lexical_cast<int>(s);}
operator float() const {return boost::lexical_cast<float>(s);}
operator double() const {return boost::lexical_cast<double>(s);}
operator const char*() const {return s;}
//operator std::string() const {return boost::lexical_cast<std::string>(s);}
// 以下省略
};
とかやっておけば、
int i (GetData("123"));
double j (GetData("234"));
std::string k (GetData("345"));
てな感じで呼べるわけやね。
0710デフォルトの名無しさん
NGNGじっくり理解して実装してみます
ありがとう
0711デフォルトの名無しさん
NGNGtemplate<class T>
operator T() const { return boost::lexical_cast< T > ( s ); }
通らないタコなコンパイラがあるんだからしょうがないだろ。
0713デフォルトの名無しさん
NGNGboostは通るのに、711のテンプレートは通らないと?
なんといってもVC++だからな。VC6だと全く動かないコードになら
コンパイルできるが、VC7はコンパイルさえ通らん。
0715名無しさん@Emacs
NGNG>「自分のコードが一番信用できない」ってのがポリシーなので
>既にあるならそっちを使いたいです
ワラタ
0716はt
NGNG双方のライブラリをリンクしなきゃいけないと思うんですが
どうやってライブラリを作るんでしょうか?
0717デフォルトの名無しさん
NGNGimplib hoge.dll
0718デフォルトの名無しさん
NGNGCppUnit をお使いなさい。
0719デフォルトの名無しさん
NGNGC++では名前のマングリングが起こるので、序数で呼び出す方がいいかも
しれない。
どうしても名前で呼び出すには、一度アセンブル出力して、そのラベル名
を書く。
最初はリンクでエラーになるが、.libは出来ているという罠。
0721デフォルトの名無しさん
NGNG0722デフォルトの名無しさん
NGNGpublic:
variant(const std::string& in_value) :value(in_value) {}
~variant() {}
operator const char*() const { return value.c_str(); }
template <typename value_type>
operator value_type() const {
return boost::lexical_cast<value_type>(value);
}
private:
const std::string value;
};
variant GetData(データ格納先) {
return variant(データ);
}
という実装を試してみたんですが
int a = GetData(データ格納先); // safe
string s = GetData(データ格納先); // abnormal termination
const char* lpstr = GetData(データ格納先); // lexical_cast内部でコンパイルエラー
となってしまいした・・・
引数の場合はテンプレートに対して型を明示してやればオーバーロードできたのですが
キャストオペレータ(て言うのかな)の場合はうまく特殊化できないようなのです
なにか解決策はありますか?
環境はBCC5.5.1+BCC添付のSTL+BOOST1.28
//少しだけ簡略化してます
template<typename Target, typename Source>
Target lexical_cast(Source arg)
{
std::stringstream interpreter;
Target result;
if(!(interpreter << arg) || !(interpreter >> result) ||
!(interpreter >> std::ws).eof())
throw bad_lexical_cast();
return result;
}
メモリを確保していないchar*型の変数resultには代入できないからね。
解決策はoperator char*()を定義して中でnew[]すればいいんだけど、
operator char*()を(暗黙的でも)呼び出した場合に必ずdelete[]しなきゃいけないのは大変だから、
std::stringだけ使っておくってのが正解かもね。
0724デフォルトの名無しさん
NGNGそれは理解しています(というか身を以て体感しました・・・)
なので、>>722の5行目で
operator const char*() const { return value.c_str(); }
として、ポインタを要求された場合はvalueの直データを渡すようにさせたいのですが
const char* lpstr = GetData(データ格納先);
と明示的にconst char*型を要求しても、テンプレートが適用されてエラーになってしまう
という問題です
さらに具合が悪いことに、
operator std::string() const { return value; }
としても、やはりテンプレートが適用されてしまいます
どうしたらいいんでしょうか・・・
0725デフォルトの名無しさん
NGNG0726デフォルトの名無しさん
NGNGtemplate<> char const* operator char const*() const{ return value.c_str(); }
とかでできない?想像だけれども
0727デフォルトの名無しさん
NGNGエラー E2036: 変換演算子には戻り型を指定できない
コンパイラがおっしゃる意味を理解できないのがツライ・・・
0728デフォルトの名無しさん
NGNGわぉ
すまんすまん
template<> operator char const*() const{ return value.c_str(); }
0729はt
NGNGたとえばEXE の中で
void Func(int,int);
と宣言されてたら、
void (*PFunc)(int,int);
と宣言して
PFunc = (void (*)(int,int))GetProcAddress( naninani , "Func");
とする。
こんなんですか?
0730デフォルトの名無しさん
NGNG0731デフォルトの名無しさん
NGNGダメです・・・template<typename value_type>が適用されまする・・・
0732デフォルトの名無しさん
NGNG諦めて、 operator long() ... operator char()... operator double()...と
列挙するとか。コンパイラ代えてみるとか。
0733デフォルトの名無しさん
NGNG__stdcall
0734デフォルトの名無しさん
NGNGどうするかは場合によりけりだと。
俺はDLLをプラグインとして使うことが多いから、
DLL内の関数はEXE側がGetProcAddressを使って自力で取得、
その関数を経由してEXE側の関数をEXEに渡す、てのをよく使う。
個々の関数をいちいちGetProcAddressすんのは面倒だから、
エクスポートすんのは、DLLの全機能を提供するクラスのインスタンスを返す関数ひとつだけにして、
あとはそのインスタンス経由でいろいろするのが楽。
0735デフォルトの名無しさん
NGNG了解しました・・・
型列挙で対応します
(BCCタダで使わせてもらってるから文句は言えない・・・)
0736デフォルトの名無しさん
NGNGtemplate<typename T>
operator T()
{
return Loki::TypeTraits<T>::isPointer ? spec_ptr<T>() : boost::lexical_cast<T>(value);
}
template<typename T>
T spec_ptr()
{
return 云々;
}
のようにエラー起きるのだけ特化させるのはどうですか?
0737736
NGNG○ VCなんで試せないのと
boostだと、
template<typename T>
operator T()
{
return boost::is_pointer<T>::value ? spec_ptr<T>() : boost::lexical_cast<T>(value);
}
ですかね。
0738デフォルトの名無しさん
NGNGコンパイル時チェックだと思いこんでた
0740デフォルトの名無しさん
NGNG0741デフォルトの名無しさん
NGNG三項演算はマクロじゃないので実行時に判断されませんか?
0742デフォルトの名無しさん
NGNG0743デフォルトの名無しさん
NGNG自己を満足させる心
0744デフォルトの名無しさん
NGNG終了させられた場合、メモリはちゃんと解放されるのでしょうか
0745名無しさん@Emacs
NGNGSIGKILLのことですか?
だとしたらOSがメモリを強制的に開放するんじゃなくて?
0746744
NGNGすみません、環境を書いていませんでしたね。おっしゃるとおり UNIX 系での
シグナルを想定していました。
やはり OS が解放してくれるのでしょうか。そうでないと安心できない気がしますが。
C で書いていた頃はそうでもなかったのですが、C++ で書くようになって気になり
始めました。自動的にデストラクタを呼んでいるわけでもなさそうですし。
あるクラスのインスタンスを一つ生成し、それがイベントループを廻し続けるような
プログラムを書いているのですが、この場合デストラクタが呼ばれることがあるので
しょうか。
0747デフォルトの名無しさん
NGNG制限がキツイとか常駐ソフトとかでもないかぎりあんま気にすんなぁ
0748名無しさん@Emacs
NGNGFreeしないで終わるようにする定石もあるらしい。
Windowsだとちょっと心配だけど、UNIXなら問題
ないのではないでしょうか?
0749デフォルトの名無しさん
NGNGdeleteは忘れるなよ。
0750デフォルトの名無しさん
NGNGですか?
0751744
NGNGたしかにプログラムが終了すれば、OS が面倒みてくれますね。常駐型の
プログラムを書いているので、別の問題とごっちゃになっておりました。
> あるクラスのインスタンスを一つ生成し、それがイベントループを廻し続けるような
> プログラムを書いているのですが、この場合デストラクタが呼ばれることがあるので
> しょうか。
結局のところ、興味があるのはこの点でして、このタイプのプログラムの場合、その
クラスのデストラクタを書いても意味はないかどうかということです。
0752デフォルトの名無しさん
NGNG0753デフォルトの名無しさん
NGNGプログラムの終了処理はOSが面倒見てくれることばっかじゃなしなぁ。
0754デフォルトの名無しさん
NGNGまあそういうVB厨プログラマが大勢いるから
NT系サーバの連続運用は難しいとかよく落ちるとか
1日一回リセットとかの話になるわけだな。
0755デフォルトの名無しさん
NGNGVB房ロゴの使用を許可します。
0756デフォルトの名無しさん
NGNG0757デフォルトの名無しさん
NGNGClassX b;
ClassX c;
a = b;
a = c ←の時点で、aのデストラクタって呼ばれるのでしょうか?
ClassXの内部で動的にメモリを確保しているような場合、上のような
状況で開放する術はありますか?
0758デフォルトの名無しさん
NGNGデストラクタじゃなくてoperator=が呼ばれる。
0759757
NGNGおお!即レスありがとうございます。
ちょっと悩んでいたんで、かなりうれしいです。
0760デフォルトの名無しさん
NGNG0761デフォルトの名無しさん
NGNG0762デフォルトの名無しさん
NGNGメンバがスマートポインタなら a = a でもデータ消失はないから大丈夫。
さらに operator = やコピーコンストラクタも定義する必要なし。夢のハッピーライフ。
でも、スマートポインタ使いまくりって奴もあまりいないが。
0763デフォルトの名無しさん
NGNGExceptional C++ の項目38に従って必要ならする…
と言いたいところだが、自己代入がボトルネックになる
場面なんて出会ったことないので結局やってないなぁ。
>>762
それじゃあ、デフォルトのoperator=とかコピーコンストラクタが
コピーじゃなくて実装の共有になってしまわんか?それで幸せなら
特に止めるつもりはないが。
0764デフォルトの名無しさん
NGNGねぇ、それはネタなの? 本気なの? 正しいの? 間違ってるの?
0765デフォルトの名無しさん
NGNGUNIXで仕事してたときに終了時に free をずらずらと書いて開放処理をしていたら
先輩にCPUに無駄な仕事してんじゃないと怒られました。
0766デフォルトの名無しさん
NGNGa = a のチェックは必要なら普通するけど・・・ってのはウソで、
a = a でも問題ないようなコードで済ますことの方が多いか。
0767デフォルトの名無しさん
NGNGスマートポインタ以外の方法あるの?
0768デフォルトの名無しさん
NGNGプログラム終了時には確保したメモリ領域はOSに返却される
どちらも「解放」という言葉を使ってるのが誤解を生む元になっているのではないだろうか。
#freeがOSに返却しないのは「多くの処理系では」という条件付らしいが,詳しくは知らん
0769デフォルトの名無しさん
NGNGT& T::operator=( const T& other )
{
T temp( other );
this->Swap( temp );
return *this;
}
http://www.gotw.ca/gotw/059.htm
0770デフォルトの名無しさん
NGNG0771デフォルトの名無しさん
NGNG設定することはできず、クラス内部の関数からは設定することが
できることってできますか?
ClassA
{
private:
int m;
public:
ClassA(int m);
}
だと、mを取得することができない。Getなどのアクセサをつかわずに、
mをpulicにしても、なおかつ、設定はできないみたいなのはできますか?
0772デフォルトの名無しさん
NGNGつかpublicなメンバ変数は、レコードのような扱いでないかぎり
あんまりお勧めできない・・・
<Del厨モード>
ちなみにC#ではgetのみのプロパティにて実現可能。
Javaにはないよね(藁
</Del厨モード>
0773デフォルトの名無しさん
NGNGtemplate<typename Type, class Owner>
class read_only_field
{
public:
operator const Type& () const { return t; }
private:
friend typename id<Owner>::type;
read_only_field& operator=(const Type& ot) {t=ot; return *this;}
Type t;
};
class A {
public: read_only_field<int, A> m;
...
};
…99.5%くらいネタだけどな。
0774デフォルトの名無しさん
NGNGvoid f(std::vector<int> &vr);
void f(std::vector<int> (&));
void f(std::vector<int> &);
全て同じ宣言ですか?
0775デフォルトの名無しさん
NGNG同じだろう。プロトタイプ宣言の仮引数は型しかチェックされないから。
0776デフォルトの名無しさん
NGNGレスサンクス。
やっぱりか(;´Д`)
0777デフォルトの名無しさん
NGNG0778デフォルトの名無しさん
NGNG0779デフォルトの名無しさん
NGNGreturn -1;
0780デフォルトの名無しさん
NGNGコールバックって、メンバー関数をじかに呼べないんですが、
class Aとclass Bがあって
Bは、コールバックされる関数(SetTimerとか)を使っていて、
さらにそのコールバックされる関数の中でBのメンバー関数を呼び出したい。
BにAのインスタンスのポインターを持たせればできますが、
1. Bの実装でAに依存しない(class Aのクラス定義を読み込まない)
2. Aをコールバックされる関数を含んだ中傷クラスのサブクラスとしない
という条件で、うまい方法ってないですか?
現状はtemplateを使って(public,private等は省略)
class base {
virtual void operaot()() = 0;
};
template<class T>
class callback : public base
{
typedef void (T::*F)();
callback(T* obj, F func) : o(obj), f(func) {}
void operator()() { return o->*f();
T* o;
F f;
};
とやって、AはBにcallbackのインスタンスを渡すようにしてますが、今市…
0781デフォルトの名無しさん
NGNG普通に多重継承で interface (風のもの) 使えば?
0782デフォルトの名無しさん
NGNG実は、class AはCOMのクラスなので、何か仮想関数持ったクラスを継承する
のは問題が起きるのではないかと思うのですが。
そんな事は無いのでしょうか?
0783デフォルトの名無しさん
NGNGデリゲートって知ってるか?
0784デフォルトの名無しさん
NGNG0785デフォルトの名無しさん
NGNG0786デフォルトの名無しさん
NGNG0787デフォルトの名無しさん
NGNGま ん こ
と書けやゴルア!
0788デフォルトの名無しさん
NGNG0789デフォルトの名無しさん
NGNG0790デフォルトの名無しさん
NGNG0791デフォルトの名無しさん
NGNGclass A
{
class B
{
operator int() { return 1; }
}
B getB() { return B(); }
}MyA;
int a = MyA.getB();
みたいな
もちろんint b = B();はコンパイルエラーで
0792デフォルトの名無しさん
NGNG0793デフォルトの名無しさん
NGNGできるよ。
0794名無しさん@Emacs
NGNG実はつかったことないけど・・・汗
0795デフォルトの名無しさん
NGNGなんでだろう。
0796デフォルトの名無しさん
NGNG0797デフォルトの名無しさん
NGNG0798デフォルトの名無しさん
NGNG0799デフォルトの名無しさん
NGNGだがテンプレート引数として渡せないという罠。(なんとなく理由は想像がつく)
0800デフォルトの名無しさん
NGNGAからBの関数を呼んで、BはAの(コールバックされる)関数を呼んで、
さらにそこからBの関数を呼ぶ、ということ?
で、AはBの定義やインスタンスを知っていて、しかもCOMのクラスなのね?
だとすると、多分Aはプラグインか何かだと思うけど、継承を避けるなら
780に類する方法しか無いと思う。ただ、Aを含むオブジェクトの中には
callback<A>もいて、それは仮想関数を持ったクラスを継承している。
WinもCOMも知らないから、何とも言えないけど、780で動いているなら、
継承は出来るんじゃあないかなあ。
構造上理由があって、継承を避けたいということならいいんだけど。
0801デフォルトの名無しさん
NGNGクラス内クラス宣言が利用に先立ってされなければならない(らしい)という所にひっかかってました
class A
{
B getB();
class B;
}; // コンパイルエラー「Bの重複定義」
というやつ・・・
class A
{
int hoo() { return bar(); }
int bar() { return 1; }
}
はOKなのに・・・
0802デフォルトの名無しさん
NGNGA が COM オブジェクトなら、ITimerHandler とかのカスタム
インターフェイス(を定義して)持たせておけばよいのでは?
多重継承とCOMについては、一度 ATL のサンプルソース読んでみて。
インタフェイス継承も実装の継承も多用しているから、大分参考に
なるはず。
0803デフォルトの名無しさん
NGNGclass A
{
int hoo(){ B b; }
class B{};
};
これはOK
違いわかる?
0804デフォルトの名無しさん
NGNGofstream out;
out.open("nowhere\\test.dat");
ところが、open に失敗します。
つまり、ファイルをオープンするとき、書き込み用の場合などは、
ファイルが存在しなくても、自動的に作成してくれるようですが、
ディレクトリも同時に作ってくれたりはしないみたいです。
ディレクトリを作成しつつファイルも作る方法はありますか?
あるいは、単独でディレクトリを作成する標準関数はあるのでしょうか?
(Windows 用の _mkdir などを使うしかないのでしょうか?)
0805デフォルトの名無しさん
NGNGファイルとディレクトリはWindowsでは全く別々のものなので、
ディレクトリを作ってからopenして下さい。
0806デフォルトの名無しさん
NGNGnamespace std
{
struct less<Particle*>: public binary_function<hoge const *, hoge const*, bool>
{
bool operator()(hoge* const a, hoge* const b)
{
return a->val < b->val;
}
};
};
std::list<hoge*> hogelist;
・・・//hogelistにnewしたhoge*を追加
hogelist.sort(std::less<hoge*>());
のようにしています。
・stdに手を入れていること
・hoge*に特化したstd::less<hoge*>を使っていること
の2点でよくないような気がするのですが、他の方法はありますか?
0807デフォルトの名無しさん
NGNGSTLスレッド part2
http://pc3.2ch.net/test/read.cgi/tech/1026793823/l50
0808804
NGNGうーむ、そうですか。
ディレクトリを作りつつ……というプログラムを C++ でやろうとしたら、
OS に依存したコードを書かなければならない、ということですね。
どうもありがとうございました。
0809デフォルトの名無しさん
NGNG> ディレクトリを作りつつ...
> OS に依存したコードを書かなければならない、
当たり前だと思うけど...、全ての OS に階層ディレクトリがあると思っているのか ?
0810デフォルトの名無しさん
NGNG0811デフォルトの名無しさん
NGNG> >>804の言うOSとはWindowsとLinuxの2種類だと思う。
>>804 だったら、Windows だけだろ ?
> Visual C++ 6.0 で...
0812デフォルトの名無しさん
NGNGstd以外の名前空間で定義すればよい。
namespace hehehe
{
template <typename T>
struct less<T*>: public binary_function<const T*, const T* , bool>
{
bool operator() (const T* a, const T* b) const
{
return a->val < b->val;
}
};
};
0813デフォルトの名無しさん
NGNGあー,ちゃいます。
804が書いた>>808のレスの中で言ってる「OS」のことです。
0814デフォルトの名無しさん
NGNGnamespace hehehe
{
template <typename T>
struct less<T> : public binary_function<const T*, const T* , bool>
{
bool operator() (const T* a, const T* b) const
{
return a->val < b->val;
}
};
};
0815デフォルトの名無しさん
NGNG直接テンプレート引数にファンクタ渡せば?
0816804
NGNG> 全ての OS に階層ディレクトリがあると思っているのか ?
すみません、かなり勉強不足でした。
少なくとも C++ が走るようなものではそうだと思っていました。
ちなみに、どんな OS だと階層ディレクトリがないのですか?
(検索しても Windows/Unix/MacOS 以外については余り情報が得られないので。)
なお、
> ディレクトリを作成しつつファイルも作る方法はありますか?
に関連して、無効なパスを渡された場合、
1・階層ディレクトリのある環境ではディレクトリの作成を試みる
2・そうでないときは、やはりエラーを返す
というような機能を考えてみたのですが、
やはり無理、またはやらない方がよい、ということですか?
0817デフォルトの名無しさん
NGNGふるいmvsとか
0818デフォルトの名無しさん
NGNGプリンタや自販機のROMの中にもOS入ってたりする。
0819デフォルトの名無しさん
NGNGどういう風に書けばいいの?
0820デフォルトの名無しさん
NGNG全てのOSにファイルはあるの?
0821デフォルトの名無しさん
NGNGlist::sortには、Predを引数とする版があるだろ。
0822デフォルトの名無しさん
NGNGああなるほど、std::lessではなくて、適当な名前の比較関数オブジェクトを
渡してやればいいのですね。
0823デフォルトの名無しさん
NGNG組み込みだとディスク自体が無いね
0824デフォルトの名無しさん
NGNG部分特殊化できないと LokiのTypeListみたいなのはつくれないんでしょうか?
//_Tはクラス. _R は戻り値の型. _Lは引数の型
template <typename _T,typename _R,typename _L>class FunctorX
{protected:
_R(_T::*mem_f1)(_L);
_R (*g_f1)(_L);
_T* obj_ptr_f1;
_T* func_obj_ptr_n1;
enum Mode{other,mem_ptr,ptr,func_obj}m_mode;
void Ini(){
g_f1= NULL;mem_f1 = NULL;
obj_ptr_f1 = NULL;func_obj_ptr_n1 = NULL;
m_mode = Mode::other;
}
public:
FunctorX(_T& ob,_R (_T::*f1)(_L)){
Ini();mem_f1= f1;
obj_ptr_f1 = ptr;m_mode = Mode::mem_ptr;
}
explicit FunctorX(_R (*f1)(_L)){
Ini();g_f1 = f1;
m_mode = Mode::ptr;
}
explicit FunctorX(_T& ob){
Ini();func_obj_ptr_n1 = &ob;
m_mode = Mode::func_obj;
}
FunctorX(){ Ini()}
~FunctorX(){}
0825正男 ◆GVV43x.nK.
NGNG0826続き
NGNGif( obj_ptr_f1 != NULL && mem_f1 != NULL && m_mode == Mode::mem_ptr){
return (ob.*mem_f1)(a);}
throw "Functor error";
}
_R call(_L a){
switch(m_mode){
case Mode::mem_ptr :
if( obj_ptr_f1 != NULL && mem_f1 != NULL )
return (*obj_ptr_f1.*mem_f1)(a);
break;
case Mode::ptr :
if( g_f1 != NULL )
return (*g_f1)(a);
break;
case Mode::func_obj :
if( func_obj_ptr_n1 !=NULL )
return (*func_obj_ptr_n1)(a);
break;
default:
break;
}
throw "Functor error";
}
_R operator()(_L a){return call(a);}
};
0827main
NGNG{
template<typename R,typename L> R f(L a){ return a*2;}
Test(){}
~Test(){}
};
int main()
{
Test c5,c5a;
Functor<Test,int,int> t5(c5,&Test::f<int,int>);
cout << t5.call(c5,100);
cout << t5.call(100);
cout << t5.call(c5a,100);//c5 の関数ポインタ経由で c5aを呼び出す???
cout << t5(100);
FunctorX< Functor<Test,int,int> ,int,int> t6(t5);
t6(100);
}
0828デフォルトの名無しさん
NGNGその規模のコードはcppにしてどこかにアップしろ
コメントされてない(しかもインデントすらされていない)コードなんて
ただのゴミ
0829デフォルトの名無しさん
NGNGtemplate苦手だからってキレんなよw
0830デフォルトの名無しさん
NGNGでもそれだけ書かれてもなぁ。
0831829
NGNG0832しつこく
NGNGmember-declaration
:decl-specifier-seqopt member-declarator-listopt ;
|function-definition ;opt
|::opt nested-name-specifier templateopt unqualified-id ;
|using-declaration
|template-declaration
;
という部分がありますが上から三番目は何に使われてますか?
0833デフォルトの名無しさん
NGNGprivate:
int *a;
public:
ClassA(){a = NULL}
ClassA(int i){ a = new int [i] }
}
みたいなクラスがあって、
ClassA ain = new ClassA[100];
で呼ばれるコンストラクタは引数なしのコンストラクタしか無理ですか?
0834デフォルトの名無しさん
NGNG0835デフォルトの名無しさん
NGNGそれほんとにいける?
0836デフォルトの名無しさん
NGNG0837デフォルトの名無しさん
NGNG0838832
NGNG0839デフォルトの名無しさん
NGNG0840デフォルトの名無しさん
NGNGAがシンタックスエラーを起こしていますとか。
どういうことなんでしょう?
本に書いてある通りにやっているのに・・・。
何がいけないのでしょう?
#include <stdio.h>
#include <stdlib.h>
class A {
public:
int id;
};
int main()
{
int i;
A c;
c.id = 100;
for( i = 0; i < 7; i++)
printf( "id = %d", c.id);
return 0;
}
0841デフォルトの名無しさん
NGNG> #include <stdio.h>
> #include <stdlib.h>
こんな低脳なコードを乗せている入門本は古すぎるか腐っているので
捨てた方が吉かと。
0842デフォルトの名無しさん
NGNGbcc32では動いたよ。
拡張子は.cppとかにした?
0843840
NGNGありがとうございました。
一体2つはどう違うのでしょう?
0845デフォルトの名無しさん
NGNG0846デフォルトの名無しさん
NGNG0847デフォルトの名無しさん
NGNGclass A
{
template<class T>
T foo()
{ なんたらかんたら }
}myA;
int a = myA.foo<int>();
でコンパイル通ってしまうんですが、
これはどう解釈されてるんでしょうか?
「返値の型だけ異なる」オーバーロードってNGでしたよね?
0848デフォルトの名無しさん
NGNG0849デフォルトの名無しさん
NGNGコンパイラがbccだからじゃない?
0850デフォルトの名無しさん
NGNGとは知りませんでした。首吊ってきます。
0851デフォルトの名無しさん
NGNG0852832
NGNG0853デフォルトの名無しさん
NGNGテンプレートはオーバーロードではないからだろ
0854デフォルトの名無しさん
NGNG辞書式順序でsortできるようにするためには、
bool operatorとsortを使えばよいらしいというのは、
分かったのですが、具体的なコーディングが分かりません。
教えてください。
0856デフォルトの名無しさん
NGNG2次元以上の要素をいったいどう並び替えろと?
0857デフォルトの名無しさん
NGNG0858854
NGNG例えば、(1,2),(5,6),(5,4),(2,4)というデータがあったら、
第一番目のデータを見て、(1,2),(2,4),(5,6),(5,4)
と並び替え、
一番目のデータが同じ時は、
(1,2),(2,4),(5,4),(5,6)
のように並び替えたいのです。
数学的に書くと
(i,j)<(k,l)←→i<k
i=kのときは、j<l
としたいということです。
0860デフォルトの名無しさん
NGNG> 辞書式順序です。
頼むから、用語はちゃんと覚えてくれ。あやふやだったらはじめから使うな。
> 一番目のデータが同じ時は、
> (1,2),(2,4),(5,4),(5,6)
> のように並び替えたいのです。
というのは、単に複数キーでソートすると言う。
(ちなみに、辞書式というのは概ね文字コード順にソートすることを指す。)
> 数学的に書くと
> (i,j)<(k,l)←→i<k
> i=kのときは、j<l
と言うのがわかっているなら、qsort() の比較関数をそのように書けば良いだけだよ。
でも、そう言うデータなら二次元配列より構造体の一次元配列の方がわかりやすいと思う。
0861デフォルトの名無しさん
NGNG> >>858
> > 辞書式順序です。
>
> 頼むから、用語はちゃんと覚えてくれ。あやふやだったらはじめから使うな。
固定長の文字列とみなせば辞書式と言っても間違いではない。
> (ちなみに、辞書式というのは概ね文字コード順にソートすることを指す。)
別に文字コードじゃなくたっていいんだよ、順序さえあれば。
0862デフォルトの名無しさん
NGNG宣言と実体を別ファイルで書くことは出来なんでしょうか?
ファイル:a.h
template<class T>
struct A
{
A();
};
ファイル:a.cpp
template<class T>
A<T>::A()
{
}
このクラスを別のファイル(main.cpp)で使おうとすると、
外部シンボルが未解決ですと言われます。
何か書き方が間違っているのでしょうか?
一応a.hに実体もまとめて書けばエラーにはならないのですが・・・
0863デフォルトの名無しさん
NGNG0864デフォルトの名無しさん
NGNG> 固定長の文字列とみなせば辞書式と言っても間違いではない。
ハイハイ、人の指摘に手一杯で、>>858 の
> 数学的に書くと
> (i,j)<(k,l)←→i<k
> i=kのときは、j<l
は見てないのね。
> 別に文字コードじゃなくたっていいんだよ、順序さえあれば。
ハイハイ、「概ね」と言う言葉も理解できなかったのね。
ったく、話の流れぐらい読めよ。
0865デフォルトの名無しさん
NGNG何が言いたいのかわからんが「辞書式比較」の定義って、二要素なら
> 数学的に書くと
> (i,j)<(k,l)←→i<k
> i=kのときは、j<l
普通まさしくこれのことだぞ。先頭要素を先に比較して、同じなら残りの要素で比較。
std::lexicographical_compare でも見れ。
0866デフォルトの名無しさん
NGNG0867デフォルトの名無しさん
NGNGVCやgccでは無理なんですか・・・
>>853
>>847のコードはfooが呼ばれる度に
class A
{
int foo() {}
char foo() {}
:
:
};
みたいに展開されると思ってたんですが
違うのですか・・・?
0868854
NGNGいい。
それはそうですが、それをsortとbool operatorでできますか、ということです。
一から自分でプログラムしてもいいですが、面倒なので。
あまり自信もないし。
>>860
>頼むから、用語はちゃんと覚えてくれ。あやふやだったらはじめから使うな。
別にあやふやでないです。
辞書式順序というのは、正式な言葉のはず。
ただプログラミングの世界ではないのかも。
> 一番目のデータが同じ時は、
> (1,2),(2,4),(5,4),(5,6)
> のように並び替えたいのです。
>というのは、単に複数キーでソートすると言う。
では複数キーでソートするやり方を教えてください。
できればsortのような組み込みのアルゴリズムを使ってもらえると助かります。
0869デフォルトの名無しさん
NGNGclass A
{
template< class T > T foo(){}
};
は
class A
{
template<> int foo<int>(){}
template<> char foo<char>(){}
};
って展開されると思う。
0870デフォルトの名無しさん
NGNGできるでしょ
bool operrator < で lexicographical_compare つかって sort に突っ込めば?
自分でコーディングする部分なんてほとんど無いよ
0871862
NGNG誰かヒントだけでも…
0872デフォルトの名無しさん
NGNGテンプレートはそういうものだと思ってあきらめましょう。。。
0873デフォルトの名無しさん
NGNGexportキーワードをまともにサポートしている処理系でないと、
テンプレートの宣言と実体を分けて書くことはできない。
0874デフォルトの名無しさん
NGNGstruct A
{
A();
};
一方その頃 cpp では。。。
ファイル:a.cpp
template<class T> < おーい、俺はどうしたら良いんだよ〜、なんか不安になってきたよ。。
A<T>::A()
{
}
0875デフォルトの名無しさん
NGNG0876デフォルトの名無しさん
NGNGコンテナの比較は辞書式だから固定長ならboost::arrayでも使えば?
0877862
NGNGどうもありがとうございます。
いままでコンストラクタのところでしかエラーが出てなかったんで、
コンストラクタさえどうにかなれば可能だろうと考えていましたが、
今テストしてみた結果、実体作るとやっぱりメンバー関数も無理だと
言うことが分かりました。
確かにa.cppの型を解決する方法が無いですもんね…。
(いままでコンパイラが勝手に解釈してくれてるのとばかり…)
素直にあきらめることにします。
0878デフォルトの名無しさん
NGNGそういえば…Comeauのネット上の試用コンパイラ(?)は
template <template <class> class Container> class HogeにSTLのコンテナを渡せなかったなぁ。
(→試してないけど、template <template <class, class> class Container>になら渡せそうだった。)
これって普通?VC,BCC,gcc,+STLPortだと文句言わずにコンパイルしてくれるんだけど。
0879デフォルトの名無しさん
NGNGもし、テンプレート引数 T に渡す型とかがいくつかに限定されているなら、
それらを a.cpp で明示的にインスタンス化するという手は使えるけど。
template A<int>;
template A<char*>;
とか。
0880デフォルトの名無しさん
NGNGコンテナのbegin,endの代入も苦しいし,
algorithmライブラリを使えるようにするのも苦しい.
_Rb_tree_iterator<...>とか書かないとうまい事いかない
もんなんでしょーか?
_Rb_...とか書くと移植性0になりそうなので,
幸せになれる方法を教えてください.
0881デフォルトの名無しさん
NGNGC++標準ライブラリP285〜、§7.5.2「ユーザー定義の反復子」に詳しいです。
class MyIterator
: public std::iterator<std::bidirectional_iterator_tag, type> {
...
};
0882862
NGNGその方法>>877書いた直後に思いついたんですけど、
明示的に宣言出来るところがないんですよ。
テンプレート使ってるコードは全部ヘッダに詰め込むのが基本なんですかね??
0883880
NGNGその本持ってますが,そこではコンストラクタで
コンテナを受け取るという事をやっていて,
コンテナのbeginメンバ関数からの代入は扱ってません.
0884デフォルトの名無しさん
NGNGboost::iterator_adapter
0885デフォルトの名無しさん
NGNGtemplate A<int>; って書き方は、どこででもできると思うけど。
別にオブジェクトとか関数とかを定義しているわけでもないし。
0886デフォルトの名無しさん
NGNGこちらで質問させていただきます。
VBから呼び出し可能なDLLを作成しています。
調べていく上でエクスポートの方法は
__declspecでのエクスポートではなく
Defファイルへの記述でのエクスポートが必要ということが分かりました。
それで質問というのはDefファイルっていうのは
Func @1
というような記述をしますよね?
そこでClass CTestのメンバ関数GetFileNameを記述するには
どう記述したらいいでしょうか?
適当に書いてみても駄目でした。
文法的にどういう風に「クラスののメンバ関数」のGetFileName
ということを書いたらいいのかわかりません。
教えていただけませんか?
よろしくお願いします。
0887デフォルトの名無しさん
NGNGVC++スレってなかったかな・・・
VBからC++のクラスを直には呼べないよ。ActiveX(COM)にするしかない。
呼べるのはCの関数形式のもの。これのやりかたはFAQなので省略。
0888886
NGNGえ、defファイル自体VCの話しだったんですね、
スレ違いですね、失礼しました。
Comにしなきゃだめなんですね、
わかりました、ありがとうございます。
ではVBの話しは別にして、
defファイルでクラスごと、または
クラスのメンバ関数のエクスポートの記述方法だけでも
教えてもらえませんでしょうか?
もう半年くらいわからなくて半分以上放置になってる
悩み事なんです。
これで消えますのでよろしくお願いします。
普通はDEFファイルを書く必要はないが、
どうしてもDEFでやりたいなら・・・。
DEFファイルではクラスごとエクスポートすることはできない。
メンバごとにエクスポートする必要がある。
例えば、こういうクラスAがあったとすると、
class A {
public:
A();
int a(int, char*);
};
DEFファイルにはこのように書く。
EXPORTS
??0A@@QAE@XZ @1 NONAME
?a@A@@QAEHHPAD@Z @2 NONAME
装飾名はMAPファイルで確認すること。@ordinalとNONAMEは
なくても構わない。
0890デフォルトの名無しさん
NGNG親へのイテレータをsecondに持ったマップのようなモノを使いたいのですが
既存のライブラリにそういうモノって無いでしょうか?
要求としては、
・"文字列"と"親を指すイテレータ"を格納できる
・マップ中のある要素に"格納してある文字列"でアクセスできる
・そしてその要素から親まで順番にたどりつつ
・さらに現在の要素に格納されている文字列を参照できる
イメージとしては
map<string, iterator> chainmap;
のような感じで、例えば
A ─ B ┬ C ─ E
└ D ┬ F
└ G
という階層構造にしたとして、
chainmap["D"].PrintUpToParent();
とかすると
for (it = *chainmap["D"]; it != chainmap.end(); it = it->second)
cout << it->first << endl;
みたいな処理をしたいのです
0891デフォルトの名無しさん
NGNGD
B
A
にしたいという事です・・・
0892デフォルトの名無しさん
NGNG要するに自作クラスのポインタをスタックに入れる処理がしたいのです。
よろしくお願いします。
0893デフォルトの名無しさん
NGNGJisaku* jien[N];
for(int i=0; i<N; i++) {
jien[i] = new Jisaku();
}
0894デフォルトの名無しさん
NGNGstd::vector< boost::shared_ptr<Jisaku> > jien;
jien.assign( N, new Jisaku );
>>893
最後の()は不要
0895894
NGNG0896デフォルトの名無しさん
NGNGもしかして普段から()省いてますか?
0897デフォルトの名無しさん
NGNG0898デフォルトの名無しさん
NGNGそれってjienいっぱいに同じインスタンスが敷き詰められるんじゃ・・・
0899衝撃の事実(漏れにとっては・・・)
NGNG{
ofstream* FileHandle;
public:
FileWrapper(const char* fname) { FileHandle = new ofstream(fname, ios::out | ios::trunc); }
~FileWrapper() { delete FileHandle; }
FileWrapper& operator <<(ostream& (*pf)(ostream&)) { *FileHandle << pf; }
template<class T> FileWrapper& operator <<(T arg) { *FileHandle << arg; }
};
int main()
{
// 処理A /////////////////////////////////////////////////////////
FileWrapper* FileStream = new FileWrapper("testA.txt");
boost::timer t;
for (int i = 1; i <= 10000; ++i) {
*FileStream << i << ",";
}
*FileStream << "\nElapsed time " << t1.elapsed() << " sec." << endl;
delete FileStream;
// 処理B /////////////////////////////////////////////////////////
ofstream* FileHandle = new ofstream("testB.log", ios::out | ios::trunc);
timer t2;
for (int i = 1; i <= 10000; ++i) {
*FileHandle << "no " << i << "," << flush;
}
*FileHandle << "\nelapsed time " << t2.elapsed() << " sec." << endl;
delete FileHandle;
}
0900衝撃の事実(漏れにとっては・・・)
NGNGコンパイル BCC5.5.1
で、なぜか処理Aにかかった時間が平均約0.05秒に対し
処理Bにかかった時間が平均約0.5秒・・・その差なんと10倍
直打ちよりテンプレート化したほうが速いって一体どういう事ですか?
処理順で(boost::timerあたりに)何か違いがあるかもと思って
上下入れ替えてみても、結果はかわりませんでした
0901衝撃の事実(漏れにとっては・・・)
NGNGboost::timer t2;
for (int i = 1; i <= 10000; ++i) {
*FileHandle << i << ",";
}
*FileHandle << "\nelapsed time " << t2.elapsed() << " sec." << endl;
です
0902デフォルトの名無しさん
NGNGBCCは、こういうコードを通すのか、、、、return *this;を追加。
bcc:
Elapsed time 0.231 sec.
elapsed time 0.22 sec.
vc6:
Elapsed time 0.1 sec.
elapsed time 0.1 sec.
0903デフォルトの名無しさん
NGNG0904デフォルトの名無しさん
NGNG0905デフォルトの名無しさん
NGNG0906デフォルトの名無しさん
NGNG0907デフォルトの名無しさん
NGNG0908デフォルトの名無しさん
NGNG{
operator bool() { return false; }
};
int main()
{
if (A()) return -1;
/* Do something */
return 0;
}
とあった場合、mainで呼び出されたAは
return 0;以降でデストラクトされると保証されますか?
0909デフォルトの名無しさん
NGNG0910デフォルトの名無しさん
NGNG0911デフォルトの名無しさん
NGNG実は、多重起動を抑止するために
以下のような仕組みを考えてみたのですが、
なんとこれがうまく動いてしまっているんです。
環境依存の恐るべきコードですか?
class ImNotOriginal
{
public:
ImNotOriginal()
{
hMutex = CreateMutex(NULL, TRUE, "このアプリケーションの名前");
}
~ImNotOriginal()
{
ReleaseMutex(hMutex);
}
operator bool()
{
return (WaitForSingleObject(hMutex, 0) == WAIT_TIMEOUT);
}
private:
HANDLE hMutex;
};
int main()
{
if ( ImNotOriginal() ) return -1;
/* 何やらかんやら */
}
0912デフォルトの名無しさん
NGNGそのロジックでは、本当は重複起動を防止できない。
実際に重複起動を防止できてしまうのは、デストラクタが呼ばれないのではなく、
最初に起動したプロセスが CreateMutex() と WaitForSingleObject() で
ミューテックス所有権を 2 つ獲得してしまっている為に、ReleaseMutex() を
2 回呼ばないとミューテックスを解放できないからだ。
WaitForSingleObject() はミューテックスが誰かに所有されているかを確認する
だけでなく、誰も所有していなかったら所有権を獲得してくる。
誰かが所有している場合、その所有しているスレッドが WaitForSingleObject() を
呼んだスレッド自身であった場合は、ロックされずに所有権をもう 1 つ獲得してくる。
ロックされないのは単独スレッドによるデッドロックを防ぐため、所有権をもう 1 つ
獲得してくるのは排他処理の帳尻を合わせるため (処理 A、B で排他が必要な時、
B が終わっていないのに A で排他が終了しただけで B が突入可能になるのはまずい
だろう?)。
ミューテックス所有権の獲得と放棄は必ず 1 対 1 で対応させること、その際
WaitFor*Object() 系 API の取り扱いには十分注意すること。
ミューテックスで重複起動を防止する場合は通常、WaitForSingleObject() を呼ぶ
のではなく、CreateMutex() 直後で GetLastError() の戻り値が ERROR_ALREADY_EXISTS
であるかどうかを調べる。
0913デフォルトの名無しさん
NGNG詳しい説明ありがとうございました
では質問を変えて、operator bool()の実装を
return (GetLastError() == ERROR_ALREADY_EXISTS)
にした場合、コンストラクタ→operator bool()と呼ばれる保証はありますでしょうか?
0914デフォルトの名無しさん
NGNGclass ImNotOriginal
{
public:
ImNotOriginal()
{
HANDLE hMutex = CreateMutex(NULL, FALSE, "このアプリケーションの名前");
}
~ImNotOriginal(){}
operator bool()
{
return (GetLastError() == ERROR_ALREADY_EXISTS);
}
};
というコーディングは可能でしょうか?ということです
あ・・・これだとミューテックス生成そのものに失敗してもfalseになっちゃうのかな・・・
0915デフォルトの名無しさん
NGNG1度しか呼ばれない事を前提にすれば
class ImNotOriginal
{
public:
operator bool()
{
HANDLE hMutex = CreateMutex(NULL, FALSE, gc_AppName);
DWORD result = GetLastError();
return (hMutex == NULL || result == ERROR_ALREADY_EXISTS);
}
};
これでいいのですね
0916デフォルトの名無しさん
NGNGif(ImNotOriginal()) はまず ImNotOriginal() が評価され、コンストラクタが
呼ばれる。
次に、if は評価式に bool を要求するので、bool に型キャストされて operator bool()
が呼ばれる。
つまり、望み通りコンストラクタに続けて operator bool() が呼ばれるし、必ずそう動く
ものと見なして良いが、結果そうなるだけで言語レベルで保証しているという訳ではない。
>>915
そこまでひらめいたなら、関数化するべきだ。
クラスである意味は全く無い。
どーでもいーけど CreateMutex() って、lpName が "(゚Д゚)ハァ?" でも "\\" でも
"\r\n" でも "" でも成功するんだよなー。
0917デフォルトの名無しさん
NGNG私が知らないだけでしょうか。
libwwwとboostはつかってますがほかになんかいいのないですか?
0918デフォルトの名無しさん
NGNGloki、common c++ libraryかなぁ…メジャーなのだと(cc++がメジャーかどうかはアレだが)。
欲しい機能に++とかCC付けて検索すると結構APIにヒットしたりするよ。socket++、socketCCとか、
pthreadCCとか。
CやC++は、基本的に「最低限は用意してるから、後は自分で用意しろや」ってスタンスが強いから、
自作するか他人様が作ったライブラリを求めてネットをさまようしかないだろうな。
0919デフォルトの名無しさん
NGNGACE, Blitz++, FC++ …などなど。
ライブラリじゃないけどflex/bisonとか。
0920デフォルトの名無しさん
NGNG文字を表示するもの?
0921デフォルトの名無しさん
NGNGVCのデバッグ窓に文字列を表示・・ジャネーノ?
#二重起動云々はVCスレでやってほしいのう
0922男子高校生
NGNG実用的に汎用にすんのが辛いね。
0923デフォルトの名無しさん
NGNG激しく汎用化してしまえ。
マジレスするとそういのうは経験が必要だから、とりあえず適当に組むべし。
そのうち慣れるよ。
0924デフォルトの名無しさん
NGNG自分さえも読めない罠にはまって射精するのが漢
0925デフォルトの名無しさん
NGNGシンプルなwrapper libraryないですかねえ。MT不要、fork不要、realtime signal なぞぜんぜんいらない。
自分で書けってか。
0926デフォルトの名無しさん
NGNGコメントぐらい書けってば!
0927デフォルトの名無しさん
NGNGそれじゃ射精できないだろう!
0928デフォルトの名無しさん
NGNG∧_∧____ エッ
Σ (*゚−゚) ./\
/| ̄〇〇 ̄|\/
|__しぃ++.__|/
.  ̄ ̄ ̄ ̄
0929デフォルトの名無しさん
NGNGinline string &operator<<(string &Str, char AddStr) { return Str += AddStr; }
inline string &operator<<(string &Str, const char *AddStr) { return Str += AddStr; }
inline string &operator<<(string &Str, string &AddStr) { return Str += AddStr; }
09303たび
NGNGTC++PL3rdや>>3のFinal Draftにある文法に
member-declaration
:decl-specifier-seqopt member-declarator-listopt ;
|function-definition ;opt
|::opt nested-name-specifier templateopt unqualified-id ;
|using-declaration
|template-declaration
;
という部分がありますが上から三番目は何に使われてますか?
0931デフォルトの名無しさん
NGNG文法を示されて、一瞬何の事かわからなかった。
すまん、stringは独自クラスではなくてstd::stringなのだが…。k94i
ostreamのように
str1 << str2 << '(' << str3 << ")";
とかできればいいなと思ったの。
ちなみに上から三番目の第二引数はconst忘れ。
0933930
NGNG0934930
NGNG0935デフォルトの名無しさん
NGNG住人が同じであるいじょう何度聞いても答えは得られないと思われ
所詮2ちゃんはこの程度かと思いながら他のもっとましなところに行くことをおすすめする
0940939
NGNG「Cから見ればstringも充分アレだし」 と書きたかった。
0941930
NGNGvoid main()
で盛り上がってた。
0942デフォルトの名無しさん
NGNG0943スーパー初心者
NGNG0944デフォルトの名無しさん
NGNG0945デフォルトの名無しさん
NGNG#error (・∀・)
#endif
abcと同名のシンボルは無いはずだけど全ての処理系で通る(falseで)!
大ハケーン?
0946デフォルトの名無しさん
NGNG0947デフォルトの名無しさん
NGNG0948デフォルトの名無しさん
NGNG何が。
0949デフォルトの名無しさん
NGNGとマジレスしてみるテスト
0950デフォルトの名無しさん
NGNG例えばポインタ演算 **p の結合規則は右から左なので、(*(*p)) と同じだ。
それと同様に考えればいい。
つまり、char const * p; は char (const (* p)); で、p そのものは変更できるが
*p が指すものは変更できない。
逆に、char * const p; は char (* (const p)); で、p そのものは変更できないが
*p が指すものは変更できる。
そして、char const * const p; は char (const (* (const p))); であり、これは
p そのものも *p が指すものも変更できない。
なお、const char * p; は char const * p; と全く同一である。
でよろしいか?
0951デフォルトの名無しさん
NGNG0952デフォルトの名無しさん
NGNGよろしい
0953デフォルトの名無しさん
NGNG次スレおながい。
0954950
NGNGありがとう。
>>951 >>953
これでいい?
C++相談室 part12
http://pc3.2ch.net/test/read.cgi/tech/1035005882/
次スレの 4・・・あんた速えーよ・・・。
0955デフォルトの名無しさん
NGNGまもなくここは 乂千取り合戦場乂 となります。
\∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,,、,、,,, / \〇ノゝ∩ < 0x03E8 取り合戦、いくぞゴルァ!! ,,、,、,,,
/三√ ゚Д゚) / \____________ ,,、,、,,,
/三/| ゚U゚|\ ,,、,、,,, ,,、,、,,,
,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/
//三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
∪ ∪ ( ) ( ) ( ) )
,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
,,、,、,,, ( ) ( ) ( ) ( )
0956Hikky!
NGNG0957デフォルトの名無しさん
NGNG0958Hikky!
NGNG0959デフォルトの名無しさん
NGNG0960デフォルトの名無しさん
NGNG0961デフォルトの名無しさん
NGNG0962デフォルトの名無しさん
NGNG0963デフォルトの名無しさん
NGNG0964アフォルトの名無しさん
NGNGコンパイルエラー
0965アフォルトの名無しさん
NGNGp++;
printf("%d", (char *)p + 1);
0966アフォルトの名無しさん
NGNG注意力が足りなかった
0967デフォルトの名無しさん
NGNGget = sizeof(_);
0968デフォルトの名無しさん
NGNG0969デフォルトの名無しさん
NGNGfor (int i = 0 ; i < 969 ; ++i) {
std::cout << "(・∀・)マンコ!!" << std::endl;
}
0970デフォルトの名無しさん
NGNGなに?そのださいプログラムは。
0971デフォルトの名無しさん
NGNGプログラムというよりただのシークエンスという気がする。
間違いなくコンパイル通らないだろうし。
0972デフォルトの名無しさん
NGNGマラにオマンコキモチイイ!
0973デフォルトの名無しさん
NGNG0974デフォルトの名無しさん
NGNG0975デフォルトの名無しさん
NGNGint main(int argc, char** argv)
{
for (int i = 0 ; i < 975 ; ++i) {
std::cout << "(・∀・)ティンポ!!" << std::endl;
}
return 0;
}
0976Hikky!
NGNG|\ \
| | ̄ ̄ ̄ ̄|
| | ´∀` | ヒキコもこもこ引き篭もり〜♪
| | 鬱 |
\|____|
人 Y
し (_)
0977デフォルトの名無しさん
NGNG楽しそうだな
0978デフォルトの名無しさん
NGNG0980デフォルトの名無しさん
NGNGstd::auto_ptr ( Standerd C++ Library )
boost::sheard_ptr ( Boost )
Loki::SmartPtr ( Loki )
YTL::smart_ptr ( Yaneura Game SDK 3rd )
みんなは、どれを一番使ってるよ?
ほかにも、イイのがあったら教えてくれ。
0982デフォルトの名無しさん
NGNG0983デフォルトの名無しさん
NGNGLoki のスマートポインタは、いろいろいじれるから、
趣味や勉強にはいいかも。
個人的には期待大
やねうらお の smart_ptr は、面白いけど、どれだけ使う場面があるかは微妙。
やっぱ Boost か。
0984デフォルトの名無しさん
NGNG0985デフォルトの名無しさん
NGNG0986デフォルトの名無しさん
NGNG0987デフォルトの名無しさん
NGNG0988デフォルトの名無しさん
NGNG0989デフォルトの名無しさん
NGNG0990デフォルトの名無しさん
NGNG0991デフォルトの名無しさん
NGNG0992デフォルトの名無しさん
NGNG0993名無しさん@カラアゲうまうま
NGNG0994デフォルトの名無しさん
NGNG0995名無しさん
NGNG0996デフォルトの名無しさん
NGNG0997ぉながいします
NGNG0〜99の数字を1秒間隔で表示。1〜9で改行、表示する
こんな感じです
1 2 3 4 5 6 7 8 9
10 11 12〜〜〜〜〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜省略〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜99
これのプログラムを教えてください
よろしくお願いします
0998デフォルトの名無しさん
NGNG0999デフォルトの名無しさん
NGNG1000名無しさん
NGNG10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。