class C++相談室lt;part56gt;

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。 
ただし質問の前にはFAQに一通り目を通してください。 
IDE(VC++など)などの使い方の質問はその開発環境のスレに 
お願いします。 

テンプレその他 >>2-15 付近参照 

前スレ 
C++相談室 part55
http://pc10.2ch.net/test/read.cgi/tech/1164951094/l50
2デフォルトの名無しさん:2007/02/02(金) 00:35:16
これはひどい。
3デフォルトの名無しさん:2007/02/02(金) 00:37:40
■基本■ 
[C++ FAQ] 
 http://www.parashift.com/c++-faq-lite/ 
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語) 
  Cとその仕様を比較しながらの解説なので分かりやすい。 
  ***** 質問の前に必ずこの二つに目を通してください ***** 
[C/C++ リファレンス] 
 http://www.cppreference.com/ (英語) 
 http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない) 
[禿 Stroustrup] 
 http://public.research.att.com/~bs/ 
[C++ International Standard] 
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3= 
[JTC1/SC22/WG21 - C++] 
 http://www.open-std.org/jtc1/sc22/wg21/ 
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。 

4デフォルトの名無しさん:2007/02/02(金) 00:38:27
5デフォルトの名無しさん:2007/02/02(金) 00:39:17
>>1


だがこれはかっこ悪いな
6デフォルトの名無しさん:2007/02/02(金) 00:39:20
7デフォルトの名無しさん:2007/02/02(金) 00:39:52
8デフォルトの名無しさん:2007/02/02(金) 00:40:02
一体何事かと思った
9デフォルトの名無しさん:2007/02/02(金) 00:40:27
スレタイ壊れとる。
10:2007/02/02(金) 00:40:28



   すみませんでした・・・



            削除依頼してきます


 テンプレ張ってくれてる人ありがとうございます
11:2007/02/02(金) 00:46:23
今削除依頼だしてきました。すみません。。
12デフォルトの名無しさん:2007/02/02(金) 01:24:30
削除依頼出す前に本スレ立ててからにしろよ〜
13デフォルトの名無しさん:2007/02/02(金) 01:27:43
<>使うの止めようぜ
14デフォルトの名無しさん:2007/02/02(金) 01:28:21
このまま存続でよくね?
15デフォルトの名無しさん:2007/02/02(金) 01:37:55
>>1やりたいことはわかる
16デフォルトの名無しさん:2007/02/02(金) 02:29:06
スレタイの誤字程度で削除なんて
C++的とは言えんな
ゴミを黄金水に変えてこそC++だろ
17デフォルトの名無しさん:2007/02/02(金) 02:30:18
黄金水ってょぅι゙ょの聖水だよな
18デフォルトの名無しさん:2007/02/02(金) 02:40:08
C1010: プリコンパイル済みヘッダーの検索中に予期しない HAGE を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
19デフォルトの名無しさん:2007/02/02(金) 02:42:46
#include <stdaderance.h>
後死ね。

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

Boostつかうと一気に実行ファイルサイズが100倍に?!

環境によるだろ。
俺はVC++に /Yc オプションを指定して、極力
プリコンパイルヘッダを使用するようにして使っているが、例えばboost::lambdaを
使っても使わない時と比べ10秒ほどしか増えない。
20デフォルトの名無しさん:2007/02/02(金) 05:02:45
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
21デフォルトの名無しさん:2007/02/02(金) 09:07:45
22デフォルトの名無しさん:2007/02/02(金) 09:45:25
20 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

速攻であぼーんになってるw
23デフォルトの名無しさん:2007/02/02(金) 12:13:02
注 : 私 の 有 意 義 な 発 言 に 対 し 、 自 分 の 理 解 不 足 を 棚 に 上 げ 煽 り 、 1 行 レ ス
で 返 す 方 が 多 い よ う で す が 、 そ の よ う な 方 は ス レ の 皆 様 を 混 乱 さ せ る だ け で な く
ス レ の 雰 囲 気 を 崩 し か ね な い の で お 黙 り 下 さ い 。
ま た 質 問 者 は 回 答 者 に 知 識 を 披 露 す る 場 を 与 え る 貴 重 な 存 在 な の で 、
質 問 者 を 見 下 し た 回 答 、 あ ま り に も 儀 礼 を 欠 い た 回 答 も 厳 重 に 禁 止 い た し ま す 。
忙 し い 中 、 少 な い 時 間 の 合 間 を 縫 っ て 質 問 し に 来 て る わ け で す の で 、
そ の 辺 ご 承 知 下 さ い 。 な お 、 当 方 が 質 問 に 対 し て 有 意 義 な 答 え で あ る と
判 断 し た 方 に は 評 価 い た し ま す の で 各 自 よ く 調 べ 、 よ く 考 え 正 確 な 回 答 を す る よ う に 。
24デフォルトの名無しさん:2007/02/02(金) 12:14:17
23 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
25デフォルトの名無しさん:2007/02/02(金) 12:18:39
注^:^私^の^有^意^義^な^発^言^に^対^し^、^自^分^の^理^解^不^足^を^棚^に^上^げ^煽^り^、^1^行^レ^ス
で^返^す^方^が^多^い^よ^う^で^す^が^、^そ^の^よ^う^な^方^は^ス^レ^の^皆^様^を^混^乱^さ^せ^る^だ^け^で^な^く
ス^レ^の^雰^囲^気^を^崩^し^か^ね^な^い^の^で^お^黙^り^下^さ^い^。
ま^た^質^問^者^は^回^答^者^に^知^識^を^披^露^す^る^場^を^与^え^る^貴^重^な^存^在^な^の^で^、
質^問^者^を^見^下^し^た^回^答^、^あ^ま^り^に^も^儀^礼^を^欠^い^た^回^答^も^厳^重^に^禁^止^い^た^し^ま^す^。
忙^し^い^中^、^少^な^い^時^間^の^合^間^を^縫^っ^て^質^問^し^に^来^て^る^わ^け^で^す^の^で^、
そ^の^辺^ご^承^知^下^さ^い^。^な^お^、^当^方^が^質^問^に^対^し^て^有^意^義^な^答^え^で^あ^る^と
判^断^し^た^方^に^は^評^価^い^た^し^ま^す^の^で^各^自^よ^く^調^べ^、^よ^く^考^え^正^確^な^回^答^を^す^る^よ^う^に^。
26デフォルトの名無しさん:2007/02/02(金) 12:19:10
注_:_私_の_有_意_義_な_発_言_に_対_し_、_自_分_の_理_解_不_足_を_棚_に_上_げ_煽_り_、_1_行_レ_ス
で_返_す_方_が_多_い_よ_う_で_す_が_、_そ_の_よ_う_な_方_は_ス_レ_の_皆_様_を_混_乱_さ_せ_る_だ_け_で_な_く
ス_レ_の_雰_囲_気_を_崩_し_か_ね_な_い_の_で_お_黙_り_下_さ_い_。
ま_た_質_問_者_は_回_答_者_に_知_識_を_披_露_す_る_場_を_与_え_る_貴_重_な_存_在_な_の_で_、
質_問_者_を_見_下_し_た_回_答_、_あ_ま_り_に_も_儀_礼_を_欠_い_た_回_答_も_厳_重_に_禁_止_い_た_し_ま_す_。
忙_し_い_中_、_少_な_い_時_間_の_合_間_を_縫_っ_て_質_問_し_に_来_て_る_わ_け_で_す_の_で_、
そ_の_辺_ご_承_知_下_さ_い_。_な_お_、_当_方_が_質_問_に_対_し_て_有_意_義_な_答_え_で_あ_る_と
判_断_し_た_方_に_は_評_価_い_た_し_ま_す_の_で_各_自_よ_く_調_べ_、_よ_く_考_え_正_確_な_回_答_を_す_る_よ_う_に_。
27デフォルトの名無しさん:2007/02/02(金) 12:19:40
注:::私:の:有:意:義:な:発:言:に:対:し:、:自:分:の:理:解:不:足:を:棚:に:上:げ:煽:り:、:1:行:レ:ス
で:返:す:方:が:多:い:よ:う:で:す:が:、:そ:の:よ:う:な:方:は:ス:レ:の:皆:様:を:混:乱:さ:せ:る:だ:け:で:な:く
ス:レ:の:雰:囲:気:を:崩:し:か:ね:な:い:の:で:お:黙:り:下:さ:い:。
ま:た:質:問:者:は:回:答:者:に:知:識:を:披:露:す:る:場:を:与:え:る:貴:重:な:存:在:な:の:で:、
質:問:者:を:見:下:し:た:回:答:、:あ:ま:り:に:も:儀:礼:を:欠:い:た:回:答:も:厳:重:に:禁:止:い:た:し:ま:す:。
忙:し:い:中:、:少:な:い:時:間:の:合:間:を:縫:っ:て:質:問:し:に:来:て:る:わ:け:で:す:の:で:、
そ:の:辺:ご:承:知:下:さ:い:。:な:お:、:当:方:が:質:問:に:対:し:て:有:意:義:な:答:え:で:あ:る:と
判:断:し:た:方:に:は:評:価:い:た:し:ま:す:の:で:各:自:よ:く:調:べ:、:よ:く:考:え:正:確:な:回:答:を:す:る:よ:う:に:。
28デフォルトの名無しさん:2007/02/02(金) 12:21:54
25 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
26 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
27 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
29デフォルトの名無しさん:2007/02/02(金) 12:29:19
正規表現すらしらないのか
30デフォルトの名無しさん:2007/02/02(金) 12:36:45
性器表現?
31デフォルトの名無しさん:2007/02/02(金) 14:33:09
「禁止表現」 別表3
<性表現>
1.性器及び局部(恥毛を含む)表現
32デフォルトの名無しさん:2007/02/02(金) 14:40:51
namespace seiki_hyougen
{
namespace tag
{
struct tinko;
struct manko;
}

}
33デフォルトの名無しさん:2007/02/02(金) 16:24:54
>>32
typedefで別名たくさん付けそうだ
今ちょうど官能小説用語辞典かって来たところだ
34デフォルトの名無しさん:2007/02/02(金) 19:38:03
>>23がテンプレには入ってるのにわろた
35デフォルトの名無しさん:2007/02/02(金) 22:17:18
review eequest Boost.Seiki_hyougen

collection of seiki_hyougen tag;

namespace seiki_hyougen
{
namespace tag
{
struct tinko;
struct manko;

typedef tinko penis;
typedef manko awabi;
....
}
}
36デフォルトの名無しさん:2007/02/02(金) 22:42:47
何それ面白いと思ってんの?
37デフォルトの名無しさん:2007/02/02(金) 22:50:14
>>36
じゃあ代わりになにか面白いネタ振ってよ。
「暗いと不平を言うよりも、進んで明かりをつけましょう」
38デフォルトの名無しさん:2007/02/02(金) 23:17:43
39デフォルトの名無しさん:2007/02/03(土) 00:57:06
>>36
の強い反対によりrejectされました
Reviewer comment:
Definitely useless

40デフォルトの名無しさん:2007/02/03(土) 05:26:24
無理にネタふらなくてもいいと思うんだ
ネタスレじゃないんだし
41デフォルトの名無しさん:2007/02/03(土) 12:38:13
typedef manko awabi; 

あわびかよww
42デフォルトの名無しさん:2007/02/03(土) 12:41:57
ポリモルタソにおれのポリシープラグイン!!
43デフォルトの名無しさん:2007/02/03(土) 13:03:03
template<class inserter>
class Porimol : public inserter
{

public:
 bool sex(){ insert(); } 

}

class MyPenis 
{
protected:
  insert();
}

44デフォルトの名無しさん:2007/02/03(土) 13:03:49
これはひどい
45デフォルトの名無しさん:2007/02/03(土) 14:22:44
>>29
存在を忘れてた。
お陰ですっきりした。
46デフォルトの名無しさん:2007/02/03(土) 15:36:54
テンプレにあったこれって都市伝説ですか?

Boostつかうと一気に実行ファイルサイズが100倍に?!


 
47デフォルトの名無しさん:2007/02/03(土) 15:43:37
>>46
自分で試してみれ。
48デフォルトの名無しさん:2007/02/03(土) 15:52:16
>>47
指して換わりませんでした
49デフォルトの名無しさん:2007/02/03(土) 15:56:40
むしろコンパイル時間の方がうっとおしい
50デフォルトの名無しさん:2007/02/03(土) 20:10:54
std::wcout << (wchar_t)i;
if(std::wcout.fail()){std::wcout.clear(std::ios::goodbit);}
こんなのを書いたんだが
画面に表示せずにどっかに出力を捨てて
fail()をチェックする方法ってある?
51デフォルトの名無しさん:2007/02/03(土) 20:29:28
>>50
表示したくないだけならBOM( ZERO WIDTH NON-BREAKING SPACE )でも突っ込めば?
52デフォルトの名無しさん:2007/02/03(土) 21:06:21
さんくす、BOMってこんな使い道あったんだな
ただ、今回はiが表示可能文字かどうかチェックするのが目的なんで
もうちょっと調べてみるわ
53デフォルトの名無しさん:2007/02/03(土) 21:09:03
…表示可能文字かどうかはそれでは判定できないよ。
54デフォルトの名無しさん:2007/02/03(土) 21:13:18
>>52
>ただ、今回はiが表示可能文字かどうかチェックするのが目的なんで

そーゆーことなら iswgraph() っていう標準関数があるぞ。
55デフォルトの名無しさん:2007/02/03(土) 21:15:41
iswprintとかiswgraphとか
56デフォルトの名無しさん:2007/02/03(土) 21:21:02
ところで isgraph系の関数と isprint系の関数ってなにが違うんだ?
画面表示(isgraph)と印刷(isprint)の違い?
57デフォルトの名無しさん:2007/02/03(土) 21:44:05
windowsなんで、こんな方法をみっけた
std::wofstream ofs(L"nul");

>>53
なんとなくは、わかってるつもり
Unicodeなら制御文字とかだよな
CJK統合漢字のうちCK部分はstd::locale("japanese")だと表示されないわ

>>54
お、調べてみる。さんくす
58デフォルトの名無しさん:2007/02/03(土) 22:34:32
テストしてみた。
nul出力してfailbitがたたないもの
 0-0x0080
 0x3000を含む
 以下の範囲を含む
  0xe000-0xe757
  0xf8f0-0xf8f3
iswgraphが真
 0x0021-0x007e
 0x3000を含まない
 以下の範囲を含まない
  0xe000-0xe757
  0xf8f0-0xf8f3
iswprihtが真
 0x0009
 0x0020-0x007e
 0x3000を含む
 以下の範囲を含まない
  0xe000-0xe757
  0xf8f0-0xf8f3
3種類の、その他の結果は全て同じ
なお
 0x0009は水平タブ
 0x3000は空白
 0xe000〜0xf8ffは私用領域
59デフォルトの名無しさん:2007/02/03(土) 22:37:56
>>56
空白類文字を含むか、含まないかの違いらしい
6057:2007/02/04(日) 00:21:44
やべ、めっちゃバグってた
57のことは忘れてください
61デフォルトの名無しさん:2007/02/04(日) 12:47:06
               /|:::::::::::::::::::::ヽ.:.:.:.:、:.:.:.:、:.:.:.、.:.、.:.:.:.:.:.::`゛>
           /{::|:\:::::::\.:.:.:\.:.:.ヽ::.::.ヽ:.:.ヽ::::::::::.:.`゛ー- ..,__
: 何 :    /:|::',:ト、::::::ヽ、:.\:.:.:.\:.:.ヽ:.:.:\.:.:.:.:.:::.:.:.:.:::.::::_;:-'´ 
: が :   //:/:::|::',|::'、:::::::::\:.:\.:.:.ヽ:.:.:\:.:..\::::::::::::\、::::\  
: 何 :  /!::|::l::::/|:::l:ヽ:\::ヽ:.:\:.:\.:::ヽ:.:.:ヽ:.:.:.:\::::::::::::\ ̄ 
: だ :   |/l::|::|::|:ト、:::::::::、、:ヽ、:.:.:.:::::::::::::::ヽ::::.:ヽ:.:.:.:.\:.:.:.ヽ:::\.  
: か :   |::|::/l::|::|r‐ヽ:::::ヽ(ヽー,―\::::::、::::::::::ヽ::.:.::::::.:::::::ヾ. ̄  
:    :   }//l::|:::|{(:::)ヾ、:::ヽ \!(:::) ヽ,:::ヽ:::::::::::::::::::::::::::::::::::ヾ、   
: わ :.  |/l::|::|:::|ヽ==''" \:ヽ、ヽ=='" |:::::::::::::::::::::::::::::::::::ヽ、::::\
  か     / ',|::|:::|   /   `゛       |!::::::::::::::::::::::::::::ト、::ト、_` ゛`
  ら      l::!::::ト、  '、 _         ||::::::::::::::::::::::::ト:ヽヾ| | ̄ ̄ ̄`ヽ、
  な     r'"´||',::::',                 |:::::/l:::::|\:::ト、ヾ | |     / / \
  い   /   ll ',::', 、 ーこニ=-       /!::/ ヽ:::|  ヾ、  ノ ノ  /  ,イ   ヽ、
       ,'    |  '、:, \ --       ,. '´ |;'  l ヾ、.   //     / |    l: l
      |   |!  ヽ;  ヽ       /.:    i!  /   ゛// |l      / |      | |
62デフォルトの名無しさん:2007/02/04(日) 20:43:05
>>49
同意。スクリプト言語の最大のメリットはコンパイルしなくて済む点だと思ってる。
書いてすぐに実行できるのが最高。
そんなオレからすればコンパイルに何分もかかるようなプログラムは現実的じゃない。
あんなのに耐えられるのは、makeと打ってコーヒー飲みにいってたようなおっさんだけ。
63デフォルトの名無しさん:2007/02/04(日) 20:46:59
C++で作ったのをPythonで繋げる
64デフォルトの名無しさん:2007/02/04(日) 20:56:58
コーヒーは嫌いかい?
65デフォルトの名無しさん:2007/02/04(日) 21:54:47
>>62
「コンパイルが遅くなったら人間側がマルチタスクになればおk」
って昔の教科書に書いてあったのを思い出した
66デフォルトの名無しさん:2007/02/04(日) 22:27:21
俺もコンパイルしてる間は、メール書いたり別のことしてるけどね。
だからといって、コンパイルに長時間かかっても良いってことじゃないけど。
67デフォルトの名無しさん:2007/02/04(日) 22:28:43
俺の先輩が、ビルドに1時間かかるんだよとか嬉しそうに言うんだけど、
なんなんだろうね
68デフォルトの名無しさん:2007/02/04(日) 23:08:49
初心者から初級者へステップアップした証だなそれは
69デフォルトの名無しさん:2007/02/04(日) 23:15:56
以前は2時間かかっていたんだろ。
70デフォルトの名無しさん:2007/02/04(日) 23:29:23
いや、俺のプログラムはビルドに1時間もかかるほどすごいんだぞ!
と言う事だと思う
71デフォルトの名無しさん:2007/02/04(日) 23:31:28
きっとテンプレートを駆使して浮動小数点数の計算をしているんだよ。
72デフォルトの名無しさん:2007/02/04(日) 23:32:38
g++なひとはdistcc使うと幸せになれるよ
73デフォルトの名無しさん:2007/02/04(日) 23:33:17
メタプログラミングをプロジェクトで使うのってどうよ
74デフォルトの名無しさん:2007/02/04(日) 23:37:53
浮動小数点計算とコンパイル時間に何の関係が?
75デフォルトの名無しさん:2007/02/04(日) 23:40:32
>>73
使うこと自体はよいが、適当な粒度でコンパイル依存を切るのが定石
76デフォルトの名無しさん:2007/02/05(月) 00:56:25
>>67
その間メシくいにいけるとか
77デフォルトの名無しさん:2007/02/05(月) 01:42:19
>67
pimplとかって使わないのかね。
78デフォルトの名無しさん:2007/02/05(月) 01:49:58
>>76
その間に喫煙所に行ったり仮眠とったり、パチンコに行ったりするのような光景が
昔ではよく見られた。いまはどうなんだろ?
79デフォルトの名無しさん:2007/02/05(月) 13:44:10
シュミレーションに2週間かかるようなプログラムじゃなかったら
c++じゃなくてmatlab使う
80デフォルトの名無しさん:2007/02/05(月) 16:29:31
ref++がwindows vistaで動かなかったのは対応されたのかな
81デフォルトの名無しさん:2007/02/05(月) 17:57:28
http://www.aoky.net/articles/steve_yegge/tour_de_babel.htm
C++は地上でもっともバカな言語だ
82デフォルトの名無しさん:2007/02/05(月) 18:18:06
>>79趣味レーションならそれで十分だな
83デフォルトの名無しさん:2007/02/05(月) 18:25:11
バカだろうとなんだろうとあちこちで使われている現実がある。
84デフォルトの名無しさん:2007/02/05(月) 18:38:16
>>81
まあLispが好きなEmacs使いの言うことだから。
85デフォルトの名無しさん:2007/02/05(月) 18:41:42
emacsでC++書いてるので複雑
86デフォルトの名無しさん:2007/02/05(月) 18:46:56
>C++はすごい遊び場であり、そのすべてを知るとすごく賢くなった気分になる。
>だからあなたはそのすべてを使おうとすることになる。
>しかしそれはうまくやるのが本当に難しいのだ。

この辺に同意する。
2年間C++を学んで、>>6の本もすべて読んで、
ようやくSTLやBoostのすばらしさを理解したけれど、
メタプログラミングを実際に使いたいかというと、激しく疑問。
87デフォルトの名無しさん:2007/02/05(月) 18:49:52
>だからあなたはそのすべてを使おうとすることになる。
ここが間違いの元
88デフォルトの名無しさん:2007/02/05(月) 18:54:54
不自由なほうが安全なのはみんなわかってるはずなのに
使えるものは使いたい、揮える力はふるいたいという衝動が
89デフォルトの名無しさん:2007/02/05(月) 19:03:46
>2年間C++を学んで、>>6の本もすべて読んで、
>ようやくSTLやBoostのすばらしさを理解したけれど、
この辺でお郷が知れている。

>メタプログラミングを実際に使いたいかというと、激しく疑問。
そりゃぁ、二年間の歳月とそれだけの本を読むという手間隙を掛けて辿り着いたところがあれじゃぁねぇ。
メタプログラミングを実践で応用できるは、そのような手間隙なしに到達できる人間に限られているのかもしれない。
90デフォルトの名無しさん:2007/02/05(月) 20:11:32
全てを使うのではなく、必要なものだけを使えばよい。
91デフォルトの名無しさん:2007/02/05(月) 20:13:27
でもその必要なものだけという力加減がまた難しいもんだ。
9286:2007/02/05(月) 21:02:43
>>89
いや、最初の一年は、テンプレートがまったく理解できなかった。
STLがなんだかすごいとは思ったが、どうして動いているのか分からなかったので、
うまく使えなかった。
Boostは、そもそも理解できなかった。
テンプレートについて書いている本も見つからなかったし。
>>6に上げられている本、特にC++ Templatesを読んで、ようやく理解できた。
私のような凡人には、手取り足取り教えてくれる教科書が必要です。

>メタプログラミングを実践で応用できるは、そのような手間隙なしに到達できる人間に限られているのかもしれない。
それはたとえば、禿とか髭ですか。
93デフォルトの名無しさん:2007/02/05(月) 23:13:47
テンプレート使うか使うまいが、
C++かCか分からんプログラム書こうが、
良いじゃないか。動いていれば!!!
動いてるって素晴らしい!!!
94デフォルトの名無しさん:2007/02/05(月) 23:17:33
>>81
なんかひどい言われようだけど、やっぱ俺はC++が一番好きだな
あのごつごつした粗野な感じ、ちょっと間違うとすぐアプリケーションエラー
しかしうまく扱えたときの快感
車にたとえればポルポルかフェラーリだな。
95デフォルトの名無しさん:2007/02/05(月) 23:24:57
>>93それはスパゲティなソースを認めるということかね
96デフォルトの名無しさん:2007/02/05(月) 23:35:52
>>95
ミートソースは認めるけど、
和風おろしソースは認めない
97デフォルトの名無しさん:2007/02/05(月) 23:37:47
つ、つまらん
98デフォルトの名無しさん:2007/02/05(月) 23:41:32
>>81
Javaより抜粋
> C++と比較すれば、Javaは言語として同程度だ。いや、今のなし。ずっといい。
> 文字列があるもの。文字列のサポートがお粗末な言語なんていったいどうやって使えるんだ?

俺、ずっとC++のstringは文字列だと思ってたよ。(´Д⊂
99デフォルトの名無しさん:2007/02/05(月) 23:43:17
言語がバカだから人間が頭使えて楽しいんだろ。
賢い言語なんてバカな人間向けの補助輪だと思わないかね
100デフォルトの名無しさん:2007/02/05(月) 23:48:36
それは極論
パズルが好きならアセンブラやれ、ってことになる。(まあそうなんだけど)

しかし正直文字列の扱いはC++酷い
101デフォルトの名無しさん:2007/02/05(月) 23:53:34
アセンブラは低レベルすぎてむしろ頭使えない
CくらいがちょうどいいなーJavaになるとぬるま湯って感じ
102デフォルトの名無しさん:2007/02/05(月) 23:58:56
いかに命令数削減するかとか
レジスタ少なく使うかとか
エンコード系の処理の最適化を考えるのは結構楽しいぞ
103デフォルトの名無しさん:2007/02/06(火) 00:01:27
プログラムを書くのが楽しいのか
アプリの機能やら考えてつけるのが楽しいのか
食うために書いてるのか
104デフォルトの名無しさん:2007/02/06(火) 00:20:04
>>102
>いかに命令数削減するかとか

あーそれは楽しいね
cpの代わりにor使ったりとか
105デフォルトの名無しさん:2007/02/06(火) 00:35:38
>>99
そうだ、所詮は言語なんて、すべてマシン語へのシンタックスシュガーなんだ。
106デフォルトの名無しさん:2007/02/06(火) 00:39:22
>>105
うぉーいきなり真理を突いてきましたよ!!!
目から鱗
107デフォルトの名無しさん:2007/02/06(火) 00:41:18
108デフォルトの名無しさん:2007/02/06(火) 00:58:50
機械語最高
109デフォルトの名無しさん:2007/02/06(火) 02:22:42
Boost使いまくってる人は最新のPCでOCしまくって使ってるの?
110デフォルトの名無しさん:2007/02/06(火) 05:44:46
なんで自分の使ってる電算機言語にけちつけられた位で人生の全てを否定されたかの様な反応するのか理解できません。
111デフォルトの名無しさん:2007/02/06(火) 09:10:59
井蛙は井の水枯れれば干乾びる
112デフォルトの名無しさん:2007/02/06(火) 16:02:54
普通に反論が来ただけで釣れたとか必死だなとか言う奴のほうが理解できね
113デフォルトの名無しさん:2007/02/06(火) 16:43:03
スレタイの影響なのかマ板みたいな会話が続いてるな
114デフォルトの名無しさん:2007/02/06(火) 17:25:12
関数の引数に関数を渡して関数の中で引数で渡した関数を呼び出したいんですが出来ますか?
出来るか出来ないかだけで結構です。
115デフォルトの名無しさん:2007/02/06(火) 17:26:27
できる。
116デフォルトの名無しさん:2007/02/06(火) 17:26:56
できる。
117デフォルトの名無しさん:2007/02/06(火) 17:27:53
>>114
型としての「関数」は無理だろうな。
関数ポインタとか、関数オブジェクトなら渡せるが。
118デフォルトの名無しさん:2007/02/06(火) 17:29:43
そんなことわかってるよ。
やっぱ関数ポインタとか面倒なんで引数にクラスを渡すことにします。
お前らご苦労さん。
119デフォルトの名無しさん:2007/02/06(火) 17:47:40
なにこれ
120デフォルトの名無しさん:2007/02/06(火) 17:49:43
俺の精子だよ
121デフォルトの名無しさん:2007/02/06(火) 18:32:29
そこでstd::tr1::function。
結局関数オブジェクトであることに変わりはないし、
引数に渡すだけならテンプレート使えよと言うところだが。
122デフォルトの名無しさん:2007/02/06(火) 19:57:56
std::ptr_fun
123デフォルトの名無しさん:2007/02/06(火) 20:57:46
関数オブジェクトと関数ポインタの違いは何ですか?
124デフォルトの名無しさん:2007/02/06(火) 20:58:47
>>110
誰も全て否定されたなんて思ってないのだが。。。
お前はよくそういうこと感じたりするの?
125デフォルトの名無しさん:2007/02/06(火) 21:22:45
わざわざ蒸し返すなよ
126デフォルトの名無しさん:2007/02/06(火) 21:32:25
すみませんでしたショボーン
127デフォルトの名無しさん:2007/02/06(火) 21:37:06
>>123
関数オブジェクトはクラス。関数ポインタは関数へのポインタ。
128デフォルトの名無しさん:2007/02/06(火) 21:40:09
関数ポインタ⊂関数オブジェクト
129デフォルトの名無しさん:2007/02/06(火) 21:42:59
関数オブジェクトはメンバ変数を持てるからいろいろできる

当然クラスだから継承もできるけど… どういう場面で関数オブジェクト継承するのかはワカンネ
130デフォルトの名無しさん:2007/02/06(火) 21:45:48
STL以外で関数オブジェクト使ったことありますか?
131デフォルトの名無しさん :2007/02/07(水) 00:15:23
俺はねえ
132デフォルトの名無しさん:2007/02/07(水) 00:21:29
boostでは良く使う
133デフォルトの名無しさん:2007/02/07(水) 09:36:16
滅多に使わないが内部関数定義するときに使った。
あとはテンプレートの関数作って一部のテンプレート引数を
typedefで固定化したいときとか。
134デフォルトの名無しさん:2007/02/08(木) 18:04:29
http://www.cmake.org/CMake/HTML/Download.html
cross platform make なんてあるんだね
135デフォルトの名無しさん:2007/02/09(金) 04:02:13
うん。
136デフォルトの名無しさん:2007/02/09(金) 10:40:39
boost/mpl/if.hにおいて
101 template<
102 bool C_
103 , typename T1
104 , typename T2
105 >
106 struct if_c
107 {
108 typedef typename aux::if_impl< C_ >
109 ::template result_<T1,T2>::type type;
110 };
という箇所があるんですが、
この ::template というのはどういう意味なんでしょうか?
137デフォルトの名無しさん:2007/02/09(金) 10:56:23
result_というのがif_implのインナークラス"テンプレート"なんだということがいいたいのかな?
だとしたら、
typedef typename aux::if_impl< C_ >::result_<T1,T2>::type type;
これではなんでいけないのか
138デフォルトの名無しさん:2007/02/09(金) 15:01:07
c++スレって1つにまとめてもいいのかな
139デフォルトの名無しさん:2007/02/09(金) 16:26:06
>>137
手元に資料が無いから推測でモノ書くけど、
「result_<T1」が式として認識されないようにするためじゃね?
140デフォルトの名無しさん:2007/02/09(金) 19:37:12
テンプレート名に明示的に依存する名前のあとに特殊化を書く場合、templateキーワードが必要らしい。
http://www.kuzbass.ru:8086/docs/isocpp/template.html#temp.names

だけど、templateキーワード無しでもコンパイルが通ったり、
さらにはtemplateキーワードがあるとコンパイルが通らなくなるコンパイラもあるから、
boostはBOOST_NESTED_TEMPLATEマクロでねじ伏せてるみたい。
http://boost.org/libs/config/config.htm#helpers
141140:2007/02/09(金) 19:39:31
ああ、間違えた。テンプレート パラメータに依存する・・だ。

スレ汚しごめん
142デフォルトの名無しさん:2007/02/09(金) 20:38:18
ジェネリックプログラミングとか関数プログラミングとか
なんかむずいけど、面白っ!
143デフォルトの名無しさん:2007/02/09(金) 21:00:14
>>142
死ね
144デフォルトの名無しさん:2007/02/09(金) 21:03:21
意味無さ過ぎてワラタ
145デフォルトの名無しさん:2007/02/10(土) 03:27:21
struct Cls {
  template <typename FuncType>
  Cls() {
    void* p = new FuncType;
  }
};
int main() {
  Cls c<int>();
  return 0;
}

こういう風にしたいんですがコンパイルできません
templateクラスにはしたくないんですが
コンストラクタでtemplate使うのは↓みたいに引数から推論させるしかないんでしょうか?

template <typename FuncType>
Cls(FuncType) {
  void* p = new FuncType;
}

Cls c(10);
146デフォルトの名無しさん:2007/02/10(土) 04:01:40
高橋秀樹「そのコード、ジェネリックになりませんか?」
147デフォルトの名無しさん:2007/02/10(土) 04:47:36
��Cls�c<int>();
○��Cls<int>�c;
148デフォルトの名無しさん:2007/02/10(土) 04:54:10
>>139
なるほど。T1がテンプレートパラメータだからダメだってことなんですね。

// boost/mpl/if.hpp
template< bool C > struct if_impl
{ template< typename T1, typename T2 > struct result_ { typedef T1 type; }; };
template<> struct if_impl<false>
{ template< typename T1, typename T2 > struct result_ { typedef T2 type; }; };

template< bool C_, typename T1, typename T2 > struct if_c {
typedef if_impl<true>::result_<int, char>::type type1; //これはOK
//typedef typename if_impl< C_ >::result_<T1,T2>::type type; //クラステンプレート内ではERROR!!
typedef typename if_impl< C_ >::template result_<T1,T2>::type type;
};
149デフォルトの名無しさん:2007/02/10(土) 10:24:54
>>145
そういうこと。
Boostなんかだと場合によっては何か引数で型を指定する方法を使っていた気がする。
150デフォルトの名無しさん:2007/02/10(土) 10:36:02
>>149
やっぱりそうですか。なんかC++にありがちな、きな臭い方法があればなーと思ったんですが
組み込みならともかく巨大なクラスとかだと現実的じゃない方法だ、、
151デフォルトの名無しさん:2007/02/10(土) 11:13:33
>>150
受け取る側は参照にすべきだと思う。
152150:2007/02/10(土) 11:43:48
インスタンス作るとコンストラクタが走ってしまうのでなかなか。
↓みたいにポインタにすればコストは少なそうだけど毎回キャストとか使い物にならねorz

struct TCls {
    TCls() { std::cout << typeid(*this).name() << std::endl; }
};
struct ClsRef {
    template <typename T>
    ClsRef(const T&) {
        T* p = new T;
    }
};
struct ClsPtr {
    template <typename T>
    ClsPtr(const T*) {
        T* p = new T;
    }
};
int main() {
    //ClsRef cc((TCls()));
    ClsPtr c(static_cast<TCls*>(0));
}
153デフォルトの名無しさん:2007/02/10(土) 12:18:16
タイプ数的にはあんまり変わらないけど。
--
template<typename>struct hoge{};
struct hige{virtual void huge(){}};

template<typename T>
void hage(hoge<T>)
{
 std::cout << typeid(T).name() << std::endl;
}

int main(int,char**)
{
 hage(hoge<hige>());
 return 0;
}
154デフォルトの名無しさん:2007/02/10(土) 13:21:48
>>153
やるとしたら、こっちのほうがミスはなくて良さそうですね
ただ、どっちにしろ(自分の感覚では)あまりキレイな形にはならなそうで残念です

どうもありがとうございました
155デフォルトの名無しさん:2007/02/10(土) 16:40:10
struct Cls {
    void* p;
    template<typename T> struct traits{};
    template<typename T> Cls(traits<T>){
        p = new T;
        std::cout << typeid(T).name() << ":" << p << std::endl;
    }
};

template<typename T> struct TCls : public Cls{
    TCls():Cls(Cls::traits<T>()){}
};

void func(Cls c) {
    std::cout << c.p << std::endl;
}

struct A {
    int n;
};

void main(int argc, char* argv[]) {
    TCls<A> tc;
    func(tc);

    Cls c = tc;
    func(c);

    std::cout << "sizeof(tc)=" << sizeof(tc) << std::endl;
    std::cout << "sizeof(c)=" << sizeof(c) << std::endl;
}
156デフォルトの名無しさん:2007/02/11(日) 12:27:48
void* a= new int(10);
cout << *a << endl;

2行めが正しく無い様で、ポインタの指すアドレスが表示されてしまいます。
void方のポインタ a が指す値を参照したり、変更するにはどうすればよいのでしょうか??
157デフォルトの名無しさん:2007/02/11(日) 12:55:02
>>156
適当にreinterpret_castすればよろし。
>156の例なら、std::cout << * reinterpret_cast<int *>(a);とすれば(不定値が)出力されるかと。
158デフォルトの名無しさん:2007/02/11(日) 12:59:53
>>156
実体がintだったりcharだったりするのを自動判別して表示するのを期待している?
なら、voidポインタでは無理。素直にaの型をint*にしる。

>>157
void*から既知のポインタ型に戻すのは
スタチック=キャストで正当扱いされるような気がするが、忘れた。
159156:2007/02/11(日) 13:08:57
>>157
>>158
(int*)a とか試してもアドレスが表示されてしまったのでなかなか解決出来なかったのです。
なるほど。reinterpret_castをいちいち使わないとダメだったんですか。
がんばってみます。ありがとうございました。
160デフォルトの名無しさん:2007/02/11(日) 13:43:39
確かにそれだとアドレスが表示されるだろうな。
値を出したければ *(int*)a だろう。

つかこれはC言語の内容だ。
161156:2007/02/11(日) 15:01:37
>>160
ぉぉ、なるほど。
慣れないものですいません。ありがとうございました。
162デフォルトの名無しさん:2007/02/11(日) 20:01:21
boost::any使うと便利だよ
163デフォルトの名無しさん:2007/02/11(日) 20:11:57
*(int*)aと(int*)aを間違えるならまだ早いだろうさ。
164デフォルトの名無しさん:2007/02/12(月) 05:21:35
class hoge{
:
void operator[](size_t);
:
};
class foo{
:
hoge *sss;
:
};
(*(((foo*)&x)->sss))[val]

少なくともこれくらいパッと見で理解できないとね。
165デフォルトの名無しさん:2007/02/12(月) 05:35:06
(*static_cast<hoge *>(reinterpret_cast<foo *>(&x)->sss))[val] ;
(*(reinterpret_cast<foo *>(&x)->sss))[val] ;

うーむ、あまりわかりやすくはならんな。
166デフォルトの名無しさん:2007/02/12(月) 09:12:15
若いの オラが村では派遣労働の問題を口にしちゃなんねーだ
お前さんはまだわけぇから言いたいこともあるべぇ
だべな、派遣問題を口にするとバカにされたと思ってムキになって怒る者がおるでよぉ
てめぇでの責任で派遣やってる癖に派遣問題に触れると逆ギレするバカなんだけどよぉ
問題の指摘は駄目だっぺぇ
派遣のことは口にしちゃなんねぇ
この村みたいな民度ゼロの会社で現実忘れるためにはよ
北朝鮮とか宗教団体と一緒でよ、駄目のものを駄目と言ってはなんねえだべさ
タブーを口にしちゃいけねぇだ


167デフォルトの名無しさん:2007/02/12(月) 10:17:16
>>166
選挙前の活動ごくろうさん
168デフォルトの名無しさん:2007/02/12(月) 13:06:36
ねぇねぇ、久しぶりに来たんだけどさ、「まあヒントくらいにはなったな。うむご苦労。」とか、
「ダイナミックリンクしておいてサイズが増えない」とか書き込まれていたのはこのスレだっけ?
169デフォルトの名無しさん:2007/02/12(月) 13:35:04
大体でいいけど何時頃の話?
170デフォルトの名無しさん:2007/02/12(月) 13:37:59
>>168
STLスレじゃなかったっけ?
171デフォルトの名無しさん:2007/02/12(月) 13:39:45
>>168
2つ前のスレで「うむご苦労」が抜けて
一つ前のスレではSTLで実行ファイルサイズが増えるってところがHAGEに変わってた
172デフォルトの名無しさん:2007/02/12(月) 13:47:38
>>167
何の選挙なの?
173デフォルトの名無しさん:2007/02/12(月) 15:00:30
何だよHAGEってワロス
174デフォルトの名無しさん:2007/02/12(月) 15:17:47
#define HAGE struct
175デフォルトの名無しさん:2007/02/12(月) 15:22:54
>>164
hogeの[]を呼んでることは分かった。
176デフォルトの名無しさん:2007/02/12(月) 17:38:49
>>164,165
漏れには何がしたいのかがわからん
177デフォルトの名無しさん:2007/02/12(月) 17:46:05
式が何やってるか解釈できるかどうかの話だろう
その式の結果自体に意味は無い
178デフォルトの名無しさん:2007/02/12(月) 18:50:01
hoge & hoge_ref = *reinterpret_cast<foo *>(&x)->sss ;
hoge_ref[val] ;

これなら分かりやすいはず。
179デフォルトの名無しさん:2007/02/12(月) 21:38:37
派遣には人格的に首をかしげたくなる香具師が多い

特に駄目なのがいわゆる「裏切派遣」ね。
元々は正社員だったのに取引先にフリーのほうが稼げるとか騙されて、派遣やってるバカw
結局は自分で判断して自分の責任で派遣やってる癖に派遣問題の話が出るとウッキー!って逆ギレw

自分の会社を裏切り、結局派遣先からも騙されてる。
そもそも信頼されてるなら直接契約するか正社員にするはずだが、
馬鹿だから派遣にされて喜んでるんだよなw
180デフォルトの名無しさん:2007/02/12(月) 22:22:07
>>179
自称”フリーランス”はほとんどそれだね
181デフォルトの名無しさん:2007/02/12(月) 22:33:08
>>179
昔、当時勤めてた会社をやめた時に、大企業の取引先のお偉いさんから
ウチで働かないか?って誘われたことがあるけど、いまから思い返して
みれば誘いに乗ってればそーゆー結果になってたかもなぁ。その会社の
仕事ができる人間に対する扱いが恐ろしく酷いことは一緒に仕事してて
よく知ってたんで即お断りしたけど。
182デフォルトの名無しさん:2007/02/13(火) 00:20:14
あれ、C++スレだよなここ
183デフォルトの名無しさん:2007/02/13(火) 22:10:44
184デフォルトの名無しさん:2007/02/14(水) 00:05:18
>>181
>ウチで働かないか?って誘われたことがあるけど、
それが正社員なら信頼されてるが、派遣会社経由の偽装請負だったら人間として低く見られてる
「こいつはバカだから目先に金に飛びつくだろう」ってね
所詮派遣だからいらなくなったら切ればいいという考え
何年かたって裏切り派遣野郎が騙されたことに気づいても縁切りゃいいやとでも思ってるんだろ
185デフォルトの名無しさん:2007/02/14(水) 00:27:53
そんなひでぇ奴は刺されて良いと思うな(w
186デフォルトの名無しさん:2007/02/14(水) 00:44:25
画像処理 その8
http://pc10.2ch.net/test/read.cgi/tech/1168868527/
217
あたりでtemplateは使うと速度が遅くなるって話しがでてるのだけど
実際どうなの?
187デフォルトの名無しさん:2007/02/14(水) 00:49:31
>>183,>>186
そこまで必死にならんでも、しばらくすりゃまた元の状態に戻るからw
188デフォルトの名無しさん:2007/02/14(水) 00:52:28
トキかっこよすぎ
189デフォルトの名無しさん:2007/02/14(水) 00:53:28
俺は社員で働くのは体質的に無理だ
派遣がイイ。
190デフォルトの名無しさん:2007/02/14(水) 00:58:21
>>183
ところであのはてなのC++リングのアイコンはどーにかならんのか?
なんだよ、あの道化を逆さにしたようなアイコンは。
191デフォルトの名無しさん:2007/02/14(水) 01:30:00
>>186
間違いなく、コンパイル速度は遅くなる。
実行速度は使い方次第なので一概には言えない。
#そもそもコンパイルタイムに演算を済ませてしまうようなテンプレート関数なら、実行速度は最大なわけだが。
192デフォルトの名無しさん:2007/02/14(水) 09:04:11
>>189
つまり奴隷体質ということですね
193デフォルトの名無しさん:2007/02/14(水) 10:35:56
なにムキになってageてるんだろう
194デフォルトの名無しさん:2007/02/14(水) 10:37:36
うっせ、テンションたけーんだよクズ
195デフォルトの名無しさん:2007/02/14(水) 13:22:24
また変なの沸いちゃったなぁ
196デフォルトの名無しさん:2007/02/14(水) 15:49:05
>>183
のサイトみてるんだけど
本名でやってる人いないね

自分もやるとしたら偽名でやるのがいいのかな?
197デフォルトの名無しさん:2007/02/14(水) 16:24:57
>>196
個人的に知ってる子がいた。
もう結構な歳なのにまだ耳とか言ってるのか...
198デフォルトの名無しさん:2007/02/14(水) 17:07:40
>>197
ここはこういう人の集まりですから

魔法少女ポリモル
http://pc10.2ch.net/test/read.cgi/prog/1169812216/
199デフォルトの名無しさん:2007/02/14(水) 22:16:30
>>197
なんだっけ? 確か、殺した相手の耳を削いで集めるネトゲがあんだよね?
200デフォルトの名無しさん:2007/02/14(水) 23:07:43
きんもー
201デフォルトの名無しさん:2007/02/15(木) 00:33:06
耳塚?
202デフォルトの名無しさん:2007/02/15(木) 02:48:14
猫耳じゃないのか・・・
203デフォルトの名無しさん:2007/02/15(木) 03:21:14
>>202
猫、殺すの?
204デフォルトの名無しさん:2007/02/15(木) 03:45:33
猫を殺さば猫に喰わるる
205デフォルトの名無しさん:2007/02/15(木) 04:52:35
猫駆除
206デフォルトの名無しさん:2007/02/15(木) 09:37:15
通☆風☆性
207デフォルトの名無しさん:2007/02/15(木) 10:17:05
>>199
Diablo?
外人が「mimi chodai!」 とか言いながらPKしまくってたなw
208デフォルトの名無しさん:2007/02/15(木) 19:33:46
209デフォルトの名無しさん:2007/02/16(金) 14:08:03
>>208
そいつの講演むかし聞いたことある
一番印象に残った発言は
「無駄な苦労をしただけの人は評価しません」

210デフォルトの名無しさん:2007/02/16(金) 15:31:40
世の中上手く騙したほうが勝ちだからな
やりすぎて抹殺されることも多々あるが
211デフォルトの名無しさん:2007/02/16(金) 18:04:02
mainのなかで
newで割当てられるメモリーには上限があるのでしょうか?
コンパイルオプションなどで上限を増やすことはできないのでしょうか?
212デフォルトの名無しさん:2007/02/16(金) 18:07:07
環境依存スレへ
213デフォルトの名無しさん:2007/02/17(土) 13:19:11
/3GBスイッチで
合わせて最大3GBまで確保できる
214211:2007/02/17(土) 14:41:20
>>213すいませんLinuxのばやいはどうしたら言いのでしょうか?
215デフォルトの名無しさん:2007/02/17(土) 14:55:59
>>214
というか、どんなけメモリ確保したいんだよ。
パソコンに搭載されているメモリに近い量だとスラッシングが起きるでしょ。
一回のnewで大きなサイズの場合、そのサイズ以上の連続したアドレスがあいていないと無理。
Linuxのことは知らんけどそんなもんでしょ。
216デフォルトの名無しさん:2007/02/17(土) 15:07:47
217デフォルトの名無しさん:2007/02/17(土) 15:28:39
2つ以上のdll作ったとき、
やっぱベースアドレスかえてますか?
218デフォルトの名無しさん:2007/02/17(土) 15:45:39
219デフォルトの名無しさん:2007/02/17(土) 18:35:37
確保できるメモリ量の最大値はどうやればわかりますか?
220デフォルトの名無しさん:2007/02/17(土) 18:36:54
>>219
わかんねー
221デフォルトの名無しさん:2007/02/17(土) 18:43:41
>>219
WindowsならAdvanced Windowsあたりに書いてた気がする
まぁ、環境依存スレへどうぞ
222デフォルトの名無しさん:2007/02/17(土) 19:15:59
>>219

for(DWORD i=1;i++;i<=0xFFFFFFFF)
{
  try
  {
    int a=new int(0);
  }
  catch(...)
  {
    cout << i;
  }
}
223デフォルトの名無しさん:2007/02/17(土) 19:17:25
おお!
224デフォルトの名無しさん:2007/02/17(土) 21:09:06
Cランタイムライブラリを
スタティックリンク、ダイナミックリンクした場合
何かちがくなることはありますか?
225デフォルトの名無しさん:2007/02/17(土) 21:18:49
>>224 そりゃスタティックとダイナミックが違うに決まってる。
226デフォルトの名無しさん:2007/02/17(土) 21:22:15
CRTをスタティックリンクしてるdllとダイナミックリンクしてるdll
を呼び出す場合の違いについて教えてくださいませ
227デフォルトの名無しさん:2007/02/17(土) 21:23:56
>>226
もう明らかにスレ違い。 MSDN 嫁。
228デフォルトの名無しさん:2007/02/17(土) 21:32:58
コンストラクタの例外は、デストラクタが呼ばれないことからメモリリークの原因のひとつと言われます。
でも例えば以下のような場合などで、MyClassに適切なデストラクタを定義しておけば
(=後始末はメンバオブジェクト自身にやらせる)問題なしという認識でOKでしょうか?

class A{
public:
 MyClass m; // こいつのデストラクタは必ず呼ばれるので後始末も必ず実行される
 A(); // こいつが例外を投げる。
 ~A(); // こいつは呼ばれない。
};




229デフォルトの名無しさん:2007/02/17(土) 21:41:11
>>228
そう。メモリリークの原因とか言ってるやつは例外処理について
まともに調べもせずに言語のせいにして喚いてるだけ。
230デフォルトの名無しさん:2007/02/17(土) 21:42:15
コンストラクタで何してるかによるんじゃ???
231デフォルトの名無しさん:2007/02/17(土) 21:50:50
>>229
かわいそうに。嫌な経験がおありのようですね。

このサイトで、癒されます
http://www.geekpage.jp/blog/?id=2007/1/4
232228:2007/02/17(土) 21:51:04
>>229
お返事ありがとうございます。納得致しました。

>>230
ええ、もちろんそうなのですが
A::A(){
 m.Init();
 ThrowExceptionFunc();
}
などと余計なことをしなければ、後始末の役目をMyClassだけに押し付けることができて、
Aのデストラクタが呼ばれないなんて心配する必要ないじゃんと思った次第なのです。
233デフォルトの名無しさん:2007/02/17(土) 22:24:19
言い回しは怪しいが、だいたいそんな感じ。
例外が投げられた時点で構築が完了した(コンストラクタが完了した)
オブジェクトは、対応するデストラクタが呼ばれる。
234デフォルトの名無しさん:2007/02/17(土) 23:21:31
MyClassはfriendにしたほうがいいんじゃね?
235デフォルトの名無しさん:2007/02/17(土) 23:35:34
>>234 んなわけない。つーか、これだけの情報でよくそんなこと言えるな。
236デフォルトの名無しさん:2007/02/17(土) 23:43:46
んんーー?
だってMyClassからAの開放するんでしょ?
Aのprivateメンバに触れたほうが良いじゃん

237デフォルトの名無しさん:2007/02/17(土) 23:45:39
>>236 だれもそんなこと言ってない。電波でも受信したか?
238デフォルトの名無しさん:2007/02/17(土) 23:47:23
うん。
239デフォルトの名無しさん:2007/02/17(土) 23:51:48
後始末処理が
Aコンストラクタのcatch内にかかれるか、
MyClassにかかれるかだけの違いに見えるが
240デフォルトの名無しさん:2007/02/17(土) 23:55:49
>>239
A のコンストラクタに後始末を書く場合、当然 A のデストラクタにも書くわけで、
コードが重複することになる。
241デフォルトの名無しさん:2007/02/17(土) 23:59:38
あらまぁ
242デフォルトの名無しさん:2007/02/18(日) 05:15:06
RAII
243デフォルトの名無しさん:2007/02/18(日) 07:37:23
雑誌でコンストラクタから例外を投げるなと書いてた人がいたね。
初期化関数を作って初期化で投げろと。w
244デフォルトの名無しさん:2007/02/18(日) 13:07:45
それは一番無難だけど、
少し冗長だなーーー
245デフォルトの名無しさん:2007/02/18(日) 13:22:30
>>244
初期化呼び忘れや二重初期化の危険性を持ち込むことのどこか無難か。
246デフォルトの名無しさん:2007/02/18(日) 13:28:15
そこでテンプレートパターンですよ
247デフォルトの名無しさん:2007/02/18(日) 13:31:33
>>246
テンプレートメソッドパターンのことかな?
それって普通にコンストラクタで初期化するのに比べて何がうれしいの?
248デフォルトの名無しさん:2007/02/18(日) 13:43:09
コンストラクタで例外投げるのって、不変条件を
必ず満たすために使うのがほとんどなんでないの?
初期化関数作るやり方で代用出来るの?
249デフォルトの名無しさん:2007/02/18(日) 13:44:23
白根ーーよ!!!!
250デフォルトの名無しさん:2007/02/18(日) 21:19:33
これか
>コンストラクタ内で例外を起こす
>深刻度:★★★ - 重い深刻度
>
>[症状]
>コンストラクタで処理が完結せず,デストラクタが呼ばれないため,資源の解放忘れやメモリリークを引き起こし,その結果で引き起こされるバグに悩まされます。
>
>[原因]
>コンストラクタ内の例外の問題点を把握していないためです。
>
http://www.cmagazine.jp/src/kinjite/cpp/exception.html
251デフォルトの名無しさん:2007/02/18(日) 21:24:05
std::fstreamでもファイルノットファウンドで例外が飛んでくるし
252デフォルトの名無しさん:2007/02/18(日) 21:35:16
>>248
プログラマががんばれば代用できるというレベル。バグの温床かと。

>>250
紙面でも読んだ覚えがあるが、これはひどい。
253デフォルトの名無しさん:2007/02/18(日) 21:44:30
>>251
コンストラクタでは例外飛ばないよ。
254デフォルトの名無しさん:2007/02/18(日) 22:47:11
コンストラクタ・例外・初期化関数についての例題を書いてみた。

ある資源を3つのクラスで管理する。
クラスA、B、Cは、コンストラクタが例外を投げ得る構成を用いる。
クラスD、E、Fは、コンストラクタは例外を投げず、初期化関数を用いる。
どのクラスのデストラクタも例外を投げないものとする。

class A { int* p; public: A(); ~A(); };
class B { A a; public: B(); ~B(); };
class C { A a; B b; public: C(); ~C(); };
A::A() : p(new int(0)) {}
B::B() : a() {}

class D { int* p; public: D(); ~D(); void init(); };
class E { D d; public: E(); ~E(); void init(); };
class F { D d; E e; public: F(); ~F(); void init(); };
D::D() : p(0) {}
void D::init() { p = new int(0); }
E::E() : d() {}
void E::init() { d.init(); }

このとき、資源漏れのないC::C()とF::init()を定義し、両者を比較せよ。
なお、D、E、Fには必要に応じてメンバ関数を追加してもよい。
255デフォルトの名無しさん:2007/02/19(月) 00:08:27
コンストラクタじゃなくて、初期化子で初期化しているときに例外を投げた場合て
どうなるんだっけ?
256デフォルトの名無しさん:2007/02/19(月) 00:44:17
既に初期化が済んだオブジェクトについてはそのデストラクタが呼ばれる。
まだコンストラクタが完了していないオブジェクトについてはデストラクタも呼ばれない。
257デフォルトの名無しさん:2007/02/19(月) 00:52:03
>256
確か、初期化子だと逐次初期化を完了させていくんだったよね?
例外によるリークは発生しないということでいいのかな?
258デフォルトの名無しさん:2007/02/19(月) 02:58:56
コンストラクタから例外だしてもいいと思うけどなぁ
ただ、その例外出すって設計がいいとは思わないけど。
RAIIを必ず使ってれば、メモリーリークは防げるし。
259デフォルトの名無しさん:2007/02/19(月) 07:42:30
>>257
初期化子を使うかどうかは関係ない。
260デフォルトの名無しさん:2007/02/19(月) 09:49:21
class Hoge
{
public:
  Hoge() p(new int), q(new int) {}
  ~Hoge() {delete p; delete q;}
private:
  int* p, q;
};
こういうときqの初期化のnewがbad_allocを投げたらpのメモリはリークする。
pとqが何らかのスマートポインタなら、そのデストラクタが働くのでpのリークは心配いらなくなる。
261デフォルトの名無しさん:2007/02/19(月) 15:21:35
qがintのポインタになってない、という突っ込みはやめておこう。
262デフォルトの名無しさん:2007/02/19(月) 15:51:29
突っ込んでるやんかと思ったけど、そんな突っ込みもやめておこう。
263デフォルトの名無しさん:2007/02/19(月) 16:15:18
まったくここはハッテン場なスレですね
264デフォルトの名無しさん:2007/02/19(月) 17:05:06
う〜、トイレトイレ
265デフォルトの名無しさん:2007/02/19(月) 19:22:28
用はauto_ptrだのRAIIつかえって話でしょ?
似たような話が例外処理スレに上がってる
266デフォルトの名無しさん:2007/02/19(月) 22:46:21
なるほど、こうすりゃ良いのね。

class Hoge
{
public:
  Hoge() p(new int), q(new int) {}
  ~Hoge() {}
private:
  boost::shared_ptr<int> p, q;
};
267デフォルトの名無しさん:2007/02/20(火) 00:18:53
それだけならscoped_ptrで十分だと思う。
必要ならshared_ptrにすべきだが。
268デフォルトの名無しさん:2007/02/20(火) 02:47:41
クラスのデストラクタをvirtualにするのとしないのとでは派生したときにどのように動作が違いますか?
269デフォルトの名無しさん:2007/02/20(火) 03:00:39
>>268
virtual 付けると動的な型に基づいてデストラクタが呼ばれる。
他のメンバ関数と同じ。
270デフォルトの名無しさん:2007/02/20(火) 08:54:36
>>268
確かこんなこと

class B : pubic A { 略 };

A * pa = new B;
delete pa;

A::~AがvirtualならB::~Bが呼ばれる。
そうでなければA::~Aが呼ばれB::~B呼ばれない。
271デフォルトの名無しさん:2007/02/20(火) 12:01:25
>>270
そこでboost::shared_ptrですよ
272デフォルトの名無しさん:2007/02/20(火) 13:16:35
あれ、目から汗が・・・。
273デフォルトの名無しさん:2007/02/20(火) 15:23:15
双子素数を求めるプログラムを作ってみたんですけどどこか改善点などあれば教えてください。
#include<iostream>

using namespace std;

const int MAX_NUMBER = 2000; //保存できる素数の数

int sosu[MAX_NUMBER]; //この配列に素数を保存
int main(){
int num=0; //見つけた素数の総数 初期値は0
int i,j,route;
int judge; //素数のとき1,素数でないとき0とする
int k=0,h=0;
sosu[num] = 0; //素数の初期化
for(i=2;i<=10000;i++) //1をとばして2から素数判定を始める {
/*エラトステネスのふるい*/
for(route=1;route*route<=i;route++); //iの平方根より大きい自然数で、最も小さいものを求める
for(j=0,judge=1;sosu[j]!=0 && sosu[j]<route;j++)//iの平方根より小さい素数で割り切れるものが無いとき、iは素数 {
if(i % sosu[j] == 0){ //何らかの素数で割り切れたとき、その数は素数でないので終了
judge = 0; //素数でないので0にする
break; } } if(judge){
sosu[num] = i; //新しく見つけた素数の保存
num++; //見つけた素数の数を1増やす
sosu[num] = 0; //保存されている素数配列の終わりが分かるように、配列の最後を0にしておく } }
while(sosu[k+1]){ //求めた素数のうち双子素数を表示
if(sosu[k+1] - sosu[k] == 2){ //連続する二つの素数の差が2なら双子素数なので表示
cout << "(" << sosu[k] << "," << sosu[k+1] << ")" << " ";
h++; //一つの組を表示するたびにカウンタhを1増やす } if(h == 6){ //1行に6つの組が表示されたら改行
cout << endl;
h = 0; //カウンタ初期化
} k++; } cout << endl; return 0;}
274デフォルトの名無しさん:2007/02/20(火) 15:29:02
>>273
全ての素数を見つけてから双子を探すのではなく、双子素数を最初から探せば?
双子素数候補は(2,3,5以外は)必ず6n±1の形をしているのだし。
275デフォルトの名無しさん :2007/02/20(火) 16:39:33
こんにちは。

windows.hをインクルードしたC++ソースファイルをLinuxでコンパイルしたいんですけど,
何か方法ありませんか?
HDCとHBITMAPが曲者でした。この二つがLinuxで使えるようにできる方法があれば、どうぞ教えてくださいませ。
276デフォルトの名無しさん:2007/02/20(火) 17:04:03
>>275
個別環境スレへどうぞ。
#まぁ無理だけど。
277デフォルトの名無しさん:2007/02/20(火) 17:07:30
g++のクロスコンパイラでexeを作ったあと
wineで実行するとかw
278デフォルトの名無しさん:2007/02/20(火) 17:09:48
VC 2005で気の迷いからstlを使ってみようと思ったのですが,
しょっぱなからつまずいてしまいました.

map<Key,T>::end ()がiteratorを返すend ()かconst_iteratorを返すend () constか
判断できないと言うのです.コンパイラが.
普通こうした時にはキャストで(map<Key,T>::iterator)とか入れてやると
通りそうなものですが,やっぱり判らんと言い続けます.
const_iteratorにしても同じです.

何が不味いんでしょうか?
279デフォルトの名無しさん:2007/02/20(火) 17:36:47
とりあえずソース。
280278:2007/02/20(火) 18:22:56
具体的には宣言が

class IStereo {
public:
typedef std::map<int, IStereo *> Map;
static Map ourMap;
static Map & getMap (void) { return ourMap; }


使っている所が

{
IStereo::Map::iterator & theIterator = IStereo::getMap ().find (wUserID);
if (theIterator == IStereo::Map::end ())

で,このendがキャストしたりしても判らんと.
281デフォルトの名無しさん:2007/02/20(火) 18:25:55
endは静的メンバでないので、IStereo::getMap().end();
282デフォルトの名無しさん:2007/02/20(火) 23:02:24
気のせいか、、boost::shared_ptr
はC++プログラマを甘やかしてないか?
お前ら初心を忘れるなよ!!!!!
283デフォルトの名無しさん:2007/02/21(水) 01:19:14
心配すんな。ちゃんと循環参照してるぜ
284デフォルトの名無しさん:2007/02/21(水) 01:44:20
>>282
馬鹿でしょ
より完成度の高いもの作るんだったらshared_ptrなり使うわ。
例外処理の話でRAIIの重要性わかんないの?、、
285デフォルトの名無しさん:2007/02/21(水) 02:18:40
何怒ってんだ??
生理?
286デフォルトの名無しさん:2007/02/21(水) 04:01:36
お前ら初心を忘れるなよ!!!!!
287デフォルトの名無しさん:2007/02/21(水) 18:49:38
lispの勉強するとc++のスキルもあがるというのは本当でしょうか?
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
288デフォルトの名無しさん:2007/02/21(水) 19:20:35
げ、ハッカーと画家じゃん やだなぁ
289デフォルトの名無しさん:2007/02/22(木) 08:14:32
ブール型配列 f の要素すべてを true/false に設定したいのですが

bool f[100];
memset(f,true,sizeof(f)); // 要素すべてをtrueにする
memset(f,false,sizeof(f)); // 要素すべてをfalseにする

このように書いても問題ないでしょうか?
よろしくおねがいします
290デフォルトの名無しさん:2007/02/22(木) 08:17:00
>>289
OK.
291デフォルトの名無しさん:2007/02/22(木) 08:20:28
>>290
289です
290さん、ありがとうございます
292デフォルトの名無しさん:2007/02/22(木) 08:37:41
こらこら。
293デフォルトの名無しさん:2007/02/22(木) 08:48:13
memsetってなんで埋めの値がintなの?
1バイトずつ埋めずに、4バイト一気にやるわけ?
全配列をtrueにするには0xffffを渡さないと駄目なの?
294デフォルトの名無しさん:2007/02/22(木) 08:50:01
0xffffffffだった
295デフォルトの名無しさん:2007/02/22(木) 10:29:04
>>293
過去との互換性を維持するため、引き数にintより小さい型は使えなかったから。
そもそもtrueは1だし、boolがint幅あるかどうかは処理系依存じゃないのか?
296デフォルトの名無しさん:2007/02/22(木) 11:23:27
うるさいうるさいうるさい!!!
297デフォルトの名無しさん:2007/02/22(木) 11:25:25
>>289
ダメ。 std::fill() 使え。
298デフォルトの名無しさん:2007/02/22(木) 13:05:16
>>293-294
memset() の埋めに渡した int は unsigned char にキャストされて使われる。
0xffff でも 0xffffffff でもあまり変わらない。
299デフォルトの名無しさん:2007/02/22(木) 13:25:12
bool b[100];
for (int i = 0; i < sizeof b / sizeof b[0]; i++) b[i] = true;
300デフォルトの名無しさん:2007/02/22(木) 13:48:09
>>299
>297
301デフォルトの名無しさん:2007/02/22(木) 13:53:28
何で駄目なんですか
sizeof bはきっちり100を返すので問題ないと思うのですが
302デフォルトの名無しさん:2007/02/22(木) 13:55:27
std::fill()の方がコード読みやすいじゃない。
303デフォルトの名無しさん:2007/02/22(木) 14:00:28
bool型のサイズは1byteと決まっているわけではなかったような。
1byteでないならば、trueをセットするならstd::fill()でないと
駄目でしょ。
304デフォルトの名無しさん:2007/02/22(木) 14:17:38
なるほど。。
305デフォルトの名無しさん:2007/02/22(木) 15:41:12
ifstream の get() と read() ってどう違うの?
306デフォルトの名無しさん:2007/02/22(木) 15:44:46
getが文字・文字列読み込みということで、
ポインタを引数に取る奴は、そのポインタが指す配列の最後に'\0'を置いていく。
readはバイナリ読み込みということでそれがない。
307デフォルトの名無しさん:2007/02/22(木) 16:03:19
>>306
そうかー、ありがとう。
VC のヘルプをよんでもよくわからんかった。
308デフォルトの名無しさん:2007/02/22(木) 16:21:20
本物のプログラマはバイナリモードしか使わない
309デフォルトの名無しさん:2007/02/22(木) 16:30:42
>>308
なんで?そんなことないと思うぞ。
310デフォルトの名無しさん:2007/02/22(木) 16:45:23
「本物のプログラマは〜」
でググれ
311デフォルトの名無しさん:2007/02/22(木) 16:49:24
>>310
いっぱい出てくるけど、どのページを言ってるの?
312デフォルトの名無しさん:2007/02/22(木) 16:52:11
313デフォルトの名無しさん:2007/02/22(木) 17:00:05
一番有名なのは
http://www.genpaku.org/realprogrammerj.html
だろ。無論ジョーク文書だけどな。
314デフォルトの名無しさん:2007/02/22(木) 17:24:36
「コロ助はゲイなのかい?」
「バイナリ。」
315デフォルトの名無しさん:2007/02/22(木) 17:26:57
誰がうまくないこと言えと
316デフォルトの名無しさん:2007/02/22(木) 17:27:26
>>314
ゴルァ、吹いたじゃねぇか。

なんでこんなのでツボに嵌るんだか orz
317デフォルトの名無しさん:2007/02/22(木) 17:59:35
>>314
おもしろいコピペがあったら貼るスレinマ板part2
http://pc10.2ch.net/test/read.cgi/prog/1171495991/
318デフォルトの名無しさん:2007/02/22(木) 20:41:48
>本物のプログラマは、やるべきことをユーザーよりよく知っている。


同意
319デフォルトの名無しさん:2007/02/22(木) 20:46:21
フィクションとかでもそうだなぁ。
受け手が偉そうに「こうしろ」といっていたことを作り手がその通りにすると、
そこで初めて、それが大したものでないことや、他に弊害が出るものであることがわかる。

その時受け手が何をするかというと、それを要求していたという事実を無かったことにして、
また新たな素材を選び直して「俺の言う通りにしておけば良かったのに」の言い直しを始めるw
320デフォルトの名無しさん:2007/02/22(木) 20:54:21
フィンランド語でおk
321デフォルトの名無しさん:2007/02/22(木) 21:05:47
普通に日本語として読めるし意味も通じるだろとマジレス
322デフォルトの名無しさん:2007/02/22(木) 21:24:53
なんとなくだが、>>320
「アーアー聞こえな〜い(AA略)」 の新しいバージョンかとオモタ
323デフォルトの名無しさん:2007/02/22(木) 21:47:03
classのメンバ変数として、char *p;(可変長のため動的確保)などを持っているclass Xを考えていて、
p[pos]からp[pos+size]を取り出す、X X::get(int pos,int size)のようなものを作りたいのですが、
X X::get(int pos,int size)
{
 X ret();
 <ret.pを動的に確保してコピー>
 return ret;
}
として、X a,b; a=b.get(pos,size); のような使い方は出来ないのでしょうか?
(上の式のようにするとreturnの前にデストラクタが呼び出されて値が壊れるようなのですが・・・)
324デフォルトの名無しさん:2007/02/22(木) 21:51:19
Xにコピーコンストラクタはあるか?
325デフォルトの名無しさん:2007/02/22(木) 22:03:22
コピーコンストラクタとoperator =は両方作って見たのですが、
a=b.get(pos,size);の時点でbのメンバ変数が壊れているようです・・・。
326デフォルトの名無しさん:2007/02/22(木) 22:09:24
コピーコンストラクタをよくよく見ていたら、それ自体が間違っていました;;
修正したらきちんと動くようになりました、、どうもありがとうございます^^
327デフォルトの名無しさん:2007/02/22(木) 22:34:33
そういえば禿ってフィンランド出身だったっけ?
328デフォルトの名無しさん:2007/02/22(木) 23:12:19
329デフォルトの名無しさん:2007/02/22(木) 23:21:21
>>328
そか。じゃぁ、>>320みたいなのは「デンマーク語でおk」にすべきだな。
330デフォルトの名無しさん:2007/02/23(金) 02:00:53
えーと、リナックスの人と間違えました
331デフォルトの名無しさん:2007/02/23(金) 14:23:16
>>330
おまえなんかハンガリーにいっちまえ
332デフォルトの名無しさん:2007/02/23(金) 15:48:05
お前ら地球から出てけよ
333デフォルトの名無しさん:2007/02/23(金) 16:20:48
そうだ、火星いこう。
334デフォルトの名無しさん:2007/02/23(金) 19:53:06
Dならいいけど、計数火星C++はヘタレだからやだ。
335デフォルトの名無しさん:2007/02/23(金) 21:28:28
>>331

なぜかハンガリー語ならしゃべれます
336デフォルトの名無しさん:2007/02/23(金) 22:56:11
ハンガリアンというオチか
337デフォルトの名無しさん:2007/02/23(金) 22:59:23
アーユーハングリー?
338デフォルトの名無しさん:2007/02/23(金) 23:17:34
イエス!!!!カップヌーーードル!
339デフォルトの名無しさん:2007/02/24(土) 02:50:05
OK、買ってくる
340デフォルトの名無しさん:2007/02/24(土) 08:14:55
ノオオオオボオオオオオダアアアアアアアアアアア!!!!!!!!!
341デフォルトの名無しさん:2007/02/24(土) 12:52:51
カップヌードルクリーミーチキンうめぇwww
342デフォルトの名無しさん:2007/02/24(土) 13:11:12
注:私の有意義な発言に対し、自分のカップヌードルを棚に上げ煽り、1行カップヌードル
で返す方が多いようですが、そのような方はスレの皆様をカップヌードルさせるだけでなく
カップヌードルの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者にカップヌードルを披露する場を与える貴重な存在なので、
カップヌードルを見下した回答、あまりにもカップヌードルを欠いた回答も厳重にカップヌードルいたします。
忙しい中、少ない時間の合間を縫ってカップヌードルしに来てるわけですので、
その辺ご承知下さい。なお、当方がカップヌードルに対して有意義なカップヌードルであると
判断した方にはカップヌードル価いたしますので各自よく調べ、よく考え正確なカップヌードルをするように。
343デフォルトの名無しさん:2007/02/24(土) 13:26:42






344デフォルトの名無しさん:2007/02/25(日) 02:59:49
>>341
あれ糞マズイ
345デフォルトの名無しさん:2007/02/25(日) 03:36:28
enum e味 { ノーマル, カレー, シーフード, クリーミーチキン, ミソ }; // 後忘れた
enum e感想 [ 神、いわゆるゴッド, ウマー, おk, 普通にダメー, 糞マズイ };

typedef カップ麺
{
 名前
 味
 感想
}カップヌードル;
346デフォルトの名無しさん:2007/02/25(日) 10:01:40
 名前
 妹
 感想
}   ヌード;

こうみえた。もうだめ
347デフォルトの名無しさん:2007/02/25(日) 13:42:47
e味とかe感想とか、e電みたいだなwww
348デフォルトの名無しさん:2007/02/28(水) 20:11:29
ソースの末尾(EOF)は改行で終わらなければならない

という謎仕様はどういう経緯で策定されたんでしょうか
歴史的理由?

//OK
int hoge;
[EOF]

//NG
int hoge;[EOF]
349デフォルトの名無しさん:2007/02/28(水) 23:54:52
>>348
プリプロセッサの文法要素がすべて改行を終端としているので、
厳密には改行がないとパースに失敗することになるからだと思われ。

規格の A.14 に文法の定義がある。
350デフォルトの名無しさん:2007/03/01(木) 00:31:26
>>348
diffとかpatchとか行指向なツールで、
最終行に改行が「無い」事を表現するゴミ情報が必要になって、
さらにゴミ情報の後方互換性とか出てきてウザいから。
351デフォルトの名無しさん:2007/03/01(木) 05:03:06
viは改行を入れてくれるしemacsも警告出たような。
でも、ツール云々はスレ違い。
352デフォルトの名無しさん:2007/03/01(木) 09:41:01
計算式が異なる3つのクラス(hoge_1〜3)をtemplate等を使い、1つのクラス宣言に
する方法はありませんか?

class hoge_1 {
BYTE hoge_data ;
WORD calc_data ;
public:
void hoge_calc(BYTE add){
calc_data = (((WORD)hoge_data + add) / 10) ;
}
} ;

class hoge_2 {
WORD hoge_data ;
WORD calc_data ;
public:
void hoge_calc(WORD add){
calc_data = (((DWORD)hoge_data + add) * 10) ;
}
} ;

class hoge_3 {
WORD hoge_data ;
WORD calc_data ;
public:
void hoge_calc(WORD add){
calc_data = (((DWORD)hoge_data + add) * 120 / 100) ;
}
} ;
353352:2007/03/01(木) 09:41:38
また、hoge_mergeのdata_1〜3をインデックス番号で呼び出す方法も教えて欲しいです。
例:
class hoge_merge {
public:
hoge_1 data_1 ;
hoge_2 data_2 ;
hoge_3 data_3 ;
} ;
hoge_merge merge_data ;
switch( no ){
case 0: merge_data.data_1.hoge_calc(add_val) ; break ;
case 1: merge_data.data_2.hoge_calc(add_val) ; break ;
case 2: merge_data.data_3.hoge_calc(add_val) ; break ;
}
では無くて、イメージとしては
merge_data[no].hoge_calc(add_val) ;
のような呼び出しイメージです。

良い方法をご存知の方がおりましたら、よろしくお願いします。
354デフォルトの名無しさん:2007/03/01(木) 10:00:04
>>352
Boost.Anyで使われているような、Type Eresureのテクニックを使えばできるけど。
boost/any.hppを読んでみれば分かる。物凄く単純だから。
355デフォルトの名無しさん:2007/03/01(木) 10:02:22
ごめん、みっつとも入れたいのか。
tupleでも使えば。
356352:2007/03/01(木) 10:18:06
>>355
アドバイスありがとう御座います。
タプルを調べてみます。
357デフォルトの名無しさん:2007/03/01(木) 10:19:01
>>353は単にoperator[]
358352:2007/03/01(木) 14:10:50
>>357
ご指摘ありがとう御座います。
operator[]で考えて見たのですが、私の理解不足で戻り値を何にすれば
よいか解りませんでした。
xxxx operator[](int no){
switch(no){
case 0: data_1 ; break ;
case 1: data_2 ; break ;
case 2: data_3 ; break ;
}
};
data_1〜3のクラスは、hoge_1〜3と別のクラスになっていて
operator宣言で戻り値(xxxxの部分)を何にすればよいか、わかりません。
ご教授頂けるとありがたいです。
359デフォルトの名無しさん:2007/03/01(木) 14:22:14
>>357が何を意図していたのか分からないけれど、
その一連のhogeクラスとやらが変更できるならば、
class hoge_base
{
public :
  virtual ~hoge_base() {}
  virtual hoge_calc(WORD) = 0 ;
} ;

class hoge_1 : public hoge_base ;
class hoge_2 : public hoge_base ;
class hoge_3 : public hoge_base ;

hoge_base & operator[](int n)
{ return /*適当なオブジェクトを返す*/ ; }
360352:2007/03/01(木) 15:19:59
>>359
ありがとう御座いました。
operator[]が思った通りに動くようになりました。
クラス宣言をうまく1つにまとめる事が出来なかったとしても
operator[]で半分は満足出来ます。
あとは、タプルを攻略してみます。
361デフォルトの名無しさん:2007/03/07(水) 22:59:30
久しぶりにJavaを書いたらデストラクタが無かった
これどうすんだっけ?
362デフォルトの名無しさん:2007/03/07(水) 23:11:59
>>361
(#^ω^)ピキピキ ここはC++のスレだお。
363デフォルトの名無しさん:2007/03/07(水) 23:14:08
すみません

最近レスが少なかったからつい・・・
364デフォルトの名無しさん:2007/03/08(木) 00:35:59
そういう話はこっちでやれ
http://pc11.2ch.net/test/read.cgi/tech/1172317252/l50
365デフォルトの名無しさん:2007/03/08(木) 08:28:17
寧ろ逆じゃね?
366デフォルトの名無しさん:2007/03/08(木) 09:50:25
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3aScheme%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e3%81%ae%e3%83%ac%e3%83%99%e3%83%ab10
>ループを書くのにnamed letを自然に使うようになる。 C言語でもつい再帰で書いてしまうようになる。何故forループがあんなに欲しかったのかわからない
ループを再帰で書いても処理速度が落ちるだけなきがするんですが
どうなのでしょうか?
再帰のループはコンパイラが自動でベクトル演算化しないですよね?
367デフォルトの名無しさん:2007/03/08(木) 09:56:26
スレ違い。
368デフォルトの名無しさん:2007/03/08(木) 10:27:21
Schemeでは末尾再帰をループにする最適化を行うことが必須となっていたはず。
そこらへんのC/C++コンパイラでも最適化を指定すれば末尾再帰くらいはループにする。

最近のコンパイラならSchemeやその他Lisp処理系、C/C++どれでも
最適化として末尾でない再帰だってループに展開する。
369デフォルトの名無しさん:2007/03/08(木) 11:00:53
値を返す前にデストラクタを実行する必要がある関数だと
見かけ上末尾再帰でも、再帰呼び出しが末尾処理にならなそう。
RAIIとは食べあわせが悪いのかも。
370デフォルトの名無しさん:2007/03/12(月) 03:44:51
News 2007-03-11: The C++ Standard Library Issues List (Revision 47) is available
http://www.open-std.org/jtc1/sc22/wg21/
371デフォルトの名無しさん:2007/03/12(月) 20:34:05
すごくどうでもいい質問なんだけど、>>4のC++Primerが3rdEd.になってるけど4thよりこっちのがいいの?
372デフォルトの名無しさん:2007/03/14(水) 12:52:43
News 2007-03-14: The 2007-03-pre-Oxford mailing is available (4900 kb tar.gz, .zip 4900 kb) individual papers
News 2007-03-14: C++ Standard Core Language Issues List (Revision 46) is available, also committee version
http://www.open-std.org/jtc1/sc22/wg21/
373デフォルトの名無しさん:2007/03/14(水) 22:28:41
インターフェースと実装を分離する定石を使いながら
↓のようにイテレータを扱いたいのですが、良い方法はないでしょうか?

// インターフェース
class X {};

class Y {
 virtual X* operator[](size_t index) = 0;
 virtual iterator begin(void) = 0; // ←XimplやYimplの実装を隠しながら
 virtual iterator end(void) = 0; // このiterator型をどうにか定義できないか?
 static Y* create(void); // iteratorのdereference演算の返り値はX*型。
};

// 実装
class Ximpl : public X {};

class Yimpl : public Y {
 Ximpl* operator[](size_t index) { return array_[index]; }
 iterator begin(void) { return array_.begin(); }
 iterator end(void) { return array_.end(); }
 vector<Ximpl*> array_;
};

Yimpl* Y::create(void) { return new Yimpl; }

ここまで
374デフォルトの名無しさん:2007/03/14(水) 22:57:48
そのYなら、ついでに virtual size_t size()const=0も追加して、
iteratorはY*とsize_t indexを持つようにすれば?
375デフォルトの名無しさん:2007/03/14(水) 23:13:31
そこでany_iterator
というより俺だったら、とりあえず何も考えずにイテレータもXやYのように
インタフェースを公開するクラスとそれを継承して実装するクラスに分ける。
376373:2007/03/14(水) 23:31:19
>>374-375
どうもです。↓こんな感じ?(なんだか大袈裟な気が…)

// インターフェース
class iterator {
public:
 iterator(void);
 iterator(const iterator& ite);
 ~iterator();
 X* operator*(void) const;
 iterator& operator++(void);
private:
 class iterator_impl;
 iterator_impl* impl_;
};

377373:2007/03/14(水) 23:32:13
(つづき)
// 実装
iterator::iterator(void) : impl_(new iterator_impl) {}
iterator::iterator(const iterator& ite) : impl_(new iterator_impl(ite.impl_)) {}
iterator::~iterator() { delete impl_; }
X* iterator::operator*(void) const { return impl_->operator*(); }
iterator& iterator::operator++(void) { impl_->operator++(); return this; }

class iterator::iterator_impl {
public:
 iterator_impl(void) {}
 iterator_impl(const iterator_impl* impl) : ite_(impl->ite_) {}
 iterator_impl(vector<Ximpl*>::const_iterator ite) : ite_(ite) {}
 Ximpl* operator*(void) const { return *ite_; }
 void operator++(void) { ++ite_; }
private:
 vector<Ximpl*>::const_iterator ite_;
};

ここまで
378デフォルトの名無しさん:2007/03/15(木) 00:00:31
>>376
イテレータを表すクラスなら是非ともstd::iteratorを親に持っておけ。
379デフォルトの名無しさん:2007/03/15(木) 00:01:16
親に持つって、ようするに継承しろよということ。
380373:2007/03/15(木) 00:20:13
>>378
あい。あるいはboost::iterator_adaptorを使えば
少しは楽できるでしょうか?

それから、こういう方針をとっておいて言うのもなんですが、
イテレータを作るたびにnewして、インクリメントやdereferenceも
pimplポインタ経由というコストの掛かるやりかたというのは
イテレータ的にありなんでしょうか…。
381デフォルトの名無しさん:2007/03/15(木) 00:51:28
>>380
基本的に iterator に対して cheap to copy を仮定していることが多いですし,また
(今,仮に373のようなことがやりたいことだと仮定して) 373のような increment などが
非常に軽い演算だと型の情報を消去するコストは看過できないと思います.

効率とのバランスを考慮するなら374さんの案だと思いますし,自分も373ならそうします.

class Y{
class iterator
  : public boost::iterator_adaptor< iterator, size_t, X* >
{
private:
  friend class boost::iterator_core_access;
public:
  iterator() : iterator_adaptor_(), p_(){}
  iterator(Y* p, size_t i) : iterator_adaptor_(i), p_( p ){}
private:
  reference dereference() const{ return (*p_)[base_reference()]; }
  Y* p_;
};
};

iterator のような機能と実装の隠蔽を両立したいときに
非負整数による indexing を使うのは比較的よくあるパタンかと.
382デフォルトの名無しさん:2007/03/15(木) 01:36:34
メンバ関数へのポインタの取り方について質問させてください。

下のようなクラスMultipleがあったときにメンバ関数 int Mul(int n)
へのポインタをとるにはどうすればよいでしょうか?
引数の型が異なる同名の関数はどうやって指定すればよいのか?
というのが質問の意図です。

ポインタの使い道としてはstd::mem_fun_refの引数に与えることを考えています。
よろしくお願いします。


class Multiple {
public:
Multiple(size_t size) : size_(size){}

int Mul(int n) {return size_ * n;}

std::string Mul(const std::string& str) {
std::string ret(str);
for (size_t i = 1; i < size_; ++i)
ret = ret + str;
return ret;
}
private:
size_t size_;
};
383デフォルトの名無しさん:2007/03/15(木) 01:52:13
static int Mul(int n) {return size_ * n;}
384373:2007/03/15(木) 01:53:24
>>381
どうもありがとうございます。
実装を隠すというのはどうしてもコストが掛かるんですね…。
374, 381の方法だとインデクシングという手法が外に見えると。
この辺が落としどころかなぁ。

# ちなみに381でiterator_adaptorを使っているのは
# 単に個々の演算の定義の省力化のためでしょうか??
385デフォルトの名無しさん:2007/03/15(木) 08:29:33
>>382
基本的に代入したり実引数として渡す場合は、その型に合うものと推定されるが、
キャスト演算でもそれを強制的に行わせることができる。
static_cast<int (Multiple::*)(int)>(&Multple::Mul)
386デフォルトの名無しさん:2007/03/15(木) 08:33:49
>>382
メンバ関数ポインタはそれぞれ別の型になるから、
&Multiple::Mul を渡せば、コンパイラが適切に判断してくれるよ。
渡された先では int (Multiple::*)(int) を受け取れるようにすること。
387381:2007/03/15(木) 11:47:35
>>384
>374, 381の方法だとインデクシングという手法が外に見えると。
一応 indexing のインタフェース (operator[]) を実装詳細として
外に見せずに, iterator だけ提供するのもありえると思いますよ.
indexing による手法を選択するかどうかは,
実装側のコンテナが random access できないといけない
(もしくは整数から要素への適当な mapping が要求される) という制限や,
コンテナへの要素の追加・コンテナからの要素の削除に対して
iterator が無効化される条件などを考慮して最終的に決定しなければならないかと.

># 単に個々の演算の定義の省力化のためでしょうか??
あと,各種 typedef ですね.実際きちんと iterator に要求される演算を用意しようとすると,
たとえば random access iterator の場合
==, !=, ++ (前置・後置), -- (前置・後置), +=, +, -=, - と,そこそこな労力が必要になるので
この省力化の恩恵は小さくないと思います.
388373:2007/03/15(木) 18:00:50
>>387

丁寧にありがとうございます。
インデクシングが見えると書いたのは例えば>>381の2行目
public boost::iterator_adaptor< iterator, size_t, X* >で
size_tをイテレータの中身(?)として渡しているのを見た人が
「インデクシングをしているのかな」と察するという意味ですが、
# 例えば class Ximpl; Ximpl* impl_; という記述を見た人が
# Pimplイディオムの実装に気付くように。
それすら隠せるということでしょうか?
…なんだか訳の分からないことを言っている気がしてきた。

> この省力化の恩恵は小さくないと思います.
たしかにその通りですね。
389382:2007/03/16(金) 02:11:32
>>385
なるほどキャストすればよいのですね。
おかげで解決しました。

>>386
コンパイラが判断できない場合もあるようです。

みなさまありがとうございました。
390デフォルトの名無しさん:2007/03/16(金) 18:01:24
開発環境 VC2003 C++

通信で取得したバッファを構造体にほうり込んで使おうと思ってるのですが。
構造体に詰めんだ後の値を見るとどうも数値がおかしい

struct test {
char com[24];
int len;
unsigned char flg;
char md5[32+1];
int sum;
char test[10][2];
};

こんな感じの構造体に受け取った通信バッファを詰め込むと
どうしてもsumから数値がおかしいものが詰め込まれてしまうので
メモリ上で確認してみるとmd5の部分で自分で意図しない+2バイトが
勝手にとられているせいで、後ろがずれてしまってました。
確か+2バイトとか余計な事をしない設定があったと思うのですが
思い出せず、教えて頂けないでしょうか?
391デフォルトの名無しさん:2007/03/16(金) 18:03:06
あげるべきだった、連書きすいません。
上の質問お願いします。
392デフォルトの名無しさん:2007/03/16(金) 18:04:26
環境依存だよそでやれ。#pragma pack(0)
393デフォルトの名無しさん:2007/03/16(金) 20:06:23
extern で class の宣言は出来ないのでしょうか?
そうしないと多重でインスタンス化してしまったりするのですが、、
394デフォルトの名無しさん:2007/03/16(金) 20:14:33
>>392
最後のが何気なく気になって調べてみたら・・
ありがとう助かった。
395デフォルトの名無しさん:2007/03/16(金) 20:43:46
ぉぉ。これがツンデレか!!123
396デフォルトの名無しさん:2007/03/16(金) 22:27:42
>>393
できるだろ?
確かめるのめんどくさ
397393:2007/03/16(金) 23:29:07
>>396
もう一度見直したら、確かにできそうです。
まぁ、#include とか #ifdef とかを駆使して頑張ってみます。
398デフォルトの名無しさん:2007/03/18(日) 09:07:22
いままで俺様フィーリングで使い分けてたけど、
structにするかclassにするかで明確な分け方の基準ってある?
399デフォルトの名無しさん:2007/03/18(日) 09:26:42
俺様基準でいいんじゃない?
400デフォルトの名無しさん:2007/03/18(日) 10:48:10
PODや関数オブジェクトはstructってのが慣習の様な
401デフォルトの名無しさん:2007/03/18(日) 10:50:00
いきなりその辺にclass使うといきなりpublic:が出てくるからな
402デフォルトの名無しさん:2007/03/19(月) 22:25:29
下記のソースがコンパイルすると
error C2248: 'A<T>::__ctor' : private メンバ (クラス 'A<T>' で宣言されている)にアクセスできません。
と言われてしまいます  vc7.1です
template<class T>
class A {
 friend class T;
 A() { std::cout << "A()" << std::endl; }
};

class B {
 A<B> a;
public:
 B() {}
};

int main(int argc, char *argv[]) {
 B b;
 return 0;
}
403402:2007/03/19(月) 23:15:36
ただのfrined Tにしたらコンパイル通りました
でもg++ではまったく受付けないぽいorz
404デフォルトの名無しさん:2007/03/19(月) 23:17:13
bcc32では通ったお
405デフォルトの名無しさん:2007/03/19(月) 23:22:25
規格でもfriend T;は駄目だし、
ほかにもテンプレート引数に対してフレンドを指定する方法はないはず。
406デフォルトの名無しさん:2007/03/19(月) 23:25:50
407デフォルトの名無しさん:2007/03/19(月) 23:27:38 BE:268528043-2BP(21)
てっきりAのコンストラクタがprivateだからエラーになってるだけかとオモタよ?
408デフォルトの名無しさん:2007/03/19(月) 23:29:54
g++で通った人いる?
俺もどうやっても通らなかったんだけど。。
409デフォルトの名無しさん:2007/03/19(月) 23:31:28 BE:805582894-2BP(21)
>>407
ごめんなさい読み間違えた('A`)
410デフォルトの名無しさん:2007/03/19(月) 23:56:46
規格によれば、11.4-2で、classをfriendにするには、elaborated-type-specifier
(展開していくと、class-or-namespace-name)が必要で、こいつには、テンプレート
引数とかtypedefとかは含まれないんだな
411デフォルトの名無しさん:2007/03/20(火) 01:10:24
次の規格改定ではこれが入って friend T; で済むようになるっぽい。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf
412デフォルトの名無しさん:2007/03/20(火) 02:35:43
まあ、そこはどう考えても規格がおかしいだろとは思う。
さっさとこれを合法にして欲しい。
VC8では、うれしいことに、通ってしまうようだが。

template <typename T>
class nonderivable
{
friend T ;
nonderivable() {}
nonderivable(nonderivable const &) {}
} ;
413デフォルトの名無しさん:2007/03/20(火) 10:13:05
friend T;
なんてどんな場面で使うんだ?
設計が間違っているようにしか思えないんだが…。
414デフォルトの名無しさん:2007/03/20(火) 13:22:55
それ言うなら、friend自体使わんな。
415デフォルトの名無しさん:2007/03/20(火) 15:36:02
友達じゃないか
416デフォルトの名無しさん:2007/03/20(火) 15:42:21
困ったときだけ友達よばわりか
417デフォルトの名無しさん:2007/03/20(火) 16:02:02
>>416 warata
418デフォルトの名無しさん:2007/03/20(火) 19:02:23
まぁ、覗かれる側が覗く相手を指定する友達宣言だし、いいじゃないか。

てか、覗きたい相手を勝手に宣言して覗きまくれるキーワードがあったらカオスだな。
さしずめsoulmate(心の友)ってとこか。
419デフォルトの名無しさん:2007/03/20(火) 20:37:18
class a{
peeping b; // bを覗き見します
}
420デフォルトの名無しさん:2007/03/20(火) 22:51:02
tashiroでも可
421デフォルトの名無しさん:2007/03/20(火) 22:54:03
とりあえず勝手に子供を名乗るのはどうだろう?
保護されている情報くらいまではアクセスできる。
422デフォルトの名無しさん:2007/03/20(火) 22:57:02
BYTE* p = reinterpret_cast<BYTE*>(new SomeType);
delete p;

こんなようなコードって合法?このdeleteの振舞いは定義されている?

つまり、ある型の自由記憶にあるオブジェクトを、
まったく関連のない型にキャストしてから、deleteするのはあり?なし?
423デフォルトの名無しさん:2007/03/20(火) 22:58:38
タイーホ
424デフォルトの名無しさん:2007/03/20(火) 22:58:54
>>422
なんか出てくる前に、早く鼻の穴を塞ぎなさい!
425デフォルトの名無しさん:2007/03/20(火) 23:23:54
キャストしてdeleteすれば?
426デフォルトの名無しさん:2007/03/20(火) 23:47:11
そこでboost::shared_ptr<void>ですよ

class A {
public:
 A() { std::cout << "A()" << std::endl; }
 ~A() { std::cout << "~A()" << std::endl; }
};

int main(]) {
 boost::shared_ptr<void> p;
 p.reset(new A);
 return 0;
}
427デフォルトの名無しさん:2007/03/20(火) 23:56:25
>>422
void * p = reinterpret_cast<void *>( new sometype ) ;
delete reinterpret_cast<sometype * >(p) ;

これなら鼻の穴をふさがなくてもいいはず。
428デフォルトの名無しさん:2007/03/21(水) 02:17:48
コラー
429デフォルトの名無しさん:2007/03/21(水) 07:01:08
>>427
static_cast で頼む。っていうかほんとはキャスト無しで頼む。
430デフォルトの名無しさん:2007/03/21(水) 12:53:57
friendがダメという話はよく聞くがではどうしろと?

public?
431デフォルトの名無しさん:2007/03/21(水) 13:25:55
例外を認めない規則に一般性はない
432デフォルトの名無しさん:2007/03/21(水) 15:40:28
実際に動的ポリモーフィズム的なこと使う場面って多いのでしょうか?

433デフォルトの名無しさん:2007/03/21(水) 15:42:42
割と。
434デフォルトの名無しさん:2007/03/21(水) 15:46:16
かなり。
435デフォルトの名無しさん:2007/03/21(水) 15:52:27
使わないとやってられない
436デフォルトの名無しさん:2007/03/21(水) 15:52:55
いや俺は使わんね
437デフォルトの名無しさん:2007/03/21(水) 16:28:44
静的ポリモーフィズムで済むとこは極力そっちに
438デフォルトの名無しさん:2007/03/21(水) 16:36:41
じゃあ俺は性的ポリモーフィズムで。
439デフォルトの名無しさん:2007/03/21(水) 17:36:15
template <class Derived>
struct base
{
void interface()
{
// ...
static_cast<Derived*>(this)->implementation();
// ...
}
};

struct derived : base<derived>
{
void implementation();
};

wikipediaでみつけたコードなのですが、base型からderived型にキャストしているのは
ダウンキャストであまり良くないと思うのですが、
こういうのは一般的に使われているものなのでしょうか?
440デフォルトの名無しさん:2007/03/21(水) 17:44:59
>>439
static_cast の時点でクラス間の継承関係をコンパイラが知っていれば
static_cast でもダウンキャストは可能。ただし実際に適用するインスタンスの
継承関係はプログラマが保証することになる。

dynamic_cast なら同じダウンキャストでも実行時のチェックが入る。

どちらにしてもダウンキャストがあまり良くないのは確か。
441デフォルトの名無しさん:2007/03/21(水) 17:58:42
>>439
ATLで多用されてるテクニックだな。

vtblを節約して、呼び出すメソッドをコンパイル時に解決できるのが、
通常のポリモーフィズムと比較しての利点。
442デフォルトの名無しさん:2007/03/21(水) 18:57:56
CRTP(奇妙に再帰するテンプレートパターン)の常套手段。
static_castならコンパイル時に解決されるのでこれに限ればデメリットは無い。
443デフォルトの名無しさん:2007/03/21(水) 20:46:06
>>439
昔見たときは感動したが
今ではむしろvirtualが過激な拡張に見えてしまう罠
444デフォルトの名無しさん:2007/03/21(水) 21:06:29
すいません アドバイス頂けないでしょうか

type_infoクラス type_info::before関数 を使って継承関係を調べたいのですが、
継承中にテンプレートクラスをはさむと上手く判別してくれないときがあります。
(きちんと判別してくれるクラスもあります)
何かよい手がありましたら、お願いします。

こんな感じです↓↓↓↓↓↓
※ はしょって書いてます、すいません

class A;
class B : public A;
class C<t> : public B; // ※テンプレートクラス
class D : public C<hoge>;
class E : public C<huga>;

このとき , DクラスとEクラスの継承を調べます

typeid(D).before( typeid(A) ) → 1 
typeid(D).before( typeid(B) ) → 0 //なんで?
typeid(D).before( typeid(C<hoge>) ) → 0 //なんで?

typeid(E).before( typeid(A) ) → 1 
typeid(E).before( typeid(B) ) → 1 //なんで? Dと違う!
typeid(E).before( typeid(C<huga>) ) → 1 //なんで? Dと違う!


・・・困ってます


445デフォルトの名無しさん:2007/03/21(水) 21:26:36
>>444
問題の再現する最小コードを用意してくれんか?
それから、再現環境も教えてくれ。
446デフォルトの名無しさん:2007/03/21(水) 21:31:14
>>439
boost::iterator_facadeとかBoostでも使われてるな
447デフォルトの名無しさん:2007/03/21(水) 21:34:47
>>444
beforeは継承関係と関係ないらしいぞ
448デフォルトの名無しさん:2007/03/21(水) 21:35:04
type_info::before()で継承関係なんか調べられたっけ?
449デフォルトの名無しさん:2007/03/21(水) 21:46:05
>>444
is_base_of
名前空間boostもしくはstd::tr1
450445:2007/03/21(水) 21:51:39
orz
451デフォルトの名無しさん:2007/03/21(水) 21:53:56
444です。

>>445
すいません。今、サンプルコード作成中です。
いかんせん、作っているクラスがでかいので上手く切り取りできないかも。
ちなみに VC++6.0 サービスパックは5.0だっけな?

>>447,448
ヤフーで「typeid before C++」検索かけると引っかかります。
※個人ページなので アドレス直書きは避けます。
そこだと「派生関係を調べる」と書いてありました。

452デフォルトの名無しさん:2007/03/21(水) 21:59:31
>>449
アドバイスありがとうございます
is_base_of、検索してみます。
 
453デフォルトの名無しさん:2007/03/21(水) 22:04:26
18.5.1 より
bool before(const type_info& rhs) const;
Effects: Compares the current object with rhs.
Returns: true if *this precedes rhs in the implementation’s collation order.

継承関係と before() による順序は関係ない。
454デフォルトの名無しさん:2007/03/21(水) 22:05:12
before()は、規格では「type_infoオブジェクトを実装依存の順序で比較する」としか言ってないはず。
無論、継承関係を考慮に入れた順序付けでの実装もありうるだろうけど。

動的な継承関係の判定なら、dynamic_castを使うべき。
455デフォルトの名無しさん:2007/03/21(水) 22:06:03
でも444を見る限り静的に判定できれば十分そうに見える。
456デフォルトの名無しさん:2007/03/22(木) 06:37:23
439です。
template <class T> class Hoge{
typename T::Type value;
};

class Fuga :Hoge<Fuga>{
public:
typedef int type;
}

と書くと
main.cpp: In instantiation of ‘Hoge<Fuga>’:
main.cpp:9: instantiated from here
main.cpp:6: error: invalid use of undefined type ‘class Fuga’
main.cpp:9: error: forward declaration of ‘class Fuga’
とエラーになってしまいました
gcc 4.1.2を使ってます。
instantiateって
Fuga fuga;
のようなものを指すものだと思っているのですが違うようですね・・・

ようは、Fugaより先にHogeをインスタンス化するから、T::Typeがなんなのか解らない。ってエラーでしょうか?
457デフォルトの名無しさん:2007/03/22(木) 07:04:20
>>456
class Fuga :Hoge<Fuga> の時点では Fuga は不完全なんだけど、
Fuga::type は Fuga が完全になっていないとエラーになる。
コレに対して >439 がエラーにならないのは、メンバ関数の定義は
必要になるまでインスタンス化されないから。
458デフォルトの名無しさん:2007/03/22(木) 13:46:53
class A; A a;の場合「aはAのインスタンスである」ということがあるが
この場合の「インスタンス化」はtemplate <typename T> class A;に対するtypedef A<int> A_int;
459デフォルトの名無しさん:2007/03/22(木) 16:01:31
なるほど。解りました。
ありがとうございます。
460445:2007/03/22(木) 23:28:00
>>444
struct TRUE_tag { static int value = 1; };
struct FALSE_tag { static int value = 0; };

template<class T> inline TRUE_tag is_derived_of(const T *)
{
  return TRUE_tag();
}
template<class T> inline FALSE_tag is_derived_of(const void *)
{
  return FALSE_tag();
}

なんかくやしいんでこんなん書いてみた。
461デフォルトの名無しさん:2007/03/24(土) 18:19:13
なにか便利なもノン阿野?
462デフォルトの名無しさん:2007/03/25(日) 06:32:29
コンストラクタ/デストラクタで仮想関数呼ぶと
派生クラスでオーバーライドした関数が呼ばれないんですね・・・
463デフォルトの名無しさん:2007/03/25(日) 07:55:49
派生クラスの仕事は派生クラス側で片付けろということだわな。
少々面倒かもしれないけど 派生クラスの ctor/dtor に書けば済むことですわ。
464デフォルトの名無しさん:2007/03/25(日) 09:52:43
基底クラスのコンストラクタではまだ派生クラスのオブジェクトは作られていない。
基底クラスのデストラクタではもう派生クラスのオブジェクトはなくなった。
C++ではこういう発想をしている。
465デフォルトの名無しさん:2007/03/25(日) 15:02:53
type_info::before( )の話を見ていたら
C++にリフレクションが無いのが悔やまれ
466デフォルトの名無しさん:2007/03/26(月) 01:52:31
一般にC++って言ったら
MSのC++/CLIも入ってくるものでしょうか?

上司に、C++ってまだリソースリークするのか?って
聞かれたんで、それはしますよと答えたのだが。。
467デフォルトの名無しさん:2007/03/26(月) 01:57:48
>>466
お前も上司も何か勘違いしてないか?

C++ がリソースリークするわけじゃないし、
C++/CLI がリソースリークしないわけじゃないだろう。
468デフォルトの名無しさん:2007/03/26(月) 01:58:00
>>466
どういう一般かによる。CとC++の区別もろくにつかない人からすれば
C++/CLIはまぁC++に含んでもいいんじゃないかと思うが、プログラマ
あるいはそれに準ずるような立場の人からすれば別物。
469デフォルトの名無しさん:2007/03/26(月) 01:58:10
>>466
C++/CLIを入れると迷惑だとおもう。
C++知っている人みんながCLI知っているわけじゃない。
VC使わない人もいるし。

リソースリークとC++が未だっていうことは関係ないでしょ。
来月になるとリソースリークしなくなるわけじゃないし。
470デフォルトの名無しさん:2007/03/26(月) 02:20:43
RAIIを徹底すればリソースなんてリークしません、とでも言っておけよ。
これは、GCする環境ではリークがないのと同じくらい真実だから。
471デフォルトの名無しさん:2007/03/26(月) 02:24:40
C++でちゃんと作れば、オブジェクト廃棄のタイミングを制御できない言語よりも
リソース管理を精密に行えると思うが・・・
472デフォルトの名無しさん:2007/03/26(月) 04:29:29
GC言語でも開放されると思ってたらクロージャで参照してたせいで
開放されてなかった、ということはあったな。
473デフォルトの名無しさん:2007/03/26(月) 04:58:07
C言語では言語の機能的に確実なリソースの解放が時に非現実的な事となるけど、
C++ではそういう悲惨な事態は十分回避可能。
ある意味ではこれこそC言語との一番大きな差異だな。
474デフォルトの名無しさん:2007/03/26(月) 09:10:34
ですとらくたさまばんざーい
475デフォルトの名無しさん:2007/03/26(月) 09:21:17
>>466
C++/CLIの実装は今のところ.NETフレームワーク上の環境になると
思うから、これは.NETの開発というくくりにした方が良い気がする。

>>470>>471
ちゃんと作れる人が相対的に少ないから問題なんだろうね。
実力差があらわれすぎてしまうし。
476デフォルトの名無しさん:2007/03/26(月) 11:18:43
そもそもCLIがまともに動く環境上なら多少のリソースリークなんて(ry
477デフォルトの名無しさん:2007/03/26(月) 16:28:08
リソースリーク=メモリリークじゃないだろ
478デフォルトの名無しさん:2007/03/27(火) 22:12:27
ファイルハンドルとかプロセス内で完結するリソースだったら、
プロセスの終了と同時に解放されることがやっぱり期待できると思う。
479デフォルトの名無しさん:2007/03/27(火) 22:14:25
mallocしたらmainを抜けるまでにfreeすべきですよね。
480デフォルトの名無しさん:2007/03/27(火) 22:23:45
freeしろって言われてできませんだったら、
ほかでリークしてるんじゃ?というのは勘ぐりすぎ?
481デフォルトの名無しさん:2007/03/27(火) 23:17:22
↑意味不明な文章の例。
482デフォルトの名無しさん:2007/03/27(火) 23:40:10
勘ぐり過ぎっていうか混乱しすぎ
483デフォルトの名無しさん:2007/03/27(火) 23:42:22
freeしろと言われた奴が、出来ませんと答えやがった。
ひょっとしてリークしてるんでは?というのは勘ぐりすぎ?

脳みそリークなおまいらの代わりに俺が補完してやった。
間違ってたら吊ってやるよ。
484デフォルトの名無しさん:2007/03/27(火) 23:45:01
↑意味不明な文章の例。
485デフォルトの名無しさん:2007/03/27(火) 23:46:19
脳みそリークってどういう状況?
486デフォルトの名無しさん:2007/03/27(火) 23:48:05
グロイな
487デフォルトの名無しさん:2007/03/27(火) 23:52:36
こんな感じではないかと。

        ∧
       /´。 `ーァ
      ヽ{  々 ゚l ノ    
      (( ノ(    )ヽ ))
       <    >
488480:2007/03/28(水) 00:14:20
わりい、酔っぱらって書いてた。
489デフォルトの名無しさん:2007/03/28(水) 00:28:42
のうみそをすいとられた!
490デフォルトの名無しさん:2007/03/28(水) 00:37:39
>>487
不覚にもワラタ
491デフォルトの名無しさん:2007/03/28(水) 11:52:54
スターシップトルーパーにいたね
そういうの
492デフォルトの名無しさん:2007/03/28(水) 22:24:06
複数形のズがつきます
493デフォルトの名無しさん:2007/03/31(土) 01:08:11
ttp://www.geocities.jp/bleis_tift/cpp/exception.html
ここのコンストラクタに対しての構文ってマジ? vc7.1ではコンパイルエラー
494デフォルトの名無しさん:2007/03/31(土) 01:20:14
>>493
なんか他の言語と混同してんだろ。

と、思いつつもいろいろ試してみたら最近のコンパイラならかなりの割合でイケる。
vc も 8 ならおk。知らんかったよ、その構文。
495デフォルトの名無しさん:2007/03/31(土) 01:24:15
関数もこの構文でイケるんだな。てか、これって ISO/IEC 142882:2003 にあったっけ?
496デフォルトの名無しさん:2007/03/31(土) 01:35:26
>>493
うちのvc7.1では通ったし、規格にもある。
497デフォルトの名無しさん:2007/03/31(土) 01:38:41
>>496
d
>>493 を鵜呑みにしてテストしてなかったが、うちの vc7.1 でもパスした。
498デフォルトの名無しさん:2007/03/31(土) 02:09:06
C++クックブックにも載ってたよ
499デフォルトの名無しさん:2007/03/31(土) 02:15:06
普通だよその構文
500493:2007/03/31(土) 02:18:33
orz 自分が確認用に使っていたコードは
class A {
public:
 template<class T>
 explicit A(T t) try : i_(t) {
 }
 catch(...) {
 }

private:
 int i_;
};
みたいなかんじでなのですが、普通のコンストラクタでは確かにコンパイルできることを確認しました
おさわがせしました
501デフォルトの名無しさん:2007/03/31(土) 02:19:46
>>493は知らなかった。
そんなコードに今まで一度もお目にかかったことがない。
どういう経緯で入ったんだろう。

既に関数として{}を打っているのに、関数全体にかかるtry {}をタイプするのは面倒だという人が多かったんだろうか。
502デフォルトの名無しさん:2007/03/31(土) 02:39:36
>>501
それでは初期化リストが漏れてしまうのだよ。
503デフォルトの名無しさん:2007/03/31(土) 10:08:52
>>493のページにはコンストラクタ・デストラクタでの関数tryブロックでは
自動的に再スローされることが書かれていないな。
504デフォルトの名無しさん:2007/03/31(土) 10:53:46
> 自動的に再スローされる

マジかよ。
それを止めることもできない?

ということは緊急避難用ってことかな
505デフォルトの名無しさん:2007/03/31(土) 13:36:41
関数tryブロックについては More Exceptional C++ Item 17, 18 に詳しく書いてある

要するに、関数tryブロックのcatchハンドラに入ったということは
コンストラクタ (ないしデストラクタ) はすでに失敗しており、
正常終了しようがないわけだ

ハンドラ内では次のルールが適用される (More Exceptional C++ Item 18 より)
- return; は書けない
- throw; と書くと元の例外が再スローされる
- 元の例外とは違う例外を投げると、それが上位にスローされる
- 制御がブロックの最後に到達すると、最後に throw; が書いてあるものとみなされる
506デフォルトの名無しさん:2007/03/31(土) 13:43:01
誰か標準委員会に進言してこいっ!!
507デフォルトの名無しさん:2007/03/31(土) 14:32:01
何を?
508デフォルトの名無しさん:2007/03/31(土) 15:11:52
あれを
509デフォルトの名無しさん:2007/03/31(土) 15:34:50
>>500
それはそれで、本来はコンパイルできなきゃいかんコードなんじゃないか?
510デフォルトの名無しさん:2007/03/31(土) 16:23:22
アッー!
511デフォルトの名無しさん:2007/03/31(土) 16:24:03
Tがintへの暗黙の変換を持たない型で試していたとかそういうことでは?
512デフォルトの名無しさん:2007/03/31(土) 16:37:51
>>511
A a(777); でもコンパイルエラー@vc7.1
513デフォルトの名無しさん:2007/03/31(土) 17:05:59
エラーメッセージ貼れよ
514デフォルトの名無しさん:2007/03/31(土) 17:18:27
class A {
public:
 template<class T>
 explicit A(T t) try : i_(t) {
 }
 catch(...) {
 }

private:
 int i_;
};

int main() {
 A a(777);
 return 0;
}

main.cpp(4): error C2059: 構文エラー : 'try'
main.cpp(6): error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます
main.cpp(4): error C2988: 認識できないテンプレートの宣言または定義です。
515デフォルトの名無しさん:2007/03/31(土) 17:47:49
同じようなコードでもVC++ 8だとエラー無くコンパイルできる。
516デフォルトの名無しさん:2007/03/31(土) 22:43:16
俺が作ったコンパイラならよゆうで通るんだがな
517デフォルトの名無しさん:2007/04/01(日) 00:28:11
>>516
通るだけでスルーとか言うか?

518デフォルトの名無しさん:2007/04/01(日) 01:11:10
?????????????????
519デフォルトの名無しさん:2007/04/01(日) 04:19:46
>>514
VC7.1はテンプレートでは動かない
(そもそも生成コードにバグがあるので使えないらしい)
520デフォルトの名無しさん:2007/04/01(日) 14:13:47
C++ で final (sealed) クラスを作るいい hack はないかな?
521デフォルトの名無しさん:2007/04/01(日) 14:54:18
>>520 boost nonderivable
522デフォルトの名無しさん:2007/04/01(日) 15:10:21
thanks.
523デフォルトの名無しさん:2007/04/01(日) 16:13:01
初歩的なところで止まってしまった
教えてくれ

class 定義で

struct foo{
 int i;
 int j;
}

private:
 foo* f();

としてるんだが、肝心の関数内で
 foo rf(255);
 c::f = &rf;

とするとエラーになる。
何か根本的に勘違いをしているらしい。
やりたいことは、class に foo 構造体(要素 255 個)を持たせたい。
エロい人教えて><
524デフォルトの名無しさん:2007/04/01(日) 16:19:46
typedef struct __foo{
int i,j;
private:
__foo*f();
}foo;

foo*f(){
//...
foo rf[255];
//...
}

駄目だ、俺の良心が質問に答えようとしても523の書いてあることの意味が分からない。
525デフォルトの名無しさん:2007/04/01(日) 16:22:56
むしろ自分の方が間違ってるんじゃないか?
ってくらい齟齬を感じるけど
とりあえず入門書ひゃっぺん読み返したほうが・・・
526デフォルトの名無しさん:2007/04/01(日) 16:30:12
予約識別子死ね
527デフォルトの名無しさん:2007/04/01(日) 16:30:13
>>524-525
いやすまん、ほんとにすまん
俺の表現がそもそもおかしかった

class a に、structure foo をクラス内変数として保持したかった。
要するに、構造体配列を、a が破棄されるまで a の内部で foo を保持したかっただけなんだ。
(なんというか、仮想テーブルみたいな)
クラス内で int の変数を保持するなら private: int i; でいいんだが、
構造体で、それの配列要素数が 255 としたときの宣言の仕方が分からなかった。

もういっかいお願い、エロい人><
528デフォルトの名無しさん:2007/04/01(日) 16:31:48
>>527 foo a[255];
529デフォルトの名無しさん:2007/04/01(日) 16:34:37
struct foo{
int i,
int j
};

class a{
foo foo_array[255];
//.....
};
530デフォルトの名無しさん:2007/04/01(日) 16:35:58
何やってんだ俺・・・徹夜明けでボケてる・・・orz

×
struct foo{
int i,
int j
};


struct foo{
int i;
int j;
};
531523:2007/04/01(日) 16:36:36
いやそんなことねーだろと思ってもう一回 >>528 みたいに書き直したら
コンパイル通りました(゚Д゚)
どうも a[255] が a(255) になってたっぽいですorz
これだからVB厨は・・・
すれ汚しスマソorz
532523:2007/04/01(日) 16:37:49
>>529-530
ほんまその通りでした
ご教授ありがとう><
533デフォルトの名無しさん:2007/04/02(月) 00:56:41
ATLでCOM作ってたんだが、メソッドを1つプロパティを1つ追加したまではよかった(と思う)
ある時突然、インターフェイスアイコン(IFoo とかの)をダブルクリックすると、
 このクラスの定義が見つかりません。
と言われて開けなくなった。

定義( ATL_NO_VTABLE の派生クラス定義もIDLも )はもちろんあるし、コンパイルも正しく通る。
うまく動いてはいるんだが、IFooにプロパティを追加しようとしても、クラス定義がないと見なされているからか
ウィザードから追加ができない。うんともすんとも言わない。

クラスビューがソースとリンクしなくなるのはどんな時ですか??
534デフォルトの名無しさん:2007/04/02(月) 03:09:06
環境依存はスレ違い。
535デフォルトの名無しさん:2007/04/07(土) 18:57:01
gccスレで聞いてましたが言語の問題なのでこちらに移転します

MacOSXでg++の4系列を使い始めたのですが,
以下のコードでコピーコンストラクタがないと怒られます.
#include <iostream>
using namespace std;
class A {
A (const A &p);
A &operator = (const A &p);
public:
A () {}
friend ostream &operator << (ostream &p_os, const A &p_a) {return p_os;}
};
int main ()
{
cout << A () << endl;
return 0;
}
エラーメッセージは
test.cpp:4: error: 'A::A(const A&)' is private
test.cpp:12: error: within this context
です.g++-3.3では怒られないのですが,
これって規格的にはg++-3.3の方が正しいですよね?

powerpc-apple-darwin8-g++-4.0.1 (GCC) 4.0.1
g++-3.3 (GCC) 3.3 20030304
536デフォルトの名無しさん:2007/04/07(土) 19:39:18
いやGCCの問題だろ
向こうでいい
537デフォルトの名無しさん:2007/04/07(土) 19:48:07
規格として許されるソースコードなのかどうかという点では、ここでもいいだろう。
538デフォルトの名無しさん:2007/04/08(日) 07:32:32
>>535
8.5.3/5によって実装はコピーすることを認められている
よってそれは移植性のないコードということになる
将来的には通るようになる。たぶん
539デフォルトの名無しさん:2007/04/09(月) 02:16:39
>>538
そんな消えそうな仕様に今更ぶつかるとはorz
operator const A & () const;
をAのpublicに足して対応することにしました.
540デフォルトの名無しさん:2007/04/09(月) 20:20:27
type erasure とはどんな技法(?)の事を指すんでしょうか

boost::anyに使われてるぽいですが・・・
541デフォルトの名無しさん:2007/04/09(月) 20:42:55
ようするにvoid*
542デフォルトの名無しさん:2007/04/09(月) 23:28:48
boost.Anyを呼んでみるのが一番早いと思う。
恐ろしく短いから。



C++ Template Metaprogrammingに詳しい解説がある。
日本語だと……個人のブログぐらいしか情報がないんじゃないかな。
543540:2007/04/09(月) 23:32:46
>>541
>>542
ありがとうございます

ちょっとboost読んできます
544デフォルトの名無しさん:2007/04/09(月) 23:33:36
shared_ptrでもdeletor周りに使ってた希ガス
545デフォルトの名無しさん:2007/04/09(月) 23:43:58
boost::anyはかなり簡潔に書かれているから
解説が無くてもソースを読んで理解できると思う。
546デフォルトの名無しさん:2007/04/12(木) 22:49:40
皆さんどのくらいのサイズからヒープ使ってます?
wchar_t a[1024]; ぐらいはスタックにしてますが
547デフォルトの名無しさん:2007/04/12(木) 22:53:11
面倒だから配列は使わない
548デフォルトの名無しさん:2007/04/12(木) 22:57:34
>>546
状況による。スタックが潤沢にある環境ならスタックを贅沢につかうし、そうでないなら節約して使う。
549デフォルトの名無しさん:2007/04/13(金) 11:28:26
vector使う
550デフォルトの名無しさん:2007/04/13(金) 17:56:31
速度が必要か、最適化が効きそうな場合以外はvector、せめてboost:array
551デフォルトの名無しさん:2007/04/13(金) 18:34:21
個人的にはBoost.Range/RangeExが出てからBoost.Arrayは要らない子
552デフォルトの名無しさん:2007/04/13(金) 19:52:50
>>548
それを自動で切り替えるアロケータを作れ(俺はいやだ)
553デフォルトの名無しさん:2007/04/13(金) 23:17:11
>>552
環境依存なモノなら作れるかも知れんが、これって環境依存じゃ意味ないだろ。
554デフォルトの名無しさん:2007/04/14(土) 00:08:28
スタックとかヒープとかってC++の規格で言及されてないよな
555デフォルトの名無しさん:2007/04/14(土) 00:25:03
>>554
そうなのか? スタックとヒープとフリーストアについては規格で
言及されているものだとばかり思っていたのだが。禿本とかにでてくるだけ?
556デフォルトの名無しさん:2007/04/14(土) 01:20:39
>>554
std::stack
std::priority_queue
はご存知か?
557デフォルトの名無しさん:2007/04/14(土) 01:53:39
今話題なのはそっちじゃないと思うが
558デフォルトの名無しさん:2007/04/14(土) 04:27:14
>>556
お前は何を言っているんだ
559デフォルトの名無しさん:2007/04/14(土) 10:02:23
>>556
どうして現実を見ようとしない
560デフォルトの名無しさん:2007/04/14(土) 10:04:54
>>556
そいつはあくまで「論理的にスタックの動作をするコンテナ」。
CPU内部におけるスタックで実装されているわけじゃない
561デフォルトの名無しさん:2007/04/14(土) 10:09:39
きっと釣りだよ。そう思ってあげようよ。

>>553
Boostとか考えるに普及しているいくつかの処理系と環境に対応させれば移植性ありを謳えるさw
もっとも、そのアロケータがスタックに割り当てた後で、大き目の配列を宣言してる
関数呼んでたりすると本末転倒でお手上げだから、案外どうしようもないかもしれん。
562デフォルトの名無しさん:2007/04/16(月) 14:02:32
>>560
> CPU内部におけるスタック
> CPU内部におけるスタック
> CPU内部におけるスタック
> CPU内部におけるスタック
> CPU内部におけるスタック
563デフォルトの名無しさん:2007/04/16(月) 14:21:05
SPのことじゃないの?
564デフォルトの名無しさん:2007/04/17(火) 10:19:41
引数がメンバ変数かそれ以外かでメンバ関数をオーバーロードすることって可能?
565デフォルトの名無しさん:2007/04/17(火) 10:39:00
日本語でおk
566デフォルトの名無しさん:2007/04/17(火) 11:18:57
オーバーロードにこだわらなくても、
別の関数にすればいいじゃん。
567デフォルトの名無しさん:2007/04/17(火) 12:28:04
サブクラスでオーバーロードした非仮想メソッドを
上位クラスの別のメソッドから呼び出したい、
とかなんか病んだ状況を連想したw
568デフォルトの名無しさん:2007/04/17(火) 12:58:02
それはCRTPでいけるだろ
569デフォルトの名無しさん:2007/04/17(火) 13:08:36
ベタに書くといちいちキャスティング。
スマートに書くならBridgeパターンで機能と実装を分離、かな。
Effective C++ 第三版のcuriously recurring template patternは
知らない。
570デフォルトの名無しさん:2007/04/17(火) 17:10:06
んーCRTPでどうやってやるのか思い浮かばない。
サンプルきぼん。
ちなみに俺!=564
571デフォルトの名無しさん:2007/04/17(火) 17:35:56
何を解決しようとしているのか問題定義が不明。
572デフォルトの名無しさん:2007/04/17(火) 19:01:47
struct A { T m; } a;
T b;
のとき
function(a.m);
function(b);
この二つの関数で別々の実体を呼び出したいってことか?
だいぶエスパーだな。
573デフォルトの名無しさん:2007/04/17(火) 19:06:38
>>572
やはりまともに解釈するとそういうことになるよな。
無理やり考えてみると、参照で受け取って、ポインタを比較して、自前でシコシコディスパッチ。
>>564は一体何がしたいんだ。
574デフォルトの名無しさん:2007/04/17(火) 19:27:26
やっぱりオーバーロード使うべきところじゃないと思うのだが・・・
575568:2007/04/17(火) 19:29:08
ああスマン。CRTPは>>567向けの話
576570:2007/04/17(火) 22:11:07
いあ、俺が完全に読みミスってた
すまん>>575
577酔っ払い:2007/04/18(水) 00:24:57
スレ違いと分かって質問しますが
void func()
{
 static const hoge x(10.2);
 x.foo();
}
これのxってスレッドセーフじゃなくなるんですかね?
マルチスレッドでfuncの初回呼びが同時に起こると、xの初期化前を参照してしまう
スレッドが発生してしまう可能性って、やっぱりある訳ですか?

これが
 static const int x(10);
とかでもやっぱり保証されないものでしょうか?

定数をしてxを抑えたいだけなのですがやっぱりlockなりなんなり
特殊な事しなきゃやっぱり駄目でしょか?
578デフォルトの名無しさん:2007/04/18(水) 00:37:01
int(というか、POD)ならOK.場合によっては最適化で消えるし。
579デフォルトの名無しさん:2007/04/18(水) 00:48:59
TLS使えばおk
580デフォルトの名無しさん:2007/04/18(水) 00:57:39
つ関数ポインタ
void (*func)()
581酔っ払い:2007/04/18(水) 01:00:13
>>578
それはC++の仕様として保証されているものなのでしょうか?

>>579
それはやっぱりマルチスレッド用に準備が必要って事ですよね。
定数としてだけ参照したいんで変なコストは掛けたくない訳です。

>>580
関数ポインタ使うと??
582デフォルトの名無しさん:2007/04/18(水) 01:04:27
だったらグローバルの静的オブジェクトにしろよ
583デフォルトの名無しさん:2007/04/18(水) 01:06:39
>>581
そもそもC++の規格にはマルチスレッドに関する記述がでてこない。
よってマルチスレッド関連はすべて実装依存。
584デフォルトの名無しさん:2007/04/18(水) 01:07:30
今夜はおかしな書き込みばっかだな
585デフォルトの名無しさん:2007/04/18(水) 01:24:12
お前ら規格書のどこに書いてあるかそれだけを示せ
586酔っ払い:2007/04/18(水) 01:32:30
>>582
グローバルにしても翻訳単位が違うと同じような問題が起きる訳ですよね?

>>583
そんな気はしてました。スレッドセーフは保証されないと言うことですね。

ただ単にスレッドセーフかそうじゃないか聞きたかっただけです。
587583:2007/04/18(水) 01:33:10
>>585
悪魔の証明なんで無理っす。
588デフォルトの名無しさん:2007/04/18(水) 01:40:34
>>587
おまえ本物の馬鹿だろう?
589デフォルトの名無しさん:2007/04/18(水) 01:41:54
初期化のスレッドセーフが気になるなら、
シングルスレッド状態の時に初期化しちまえw
590デフォルトの名無しさん:2007/04/18(水) 01:46:08
>>588
お前ほどじゃないけどな。
591デフォルトの名無しさん:2007/04/18(水) 01:50:11
>>590
なんで顔真っ赤にしてんの?
592デフォルトの名無しさん:2007/04/18(水) 01:51:42
>>591
ちょっと長風呂し過ぎてのぼせた。
593デフォルトの名無しさん:2007/04/18(水) 02:13:43
ワラタ
>>590
書いてないなから全部読めタコって言えばいいだけじゃん。
594デフォルトの名無しさん:2007/04/18(水) 06:07:58
そっちのほうが回りくどいし痛いのに「〜って言えばいいだけ」っていうのがまぬけ。
引くに引けないからってそこまで暴走しなくていいじゃないか585よw
595デフォルトの名無しさん:2007/04/18(水) 08:26:30
はぁ?
それがあくまのしょうめいですかそうですか
596デフォルトの名無しさん:2007/04/18(水) 08:49:57
なんでそんなに必死なの
597デフォルトの名無しさん:2007/04/18(水) 08:52:02
ヒント:異常者の自作自演
598デフォルトの名無しさん:2007/04/18(水) 15:12:32
「酔っ払い」より見苦しい二人は相当ダメだなw
599デフォルトの名無しさん:2007/04/18(水) 23:01:09
class Base {};
class Derived1 : public Base {};
class Derived2 : public Base {};

int main() {
  Base*     pObj = new Derived1;
  Derived2* pDri = static_cast<Derived2*>(pObj);
  delete pObj;
  return 0;
}

こういうダウンキャスト処理はもしかして未定義ですか?
600デフォルトの名無しさん:2007/04/18(水) 23:05:47
いいえ
601デフォルトの名無しさん:2007/04/18(水) 23:06:44
no, this is not MITEIGI.
602デフォルトの名無しさん:2007/04/18(水) 23:09:27
dynamic_cast失敗しないかコレ
603600:2007/04/18(水) 23:20:36
よく見たらダウンキャストじゃねーしwワロタ
>>599はプログラムを今すぐやめること
604デフォルトの名無しさん:2007/04/18(水) 23:25:44
>>599
未定義も糞もDerived1の実体を
Derived2のポインタで操作したらあかんだろ
605デフォルトの名無しさん:2007/04/18(水) 23:39:15
あーありがとう
クラスのメンバを完全に省略してしまったので
質問の意図が伝えられてなかったかもしれないですけど、なんとなくわかりました

まずクラスの型安全がほしいのにstatic_cast使うって発想がだめで
何のためのdynamic_castかって話なんですね
のうみそおわとるなー
606デフォルトの名無しさん:2007/04/19(木) 01:11:04
>>605
本当に終わっているようだな
607デフォルトの名無しさん:2007/04/19(木) 02:00:48
おまいのやってる事は単なるポインタの再解釈であって
ただのreinterpret_cast
608デフォルトの名無しさん:2007/04/19(木) 02:15:54
こういうのクロスキャストっていうっだっけ。
エロス。
609デフォルトの名無しさん:2007/04/19(木) 02:18:08
言わないと思うけど
610デフォルトの名無しさん:2007/04/19(木) 02:20:43
こんな意味のないキャストに名前なんかつけるのか?
名前はなにげにカッコイイから気に入ったけどw
611デフォルトの名無しさん:2007/04/19(木) 02:24:25
クロスキャストは多重継承しているオブジェクトを
親Aのポインタから親Bのポイントに切り換える事じゃなかったっけ?
612デフォルトの名無しさん:2007/04/19(木) 20:16:45
cross castは>>611
>>599のはただのreinterpret
613デフォルトの名無しさん:2007/04/21(土) 13:28:40
>>605
dynamic_cast出来るわけがないし、
reinterpretすれば別だが、幸せな結果は訪れないぞ。。。。
614デフォルトの名無しさん:2007/04/21(土) 15:19:32
reinterpret_cast って意味有るの?
(hage*)a でいいやん
615デフォルトの名無しさん:2007/04/21(土) 15:24:37
それいったら、全部 Cキャストでいいわけだが。
616デフォルトの名無しさん:2007/04/21(土) 15:26:34
そういうお馬鹿を排除するために必要。
617デフォルトの名無しさん:2007/04/21(土) 15:31:51
1. キャスト意図がよく分かるし、意図と違うキャストだとコンパイルエラーになってくれる。
2. キャスト位置が検索ですぐ列挙できる。

比較的安全なキャスト(static_cast)と
危険度の高いキャスト(reinterpret_cast, const_cast, dynamic_cast)を
分離したわけだ。
何でもかんでも同じ文法にしてしまうと危険だから。

ただ、この長過ぎる名前はどうにかして欲しいもんだが・・・。
scast, rcast, ccast, dcast でいいじゃん。
618デフォルトの名無しさん:2007/04/21(土) 15:35:39
そうやってキャストする気をなくすために長い名前にしたんだよ
619デフォルトの名無しさん:2007/04/21(土) 15:50:46
「目立つように」ってのは禿本にも書いてあったな。
620デフォルトの名無しさん:2007/04/21(土) 16:11:28
dynamicとstatic比べてdynamicのほうが危険ってケースあったっけ?
621デフォルトの名無しさん:2007/04/21(土) 16:21:33
dynamic_castは安全だが高コスト。
622デフォルトの名無しさん:2007/04/21(土) 16:45:05
話の流れと関係ないが
C++スタイルのキャストは見慣れてくると
任意の型を受け取って指定した型を返すテンプレートクラスのように見えてくる
これは何か意図しているんだろうか
623デフォルトの名無しさん:2007/04/21(土) 16:50:58
>>617
#define dcast dynamic_cast
でおk
624デフォルトの名無しさん:2007/04/21(土) 16:59:44
>>622
正に見た目言語組込のキャストと同じになる関数を作れるようにするため。
ex) boost::lexical_cast
625デフォルトの名無しさん:2007/04/21(土) 17:02:24
ライブラリの設計がキャストほぼ必須なのに
そのライブラリ側で用意してある独自のキャスト関数の名前が糞長いって
なんかの嫌がらせですか
626デフォルトの名無しさん:2007/04/21(土) 18:44:23
dynamic_cast が必要な状況自体が
あまり出てきて欲しくないよな。
ダウンキャストかクロスキャストが必要な状況なわけで。
627デフォルトの名無しさん:2007/04/21(土) 21:09:49
boost::polymorphic_downcastはよく使うぞ
628デフォルトの名無しさん:2007/04/21(土) 22:45:48
インラインクラスのメンバ関数ってinline 宣言したのと同じ事になるんでしょうか?
629デフォルトの名無しさん:2007/04/21(土) 23:13:31
インラインクラスってなあに?
630デフォルトの名無しさん:2007/04/21(土) 23:16:44
ローカルクラスの事かと
631デフォルトの名無しさん:2007/04/21(土) 23:24:09
それならクラス定義内に関数定義を置くことになるから、暗黙の inline が利くことになるね。
632デフォルトの名無しさん:2007/04/22(日) 15:29:48
つーか何でinlineの実装はhファイルなのよVC
633デフォルトの名無しさん:2007/04/22(日) 15:30:17
だってinlineだから
634デフォルトの名無しさん:2007/04/22(日) 15:32:20
普通にinlineキーワードを頭に置けば良いんじゃないの?
635デフォルトの名無しさん:2007/04/22(日) 15:53:20
マジで?
636デフォルトの名無しさん:2007/04/22(日) 16:11:39
>>632
どんなコードになってるか分かんなかったら
処理を埋め込めないじゃないの。
637デフォルトの名無しさん:2007/04/22(日) 16:17:53
Java や C# があるこのごろでは、コンパイル単位の概念なんて
C/C++ 特有とも言えるだろう。
638デフォルトの名無しさん:2007/04/22(日) 17:32:53
WPO使え
639デフォルトの名無しさん:2007/04/22(日) 18:24:27
フツー .inl だよな
640デフォルトの名無しさん:2007/04/22(日) 21:19:45
ソケットを使って、ヤホーから株価をダウンロードするソフトを作っています。
銘柄コード毎にループでsend, recvすると
sendでConnection reset by peer、
writeでBroken pipe
っちゅうエラーがでてデータを取得できません。
どうすりゃ良いんでしょうか。
641デフォルトの名無しさん:2007/04/22(日) 21:21:48
writeでBroken pipe

ではなくて、

recvででBroken pipe

でした。失礼しました。
642デフォルトの名無しさん:2007/04/22(日) 21:50:40
ソケットは環境依存だなぁ。Winsockとかsocketとかあるし。
643デフォルトの名無しさん:2007/04/22(日) 21:55:09
そうっすか。。。
macなので一応unixですね。
わからーん(爆。
644デフォルトの名無しさん:2007/04/22(日) 22:33:32
>>640
スレ違いだし、激しく迷惑だからやめてね。
645デフォルトの名無しさん:2007/04/22(日) 22:54:33
>>644は人間関係苦手。柔軟性なし。
自分の判らない事には関わりたくない。
多分童貞。
646デフォルトの名無しさん:2007/04/22(日) 22:56:02
スレ違いなのは確かだろう
何絡んでんの?
647デフォルトの名無しさん:2007/04/22(日) 23:03:12
ム板ってスレ違いにうるさいよな。
受け入れてたら何が何だか判らんスレだらけになってしまうから、仕方ないんだろうけど。

640はネットワークプログラミングの本とtcpとかの仕組みの本読め。
でも、猫でも判るとか銘打ってるのは辞めとけ。
648デフォルトの名無しさん:2007/04/22(日) 23:24:24
職業柄カオスな状態になるのが耐えられないんだろ
649デフォルトの名無しさん:2007/04/23(月) 07:34:36
スレ違いに気づかない and 気づいても居座って回答を求める奴が大杉
後者はホント勘弁してくれ
650デフォルトの名無しさん:2007/04/23(月) 15:32:51
>>648
なるほど。
こういうところでスレ違いなのに暴れている奴は
原因も自ら作り出しているという事か。
651デフォルトの名無しさん:2007/04/23(月) 21:45:40
相談室、って言うスレタイが微妙だな。
652デフォルトの名無しさん:2007/04/23(月) 23:48:07
初心者尋問室
653デフォルトの名無しさん:2007/04/23(月) 23:50:20
654デフォルトの名無しさん:2007/04/23(月) 23:53:43
>>653
うわぁ、エピたんがしつっこく絡んでるw
655デフォルトの名無しさん:2007/04/23(月) 23:59:12
エピって仕事のストレスを初心者にぶつけるのが好きだよな
656デフォルトの名無しさん:2007/04/24(火) 00:09:54
2ちゃんのほうがまだマシだと思ったのは俺だけじゃないハズw
657デフォルトの名無しさん:2007/04/24(火) 00:15:09
えぴ引き合いに出そうが出すまいが
てめぇが最悪なのには変わりねぇって
バーカ
658デフォルトの名無しさん:2007/04/24(火) 00:36:12
えぴ乙
659デフォルトの名無しさん:2007/04/24(火) 00:59:34
http://bbs.wankuma.com/index.cgi?mode=al2&namber=2552
                            ^^^^^^^
                        これが激しく気になる
660デフォルトの名無しさん:2007/04/24(火) 01:59:13
初心者尋問室ワロタw
661デフォルトの名無しさん:2007/04/24(火) 03:14:45
kusakabeよりまし。
662デフォルトの名無しさん:2007/04/24(火) 04:50:06
kusakabeか・・・。
嫌なものを思い出させてくれる。
663デフォルトの名無しさん:2007/04/24(火) 06:21:44
>>659
ワラタw
664デフォルトの名無しさん:2007/04/24(火) 11:25:11
最近あちこちのスレでファビョってる中年というのは○usa○abeか?
665デフォルトの名無しさん:2007/04/24(火) 11:43:12
kusakabe引き合いに出そうが出すまいが
てめぇがクソなのには変わりねえよバーカ
666デフォルトの名無しさん:2007/04/24(火) 12:17:24
また粘着基地外か
667デフォルトの名無しさん:2007/04/24(火) 12:17:26
kusakabe乙
668デフォルトの名無しさん:2007/04/24(火) 12:34:55
万年火病を起こしている中年k○s○k○b○
669デフォルトの名無しさん:2007/04/24(火) 16:14:02
いやこりゃ質問者が悪いよ。
2chならネタ扱いで回答すらしてくれんのだから
まだマシじゃね?
670デフォルトの名無しさん:2007/04/24(火) 16:21:13
と、エピが申しております
671デフォルトの名無しさん:2007/04/24(火) 17:32:59
>>669
あれはどう見てもネタ師だろう。
問題設定も質問内容もあまりに稚拙過ぎる。
スルー力が足りないのではないか、と。
672デフォルトの名無しさん:2007/04/24(火) 17:40:25
常識を下方向に本気で逸脱している人間って、割といるからな。
そう簡単にネタとか言い切れないものがある。
673デフォルトの名無しさん:2007/04/24(火) 17:43:10
勉強したいから本紹介しろ、でもずうずうしいのに、
こいつときたら「テキスト」紹介しろ、だぜぇ?
レスはぽんぽん付ける癖に、
問題解決する気は全然ないしwww

どう見ても2ちゃんでいつも暴れてる単発質問厨だろ
674デフォルトの名無しさん:2007/04/24(火) 17:46:05
いやしかし、初心者があのサイトにたどり着けるんかな。
ネタの可能性も捨てきれない。
俺は初めて知った。
C#やらないからかな。
ランキングが有名人ばかりで笑った。
675デフォルトの名無しさん:2007/04/24(火) 17:49:05
匿名で他人のコミュニティ引っ掻き回すのが趣味の狂人だろうな
676デフォルトの名無しさん:2007/04/24(火) 18:38:22
17:33分から49分までの16分間に擁護レスが5件か。
677デフォルトの名無しさん:2007/04/24(火) 18:59:04
まあそう僻むな。
深夜2時〜5時台の連続レスや
過疎スレの不自然な質疑応答と比べりゃ
よっぽど健全だろw
678デフォルトの名無しさん:2007/04/24(火) 20:27:08
てかどの辺が擁護なのかまるでわからないんで
説明してくれ
679デフォルトの名無しさん:2007/04/24(火) 20:29:01
結論:エピ工作乙
680デフォルトの名無しさん:2007/04/24(火) 20:34:47
エピも立派な基地外である事が証明されますた
681デフォルトの名無しさん:2007/04/24(火) 20:37:16
匿名で有名人叩くのが趣味とはとんでもねぇ狂人だな
682デフォルトの名無しさん:2007/04/24(火) 20:44:12
有名人にはキチガイが多いんだよ
683デフォルトの名無しさん:2007/04/24(火) 21:40:12
カオスな状況には拒絶反応出るのが職業柄なら、
ダラダラ下らん事話すのは気にならないのも職業柄だな。
684デフォルトの名無しさん:2007/04/24(火) 22:06:17
みんな気が済んだらそろそろ相談室に戻ろうぜ。
685デフォルトの名無しさん:2007/04/24(火) 22:23:15
ていうか、本題のネタがないんだよ。
個人的には好きなんだが、明らかにこのスレのタイトルは失敗だったね。
前スレと比較して、どうみてもこのスレタイのせいで質問が減ってるだろ。
686デフォルトの名無しさん:2007/04/24(火) 23:34:03
凝ろうとしたのがあだになったんだな
1を責める気は無いけど
687デフォルトの名無しさん:2007/04/25(水) 21:41:42
ぶっちゃけ2chで質問するメリットなんてほとんどない
688デフォルトの名無しさん:2007/04/25(水) 21:43:41
基地外がレスしてきたら少なくともスルーしよう
689デフォルトの名無しさん:2007/04/26(木) 00:12:41
stringstreamでlexical_castみたいなの作ったのだが、
みんなが遅い遅い言うもんだからatofとかに変えたら
返って遅くなった。
STL伊達じゃない
690デフォルトの名無しさん:2007/04/26(木) 00:21:35
さぁみんなネタ作って速く埋めようぜ!

次スレタイトルは
dynamic_cast<part57>(C++相談室)
691デフォルトの名無しさん:2007/04/26(木) 00:50:43
真夜中だってのに元気だね
692デフォルトの名無しさん:2007/04/26(木) 01:10:42
>>690 元の奴でいいよ。
693デフォルトの名無しさん:2007/04/26(木) 23:31:33
つい癖で
for(int i=0;i<max;i++)
と書いてしまいますが、
i++ は ++i としたほうがやはり速いのでしょうか?
694デフォルトの名無しさん:2007/04/26(木) 23:41:19
>>693
速度は実測が基本。
int なら差はでないだろうとは言える。
695デフォルトの名無しさん:2007/04/27(金) 00:03:45
何で差がないの?
696デフォルトの名無しさん:2007/04/27(金) 00:22:15
>>695
何で差がでるの?
697デフォルトの名無しさん:2007/04/27(金) 00:25:12
#define int unko
だから
698デフォルトの名無しさん:2007/04/27(金) 01:03:04
前々スレあたりでやった気がするな
速い遅いではなく、そうする意味で考えろという結論に達していたようなうやむやになったような
699デフォルトの名無しさん:2007/04/27(金) 09:52:02
まあそんなこと気にしても、一生の間動かしても
ここに書き込んだ時間より差が出ることはないな
700デフォルトの名無しさん:2007/04/27(金) 10:00:15
差があるかどうかを聞くより、どんな時に差が出るのかを聞いたほうが話が早いな。
701デフォルトの名無しさん:2007/04/27(金) 10:45:57
よっぽどなコンパイラじゃない限り、整数型変数を単独でインクリメントする目的なら同じコードを出力する。
702デフォルトの名無しさん:2007/04/27(金) 11:27:34
i++とか見ると、素人くさいなと思う。
703デフォルトの名無しさん:2007/04/27(金) 11:44:32
玄人はどう書くのか、聞いてもいいか?
704デフォルトの名無しさん:2007/04/27(金) 11:46:18
チェック柄のやつらに一言言いたい


シャツをズボンに入れるな。出せ。
それだけでかなり変わる。
705デフォルトの名無しさん:2007/04/27(金) 11:59:07
シャツをズボンから出して良いのはお子様だけだ
706デフォルトの名無しさん:2007/04/27(金) 12:23:13
>>703
悪くはないだろうけど、今度は日本語の素人、あるいは論理の素人くさいな。
707デフォルトの名無しさん:2007/04/27(金) 12:25:25
> 論理の素人くさいな

素人くさいな
708デフォルトの名無しさん:2007/04/27(金) 12:26:36
背景知識が欠如している人間が知ったかかますのを指して
「論理の欠如」って言うのって、それなんて火病?
709デフォルトの名無しさん:2007/04/27(金) 12:36:56
>>704
韓国人と日本人を見分けるポイントの一つらしいからな。
(もうひとつは髪型)
710デフォルトの名無しさん:2007/04/27(金) 12:40:23
スレタイも空気も読めないのが異常者の特徴
711デフォルトの名無しさん:2007/04/27(金) 15:20:55
オナホとバイブがセックス
712デフォルトの名無しさん:2007/04/27(金) 20:04:16
++i
713デフォルトの名無しさん:2007/04/27(金) 20:07:59
++iにする理由って不変な表明とかいうのと関係あるの?
714デフォルトの名無しさん:2007/04/27(金) 20:49:44
一度イテレータを自作してみれば分かるよ。
715デフォルトの名無しさん:2007/04/27(金) 21:17:30
アッ―!!
増加前のコピーを作ってそれを返すことによるオーバーヘッドが問題になるのか
716デフォルトの名無しさん:2007/04/27(金) 21:20:53
そういうこと。
まあ、イテレータじゃないと問題にならないけど。
717デフォルトの名無しさん:2007/04/28(土) 11:05:00
>>704
俺の女友達が同じことを言ってたな
718デフォルトの名無しさん:2007/04/28(土) 12:59:27
私服とビジネスカジュアルを混同してはいけませんよ糞餓鬼ども
719デフォルトの名無しさん:2007/04/28(土) 13:09:16
ドレスコードが厳しいとファッションセンスがもろに出るので
常にスーツですが何か
720デフォルトの名無しさん:2007/04/28(土) 13:24:21
++iとi++の差が気になるような状況でforループってのがそもそも
721デフォルトの名無しさん:2007/04/28(土) 13:57:19
“時期尚早に最不適化をしない”っつうし、意味もなく悪いスタイルを採用するのは止めたほうがいいね
訳も判らずスタイルを真似するだけっつうのも問題だけど、天邪鬼よりよっぽどマシ。
722デフォルトの名無しさん:2007/04/28(土) 14:18:55
つ最不適化
つ天邪鬼
723デフォルトの名無しさん:2007/04/28(土) 14:32:51
どっちの話題も実害がなきゃいいよ。
「俺にとって目障りなのは実害」って話はどっか隔離スレでやってくれ
724デフォルトの名無しさん:2007/04/28(土) 15:17:57
ループカウンタのインクリメントに++iを使うのは悪いスタイルなの?
725デフォルトの名無しさん:2007/04/28(土) 15:19:58
いや別に
726デフォルトの名無しさん:2007/04/28(土) 15:30:14
>>724
無意味に i++ を使うのが悪いスタイル。
727デフォルトの名無しさん:2007/04/28(土) 15:45:39
++iが自然な書き方って前提なんだな
728デフォルトの名無しさん:2007/04/28(土) 15:46:46
ぬるぽの話題ここまで
729デフォルトの名無しさん:2007/04/28(土) 15:58:18
結局ここって「初心者の質問を火種にして中級者どうしで荒れるスレ」だよな
730デフォルトの名無しさん:2007/04/28(土) 16:00:18
>>727
俺は自分のソースにはそういう縛りをあえて持ち込んでるな。
無作為に書き方を選ぶより、i++に必ず「そうじゃなくちゃいけない理由」を持たせたほうが、
まぁ僅かではあるけど、読んだ時に理解が早いし。
窮屈な思いを強いられる縛りなら適用も慎重になるけど、この縛りは別にそんなこともないしね。

まぁ細かい話だし、各人好きにすりゃいいことだと思うけど。基本的には。
731デフォルトの名無しさん:2007/04/28(土) 16:14:40
i=0ではiが左側、だから次の文でもiを左側にしてi<N、
そうなりゃ次の文でもiを先頭に置きたくなるのは変なことじゃないし無意味とは言わない。

それを抑えて全部++iにしたきゃそうすりゃいいし
本能に任せて適当に書くときはi++ってしてもいい。
732デフォルトの名無しさん:2007/04/28(土) 16:19:51
>>728同意
このネタはそんなひきずるべきネタではなく、
単にIteratorの実装上は違いが出るね、
でおしまいだろう。なんでつまらない話をズルズル引きずるんだ
733デフォルトの名無しさん:2007/04/28(土) 16:30:34
自分の習慣を改めるべきだと認めたくない人が居るから。
734デフォルトの名無しさん:2007/04/28(土) 16:37:02
一応マジレスすると、C言語レベルでは
++iは、本体実行前にインクリメント
i++は、本体実行後、次のループに移る前にインクリメント
という差があるだけ。
改めるとか改めないとか言い出すべき問題ではない。

もしかして、do{}while() は全廃して while(){} に統合すべきだ
とか下らないコダワリを主張したい人?
735デフォルトの名無しさん:2007/04/28(土) 16:38:38
習慣なんて、学習の糧を得た身からひり出た糞でしかないのにな。
736デフォルトの名無しさん:2007/04/28(土) 16:40:25
変なのがへばりついてるな
737デフォルトの名無しさん:2007/04/28(土) 16:43:31
スレタイも読めない馬鹿がいらっしゃるようだしな
738デフォルトの名無しさん:2007/04/28(土) 16:51:15
でもお前らvoid main()とか書かれたらどうせ噛み付くんだろ
739デフォルトの名無しさん:2007/04/28(土) 16:52:48
馬鹿にするだけで噛み付きはしないだろうな。
740デフォルトの名無しさん:2007/04/28(土) 17:47:07
どうせとか言い出した時点で負けだろ。
息をお引き取りください。
741デフォルトの名無しさん:2007/04/28(土) 18:28:50
これはひどい
742デフォルトの名無しさん:2007/04/28(土) 18:56:45
C++的にはvoid main()は許容範囲内
743デフォルトの名無しさん:2007/04/28(土) 19:20:33
組み込みならよくある話
744デフォルトの名無しさん:2007/04/28(土) 19:37:40
>>742
デマを流すな。
3.6.1p2 より
"It shall have a return type of type int, but otherwise its type is implementation-defined."

C++ FAQ のコレが好き。
"main() must return int. Not void, not bool, not float. int. Just int, nothing but int, only int."
745デフォルトの名無しさん:2007/04/28(土) 19:43:01
次のプログラム例

std::string str1;
while (getline(std::cin, str1)) {
  // .... 何か実行文 ....
}

できれば、次の例のように、getline関数の戻り値と同じ型
の変数を間に通して処理したいと思ったけれど。

std::string str1;
型 r = std::getline(std::cin, str1);
while (r) {
  // .... 何か実行文 ....
  r = std::getline(std::cin, str1);
}

rの型は、std::basic_istreamかと思ってそれで宣言すると
「クラスのテンプレート名で仮引数リストの指定がありま
せん。」と言われてコンパイルエラーになるし。

困ったもんだ。基本的なところのように思えて、すごく難しいな。
同じ型の変数を宣言しようとなんか考えたら、C++の完璧な知識が
必要なのか。
746デフォルトの名無しさん:2007/04/28(土) 19:51:37
処理系定義なら未定義よりはマシだな。
747デフォルトの名無しさん:2007/04/28(土) 20:12:23
>>745
bool でいいんじゃね?っていうか、その置き換えの意味が分からん。
748デフォルトの名無しさん:2007/04/28(土) 20:13:15
>>746
何の話?
749デフォルトの名無しさん:2007/04/28(土) 20:37:54
>>745
std::basic_istream<char>もしくはそのtypedefであるstd::istream
750デフォルトの名無しさん:2007/04/28(土) 20:47:52
つうか普通にドキュメントにプロトタイプ書いてあるだろ
意味がわからん
751デフォルトの名無しさん:2007/04/28(土) 20:53:23
>>745は「標準ライブラリの関数の戻り値を調べる方法は無い」とか、
あるいはそこまでいかずとも、「調べずに使うのが普通で、調べるのはちょいと特殊な行為」
くらいには思ってそうな気がする。
752デフォルトの名無しさん:2007/04/28(土) 21:07:03
>>745
マジレスするとC++使うのは100年早い。
今のお前に解決法教えてもそれを実行できるとは思えない
753デフォルトの名無しさん:2007/04/28(土) 21:13:32
>>745
何考えてるんだ
初歩的な問題集でも一通りやってみなよ
すぐわかるから
754デフォルトの名無しさん:2007/04/28(土) 21:23:49
>>734
>一応マジレスすると、C言語レベルでは
C++言語レベルでは、一時コピーを作るかそうでないかの意味だろか。
755デフォルトの名無しさん:2007/04/28(土) 21:26:07
既存のセマンティクスを無視して後置インクリメント演算子で*thisを返すクラスがあってもいいじゃない
756デフォルトの名無しさん:2007/04/28(土) 21:28:43
>>755
そんなアホ仕様なら何も返さない方がまだマシだ。
757デフォルトの名無しさん:2007/04/28(土) 21:36:32
MSDNやF11で標準図書館のファイルに入ってgetline調べてみてstd::basic_istreamかと思ったけど、
正解には至らんかった。
キーワードtemplateもあったし、その学習も必要かの。
758デフォルトの名無しさん:2007/04/28(土) 21:59:19
std::istreamクラスに=演算子って定義されてたっけ?
759デフォルトの名無しさん:2007/04/28(土) 22:09:14
ないね。
でもstd::getlineは参照を返すからそれで受ければいいと思う。
760デフォルトの名無しさん:2007/04/28(土) 22:11:38
そうか、クラスを返すのだから、初期化するためのコンストラクタを調べるのが解決の鍵か。
761デフォルトの名無しさん:2007/04/28(土) 22:11:49
>>759
参照じゃ代入できないよ。
762デフォルトの名無しさん:2007/04/28(土) 22:19:31
代入しろなんて書いてないみたいだけど
763デフォルトの名無しさん:2007/04/28(土) 22:27:37
>>734
一応マジレスすると、
本体実行ではなく、ループ継続の判定実行
764デフォルトの名無しさん:2007/04/28(土) 22:31:54
>>762 r = std::getline(...
765デフォルトの名無しさん:2007/04/28(土) 22:34:18
>>757
ここはお前のチラシの裏じゃねえんだ
766デフォルトの名無しさん:2007/04/28(土) 22:46:27
>>745
そもそも何でgetline()の戻り値を変数に一時蓄えたいと思ったのか
よくわからんが、↓のようにすれば一応出来る。
ただし、リファレンスなので、初期化は可能だが再代入ができないので注意。
再代入がしたければ、かわりにポインタを用いて
std::istream *isp = &std::getline(std::cin, s);
とでもするんだな。

#include <iostream>
#include <string>

int main()
{
    std::string s;
    for (;;) {
        std::istream& isr = std::getline(std::cin, s);
        if (!isr) break;
        std::cout << s << std::endl;
    }
    return 0;
}
767デフォルトの名無しさん:2007/04/28(土) 22:48:02
C++のIO図書館でファイルを開く方法をヒントとして思い付かなかったのは不覚だ。
768デフォルトの名無しさん:2007/04/28(土) 22:53:09
うひょー
769デフォルトの名無しさん:2007/04/28(土) 22:58:11
>bool でいいんじゃね?っていうか、その置き換えの意味が分からん。
>そもそも何でgetline()の戻り値を変数に一時蓄えたいと思ったのか
他の言語でデバッグの利便性や、後から拡張するときのために、そういう
書き方を習慣にしてる。
770デフォルトの名無しさん:2007/04/28(土) 23:04:32
そして、あくまでgetlineは一つの例として出しただけ。
それだけ特別というわけではない。
771デフォルトの名無しさん:2007/04/28(土) 23:05:27
>>769
ほんとで必要なのがわかる場面でなけりゃ、やめてほしい。
772デフォルトの名無しさん:2007/04/28(土) 23:26:25
functional周りではどうしてるんだろう…
773デフォルトの名無しさん:2007/04/28(土) 23:28:20
STLでstrtokみたいなことが出来る関数ってありますか?
774デフォルトの名無しさん:2007/04/28(土) 23:39:34
>>773
boost::stringtok
775デフォルトの名無しさん:2007/04/28(土) 23:42:48
>>STLで
776デフォルトの名無しさん:2007/04/28(土) 23:46:50
boost使うのが嫌けりゃ自作しろ
777デフォルトの名無しさん:2007/04/29(日) 01:03:37
>>755
つstd::insert_iterator
778デフォルトの名無しさん:2007/05/01(火) 13:47:55
Loki 0.1.6のSmartPtr.hppの1308行目に
return OP::template Merge( rhs );
とあるのですが、このtemplateって一体何者ですか?
779デフォルトの名無しさん:2007/05/01(火) 15:38:38
Mergeがテンプレートであることを明示

typenameみたいなもん
780デフォルトの名無しさん:2007/05/01(火) 15:43:50
じゃあなくても問題ないってことですか?
781デフォルトの名無しさん:2007/05/01(火) 16:13:42
この手の宣言は入れないとエラーするから入れてあるんだと思うけど。
782デフォルトの名無しさん:2007/05/01(火) 16:21:47
はじめて知った・・・

typenameは知ってたけど
templateはどんな時につけなきゃいけないんだろ

コンパイラがMergeをテンプレートであると一意に解釈できない場合があるって事かな
783デフォルトの名無しさん:2007/05/01(火) 16:25:01
はじめて知った・・・
784デフォルトの名無しさん:2007/05/01(火) 17:39:25
存在はしってたけど、自分で使うハメになったとない。
複雑sなtemplateあんまり書かないからだろうけど。
785デフォルトの名無しさん:2007/05/01(火) 18:15:59
struct Foo
{
  template <int T> static void a(int x){}
  static int const b = 0 ;
} ;

struct Bar
{
  static int const f = 0 ;
} ;

//コンパイラ「テンプレート関数呼び出しのようだな、よしよし」
Foo::template a<1>(0) ;

//コンパイラ「ええと、bと1を<演算子で比較するのと、>演算子で0と比較するのか。無意味に括弧使っているけどオッケー」
Bar::b< 1 >(0) ;
786デフォルトの名無しさん:2007/05/01(火) 18:19:02
instance.template func<hoge>(arg)
以前、こう書かないとコンパイルできない状況に遭遇したことがある。
多分、gccのバグか何かで。(うろ覚え)
787785:2007/05/01(火) 18:25:15
なんかレス思考中の無駄なコードが混じった。
>>786
規格通りでは?
788デフォルトの名無しさん:2007/05/01(火) 18:31:55
>>785
つまり
struct Foo {
    template <int> void f(int) {}
};
ってあったときに
Foo::f<0>(0)が>>785の下のように解釈されちゃうってことか

Foo::template f<0>(0)とするとそう解釈されなくなると
VC8だとどっちでも通ったけどgccとかだとダメなのかな?
かといってtemplateをつけて書くようにすると逆に昔の
コンパイラで通らなくなるような気がする
789786:2007/05/01(火) 18:35:23
ぬ、規格通りなのか。すまん。w
790デフォルトの名無しさん:2007/05/01(火) 18:36:28
>>788
g++ でも通った。

というかこれ、OP が typename テンプレート引数の場合のみで使われる文法だと思う。
791デフォルトの名無しさん:2007/05/01(火) 18:39:19
>>790
直接テンプレート引数じゃなくても、テンプレート引数に依存してたら要るよ。
792デフォルトの名無しさん:2007/05/01(火) 18:41:32
>>790-791
kwsk
793デフォルトの名無しさん:2007/05/01(火) 18:42:28
>>791
ああ、それもそうやね。

>>792
こういうことだと思う。

#include <iostream>
using namespace std;

class A {
public:
  template <typename T> class B {
  public:
    static T foo() {
      return '0';
    }
  };
};

template <typename T> class C {
public:
  static void bar() {
    cout << T::template B<int>::foo() << endl;
    cout << T::template B<char>::foo() << endl;
  }
};

int main() {
  C<A>::bar();
}
794デフォルトの名無しさん:2007/05/01(火) 18:45:56
これは確かに使いどころが発生しづらいな。
795デフォルトの名無しさん:2007/05/01(火) 18:48:59
>>793
これはつまりtemplateをつけないとBがtemplateかどうかわからないから
templateってつけないとB<int>とかB<char>って書けないっていうこと?

でもそれだと>>778のはtemplateいらないな・・・
796デフォルトの名無しさん:2007/05/01(火) 18:53:48
>>795
Loki のコードは見てないが、
OP がテンプレート引数で
Merge が関数テンプレートで
rhs の型がテンプレート引数に依存してるんじゃないの?
797デフォルトの名無しさん:2007/05/01(火) 19:04:07
>>796
rhs は関係ないだろ。
798デフォルトの名無しさん:2007/05/01(火) 19:12:27
>>793のはB<>って書いてるからtemplateが必要
って気がするけど、>>778templateであることを
明示する必要ないと思うんだけど
何か根本的な勘違いをしている・・・?
799デフォルトの名無しさん:2007/05/01(火) 19:36:19
例えば・・・

#include <iostream>
using namespace std;

class A {
public:
  template <typename T> static int Merge(T n) { return n; }
};

template <typename OP, typename T> class C {
public:
  static int hoge(T rhs) { return OP::template Merge(rhs); }

  static const T n = '0';

  static void bar() {
    cout << static_cast<T>(hoge(n)) << endl;
  }
};

int main() {
  C<A, char>::bar();
  C<A, int>::bar();
}

template なしでも通るみたいだけど。

template と書いてあったら
Merge が関数テンプレートでない場合には
通らないという違いが発生して良さそうだと思ったんだけど、
g++ だと通っちゃうな・・・。規格だとどうなってるんだろ。
800デフォルトの名無しさん:2007/05/02(水) 18:57:11
「相談室」って頼りない名前だな。
「C++言語なら俺に聞け」のタイトル名にはならんのかね。
801デフォルトの名無しさん:2007/05/02(水) 19:26:03
たぶんならないだろう。
802デフォルトの名無しさん:2007/05/02(水) 19:30:08
こんな感じか?

C++なら、俺に聞け!
1 名前: ビル・ジョブス

おれは禿。今までC++でプログラムを一生懸命作ってきた。
スクリプト言語は知らないがC++なら誰にも負けない...
803デフォルトの名無しさん:2007/05/03(木) 01:08:35
「C with classes part**」
でいいじゃん
804デフォルトの名無しさん:2007/05/03(木) 02:19:32
C with classes
1 名前:禿 投稿日:1979/03/??(?) ??:??:??
暇なんでCみたいだけどネットワークトラフィック解析にふさわしいツールつーのを
作ってみるわ。もちろんUNIXネイティブな。少しまちなー。

2 名前:禿 投稿日:1979/??/??(?) ??:??:??
暇つぶしにぬぼーと新しいツールを設計中。

現状では、Simulaと似たパラダイムだけどあれと同じだと重そうなんで
コンパイラはCと同じだけど、C with Classesはソースを
単にマクロで置き換えてCコンパイラに丸投げする方法を予定。


19 名前:禿 投稿日:1979/10/??(?) ??:??:??
あげちったい(T_T)
805デフォルトの名無しさん:2007/05/03(木) 03:12:47
細かいことだが、正しくは C with Classes だろ。
806デフォルトの名無しさん:2007/05/03(木) 11:57:46
コンテナについて質問です。

下記のようなクラス構成があったとして、
ひとつのコンテナにProductAとProductBを一緒に詰め込む
ことはできますか?

混在しているProductA/ProductBを
基底クラスの参照で取り出して、順次処理を行いたいのですが…。

class ProductBase{
virtual void Get() = 0;
}

class ProductA : public ProductBase{
void Get(){ // ProductA固有の処理; };
}

class ProductB : public ProductBase{
void Get(){ // ProductB固有の処理; };
}
807デフォルトの名無しさん:2007/05/03(木) 12:14:42
>>806
ProductBase* のコンテナを作るのが基本。
boost::shared_ptr<ProductBase> のコンテナにすると楽ができる。
今なら boost::ptr_container が便利かもしれない。
808デフォルトの名無しさん:2007/05/03(木) 12:21:35
>>806
生のポインタだとこんな感じ
807のが良いと思うけど
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
class ProductBase{
public:
virtual ~ProductBase () {}
virtual void Get() = 0;
};
class ProductA : public ProductBase{
void Get(){ /* ProductA固有の処理; */ }
};
class ProductB : public ProductBase{
void Get(){ /* ProductB固有の処理 */ }
};
struct Delete{
template <typename T> void operator () (T *p) {delete p;}
};
typedef vector <ProductBase *> Container;
int main ()
{
Container container;
container.push_back (new ProductA ());
container.push_back (new ProductB ());
for_each (container.begin (), container.end (), mem_fun (&ProductBase::Get));
for_each (container.begin (), container.end (), Delete ());
return 0;
}
809806:2007/05/03(木) 12:57:29
>>807
>>808
レスありがとうございます。
試してみます。
810デフォルトの名無しさん:2007/05/03(木) 20:45:06
テンプレートの仕様ってとてもコンピュータ言語の仕様とは思えないんですが、
何考えてあんな阿呆みたいな事(学生の思いつきレベル?)やってるんでしょうか。
811デフォルトの名無しさん:2007/05/03(木) 20:47:10
>>810
何が不満で、自分だったらどういう仕様にするのかを語ってくれ。
812デフォルトの名無しさん:2007/05/03(木) 20:48:45
>>810
嫌ならC++使うのやめれ。STLも使うな。
813デフォルトの名無しさん:2007/05/03(木) 20:54:44
文法的に汚いのは分かるが、
テンプレートの重要性が分からない奴は池沼
814デフォルトの名無しさん:2007/05/03(木) 20:57:00
>>811
あれを見て、いかに阿呆かもわからず使えてしまうような人間には
説明しても無駄なので、却下します。自分の頭で考えて下さい。

>>812
好き嫌いだけで動ける人の発想は柔軟でいいですね。
自宅警備員が趣味でやっているぶんにはそれでいいのかもしれませんね。
815デフォルトの名無しさん:2007/05/03(木) 20:59:08
  |   |  | |   |    |  | |   |   |   || | |
  |   |  | レ  |    |  | |   |  J   || | |
  |   |  |     J    |  | |  し     || | |
  |   レ |      |  レ|       || J |
 J      し         |     |       ||   J
             |    し         J|
             J                レ
     /V\
    /◎;;;,;,,,,ヽ
 _ ム::::(l|l゚Д゚)| …うわぁ
ヽツ.(ノ::::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'
816デフォルトの名無しさん:2007/05/03(木) 21:01:48
結局具体的な指摘は無しかよツマンネ
817デフォルトの名無しさん:2007/05/03(木) 21:04:14
810はテンプレートに親を殺されたんだよ
みんなそれぐらい文章から読み取れよ

うんうん、>>810は全て正しい
語ることもなにもないな
818デフォルトの名無しさん:2007/05/03(木) 21:15:24
Javaの存在意義が分かる書き込みだな
819デフォルトの名無しさん:2007/05/03(木) 22:28:41
>>814
可哀想に貴方は自宅警備員なんですか。
820デフォルトの名無しさん:2007/05/03(木) 22:56:05
いいえ、家事手伝いです。
821デフォルトの名無しさん:2007/05/03(木) 22:58:54
いいえ、手伝いません。
822デフォルトの名無しさん:2007/05/03(木) 23:01:38
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
823デフォルトの名無しさん:2007/05/03(木) 23:10:03
>>810
ある程度のことは「C++の設計と進化」という本に書いてある。
原作が出版されたのは、ISO規格が出るか出ないかという頃で結構古いけど。

俺が思うに、当時メタプログラミングに関して大した前例が無く、
その可能性に対してC++のテンプレートはあまりにも拙過ぎるということが
誰も判らなかったのだと思う。
あと、例によってCとの互換性が大きく立ちふさがったというのも一因に違いない。
824デフォルトの名無しさん:2007/05/03(木) 23:14:14
>>817
質問に対する反応として、それは全面的に間違っていますね。
ある事実を提示しているのではなく、その件に関して「どういう事実があるのか」を
問うているわけですから。

もうちょっと頭を使って噛み付いてください。
825デフォルトの名無しさん:2007/05/03(木) 23:15:40
>>824 たのむからコテハンつけてくれ。
826デフォルトの名無しさん:2007/05/03(木) 23:16:34
>>819
いえ、自宅警備員ではないので好き勝手にはできない、という意見が書いてあるわけです。
これは学年でいえば、小学4年生くらいなら正しく読み取れなくてはいけないところですね。
827デフォルトの名無しさん:2007/05/03(木) 23:17:59
template のヘルプを見たら
将来の為に予約されていますと書いてあった時代が懐かしい。
828デフォルトの名無しさん:2007/05/03(木) 23:19:31
>>823
そうですね、「想像しきれなかったもの」がすごくたくさんあったのだろう、というのは
とても腑に落ちる話です。
829デフォルトの名無しさん:2007/05/03(木) 23:20:08
うざいので続きはVIPでやってくれ
830デフォルトの名無しさん:2007/05/03(木) 23:20:17
>>825
お断りします。
831デフォルトの名無しさん:2007/05/03(木) 23:22:18
D の template はどうだろう?
832デフォルトの名無しさん:2007/05/03(木) 23:22:33
>>829
この話題に支持が集まった結果として話題が続いているわけですから、
あなたの感じる個人的な「うざさ」など無力なのです。
833デフォルトの名無しさん:2007/05/03(木) 23:27:00
>>827

exportを懐かしむ時代はこないだろうな。

おれは普通に経緯とか、メリットを聞きたかっただけなんだけど。
834デフォルトの名無しさん:2007/05/03(木) 23:28:57
auto_ptr<T> m_hoge;ってのがあったときに
こいつをぶっこして作り直す関数内でdelete m_hoge.release()ってしてから
m_hoge = auto_ptr<T>(new T(...))ってするのってリークしたりしてヤバいですか?
835デフォルトの名無しさん:2007/05/03(木) 23:38:48
メモリ破棄を自動化してるのに、何で自前で破棄するんだ。

というか、何故 reset を使わない?
836デフォルトの名無しさん:2007/05/04(金) 03:44:41
C++のテンプレートに萌え。
確実に。
837デフォルトの名無しさん:2007/05/04(金) 09:22:38
reset()だと m_hogeの実体もぶっこしてくれるんでそか?
ちなみにこれはある意味例外処理みたいなもんなんで、
他の部分では素直にauto_ptrタソの恩恵受けてます
838834=837:2007/05/04(金) 11:39:27
reset使って解決しました
resetで所有権を放棄した後に新たなオブジェクトをnewしてもちゃんと開放してくれるんですね…
やっぱスマポはすげーや
839デフォルトの名無しさん:2007/05/04(金) 12:49:42
>>838
順番逆。 new が成功した後に元のポインタが破棄される。例外安全って奴だ。
840デフォルトの名無しさん:2007/05/04(金) 20:06:56
JISCのサイトで、直接詳細画面のURLが示せるようになった?
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
841デフォルトの名無しさん:2007/05/05(土) 00:31:45
>>840
あ、画像じゃなくなってる。けどコピーや保存はできないね。
いくらか軽いのと、テキスト検索が効くのが今まで違うところか。
842デフォルトの名無しさん:2007/05/05(土) 00:34:08
いや、前から保存できる。
843841:2007/05/05(土) 00:35:25
あ、新しいやつも保存できた。前の画像のやつと入れ替えとこ。
844デフォルトの名無しさん:2007/05/05(土) 00:36:30
1ファイル目と2ファイル目の区切りが変なところだ
もともときりのいいような改ページなんてなかったけどさ
それだったら前みたいに1つのファイルで良かったのに
845デフォルトの名無しさん:2007/05/05(土) 00:40:03
どうせわざとだろ。テキストになってもクソ重いし。どうやったらこうなるんだ?
846デフォルトの名無しさん:2007/05/08(火) 22:27:15
http://seclan.dll.jp/c99d/c99d09.htm#dt19990705

>C++ では、inttypes.h を include する前に、
>マクロ __STDC_FORMAT_MACROS を定義した時だけ、
>これらのマクロが定義される。

と書いてあるんですが、
inttypes.h は C++ の規格にも含まれているという事なのでしょうか?
847デフォルトの名無しさん:2007/05/08(火) 23:55:41
>>846
現行の規格である 2003 にはまだ含まれていない。

>>3 の一番下のリンクから手に入るドラフトにはすでに記載があるので
おそらく次回の改定で含まれることになる。
・・・んだけど、 __STDC_FORMAT_MACROS についての記載が無いな。
どうなるんだろう。
848デフォルトの名無しさん:2007/05/09(水) 00:04:19
>>847
なるほど。long long とかも入るみたいですね。
こりゃ楽しみです。
849デフォルトの名無しさん:2007/05/18(金) 22:58:51
最新の C++ ドラフト見たら enum の最後の要素にコンマつけていいことになってますが、
GCC 4.0.1 だとエラーになります。
今の C++ の規格票ではまだつけていいことにはなってないのでしょうか?
850デフォルトの名無しさん:2007/05/18(金) 23:09:32
>>849 そうです。
851デフォルトの名無しさん:2007/05/18(金) 23:12:09
>>850
d
852デフォルトの名無しさん:2007/05/23(水) 23:45:39
cppUnitって実際どうなのでしょうか?
853デフォルトの名無しさん:2007/05/24(木) 00:53:53
けっきょくは主観でしょう。
854デフォルトの名無しさん:2007/05/25(金) 00:38:41
boost::testの方が好き >852
855デフォルトの名無しさん:2007/05/25(金) 03:38:22
UnitTest++とか色々あるよね
856Bjarne Stroustrupは神:2007/05/26(土) 23:16:41
明晰なCの血を引き且つ強力な柔軟性、多才性に富んだ、高速なネイティブを吐くC++を生み出したBjarne Stroustrupは神。
857デフォルトの名無しさん:2007/05/26(土) 23:21:34
なにこいつキモい
858デフォルトの名無しさん:2007/05/27(日) 00:34:03
人工無能っぽい
pythonスレでもでてた
859デフォルトの名無しさん:2007/05/28(月) 13:31:47
結婚すれば働かなくても夫が金稼いでくれるし
家事なんて一日2時間位でちょちょいとやればOK
仕事と違って往復の時間も無駄にならないのも大きい
子供も産めて家族と団欒出来るから孤独にならないし
結婚しないとか言ってる奴は負け組みwww
もっともっとメディアは恋愛至上主義の洗脳活動を頑張って欲しいな^^v
860こうですか?:2007/05/28(月) 14:41:24
誑し込めば働かなくても女が貢いでくれるし
家事だってかいがいしくやってくれる
仕事と違って往復の時間も無駄にならないので遊び放題
子供生ませると面倒だけど二股できるから孤独にならないし
結婚するとか言ってる奴はあほすぎwww
もっともっとメディアはギャンブル至上主義のパチンコ宣伝をがんばって欲しいな。
861デフォルトの名無しさん:2007/05/28(月) 18:30:46
>>860
むりすんな
862デフォルトの名無しさん:2007/05/29(火) 12:14:21
スレ違い
863デフォルトの名無しさん:2007/06/01(金) 17:52:56
struct xx {
 int len;
 char name[0];
};
いわゆる、可変長構造体のことなんだけど、
C89では最後のメンバーに0は不可、C99はサイズ0でも許されるようになった。
これはわかる。

では、C++では、サイズ0のメンバーはどうなの?
手元の処理系で
GCC(3.4)(-Wall) デフォルトだとC,C++とも警告なしでOK
BCC(5.6.4)(-W) Cだとコンパイルエラー、C++だと警告なしでOK
VC(2003の)(/W4) どちらも、「非標準だよ」という警告が出る

規格的にはどうなってるのか、知ってる人教えてくれ。
864デフォルトの名無しさん:2007/06/01(金) 18:04:29
>>893
C++だとダメだったはず。
次の規格でどうなるかは知らん。
865デフォルトの名無しさん:2007/06/01(金) 18:16:42
お、ありがとう。

やっぱ駄目なのか。
ついこの間まで、C++ではOKになったと思い込んでた。
866デフォルトの名無しさん:2007/06/03(日) 12:11:10
このスレのレベルが急速に低下してるな……
867デフォルトの名無しさん:2007/06/03(日) 12:18:28
sizeof を使わずに name の offsetof を使えば
name を除いたサイズが取得できる。
868デフォルトの名無しさん:2007/06/18(月) 01:25:03
class X {
public:
X( int i )i_(i){};
int i_;
};

Func0( X x ) { printf( "%d\n", x.i_ ); }
Func1( X &x ) { printf( "%d\n", x.i_ ); }

int main() {
Func0( X( 10 ) );
Func1( X( 10 ) );
return 0;
}

Func0はOK
Func1はコンパイルエラー

何でですか?
869デフォルトの名無しさん:2007/06/18(月) 01:34:26
>>868
コンパイラの言うことに耳を傾ければわかるよ。
870デフォルトの名無しさん:2007/06/18(月) 02:01:50
const X& x ならおk。

というか、戻り値の型は
871デフォルトの名無しさん:2007/06/18(月) 02:22:30
>>870
甘やかすなよ。本気で本人の為にならんぞ、それは。
872デフォルトの名無しさん:2007/06/18(月) 02:59:28
何で const X& x ならおkかまでは言ってないぜ。
873デフォルトの名無しさん:2007/06/18(月) 03:05:18
>>872
それでエラーが出なくなったら、せっかくのエラーメッセージを読む機会が潰れるだろ。
874デフォルトの名無しさん:2007/06/18(月) 07:08:46
こういう奴は、警告なんか平気で無視するからな。
875デフォルトの名無しさん:2007/06/18(月) 12:18:17
ぶっちゃけ、他人がどうなろうが不幸になろうが知ったことじゃない
876デフォルトの名無しさん:2007/06/18(月) 12:35:35
お前だけ妙に切り口が青いな。
877デフォルトの名無しさん:2007/06/18(月) 13:00:47
#include <cstdio>

class X {
public:
X( int i ) : i_(i){};
int i_;
};

void Func0( X x ) { printf( "%d\n", x.i_ ); }
void Func1( X &x ) { printf( "%d\n", x.i_ ); }

int main() {
Func0( X( 10 ) );
Func1( X( 10 ) );
return 0;
}

コンストラクタの所にメンバ初期化リストの形にして戻り値指定したら
constにしなくても通っちゃったよ?なんで??
878デフォルトの名無しさん:2007/06/18(月) 13:06:16
何も変わってないように見えるが
879877:2007/06/18(月) 13:15:13
error C3646: 'i_' : 不明なオーバーライド指定子です
error C2061: 構文エラー : 識別子 'i'
error C2091: 関数は関数を返せません。
とゴルァされたからメンバ初期化リストの形になるように : を追加(それ以前に前の形じゃ何やってるかイミフ、マジで解説欲しい)
X( int i )i_(i){}; → X( int i ) : i_(i){};


error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
warning C4508: 'Func0' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。
とゴルァされたから
Func0( X x ) → void Func0( X x )に変更

Func1も同様
880デフォルトの名無しさん:2007/06/18(月) 13:20:38
そもそも前の形じゃコンパイル通ってないんだから
解説しようがない。
881デフォルトの名無しさん:2007/06/18(月) 13:38:42
Aカップなのに見栄張ってBカップのブラ買っちゃったけど後で困っちゃってる子ってどう思う?
882デフォルトの名無しさん:2007/06/18(月) 14:05:49
俺が揉んで大きくしてあげたい
883デフォルトの名無しさん:2007/06/18(月) 19:18:01
>>879
まぁなんていうかCなりJavaでしばらく修行積んどけばおk。
明らかにプログラミングそのものに慣れてなさすぎる
884デフォルトの名無しさん:2007/06/18(月) 19:27:53
いやCと違って暗黙的に戻り値がvoidにならないこととかは分かってるよ
ただX( int i )i_(i){};の形のコンストラクタとか(どうせ:の付けわすれだろうが)、
あと>>870の意味がよくわからねぇconstにしなくても上記のもの直したらエラーでないし、
constにしても上記の点をそのままの状態ならエラーのまま
もしかして嘘言ってるのかな?と気になっただけ

まぁ経験不足ってのは否定しないけどね
885デフォルトの名無しさん:2007/06/18(月) 19:40:11
>>877
Borland C++使っている?
886868:2007/06/18(月) 20:09:56
なんかいきなりスレが加速してますが。
戻り値がないとか:が抜けてるとかはごめんなさい
適当に書いたんで。

聞きたかったのは
Func( X x(10) );
という形で、なんで
Funcの引数が値渡しならコンパイルが通って、
リファレンスだと通らないのかってことが聞きたかったんです。
887868:2007/06/18(月) 20:14:21
書き忘れです
g++4.1.2使ってて、
invalid initialization of non-const referenceってエラーです
constリファレンスじゃないとダメなのはなぜ?
888デフォルトの名無しさん:2007/06/18(月) 20:14:33
一時オブジェクトは非constな参照引数に渡せないって規格で決まってるから
889デフォルトの名無しさん:2007/06/18(月) 20:22:29
日頃過疎ってて、初心者が書き込むと一斉に群がる・・・
なんか悪い意味でcppllと同じ流れになってんな。
890デフォルトの名無しさん:2007/06/18(月) 20:26:54
この手のスレは自称中級者位が回答するから
891デフォルトの名無しさん:2007/06/18(月) 20:37:47
>>887
エラーメッセージのとおり、非const参照型のオブジェクトは、
左辺値でしか初期化できないことになっている。

void f(double& x)
{
  x = 1.;
}
ここでf(1)と呼出ができても何も有難味がない。
右辺値を渡せるとしたら当然次のコードもコンパイルできることになる。
int i;
f(i);
これは、iで初期化したdouble型の一時オブジェクトを作りそれをfへ渡すと解釈される。
そのため、iに1が代入されることは、決してない。
これはバグの温床になるということで、参照型オブジェクトを右辺値で初期化することは禁じられている。

逆にconst参照ではこういう心配が不要で、
また、関数を呼ぶときに、値渡しとconst参照との違いを意識させないためということもあって、
const参照は、右辺値でも初期化できることになっている。
892デフォルトの名無しさん:2007/06/18(月) 20:57:14
>右辺値を渡せるとしたら当然次のコードもコンパイルできることになる。
ここがよくわからない
右辺値の参照と、暗黙な型変換時のコピーが何故結びつくのか?
右辺値のポインタ渡しが危険って事は分かるけどそれと関係するの?
893デフォルトの名無しさん:2007/06/18(月) 21:13:52
>>892
暗黙の型変換は、変換後の型の一時オブジェクトを作るということ。一時オブジェクトは右辺値。
だから、f(1)もf(i)も、実引数に右辺値を渡しているという点では同じ。
894デフォルトの名無しさん:2007/06/18(月) 21:19:18
f(double&)にint変数を食わせた時に、昇格した一時doubleオブジェクトが
渡るなんて動作をするとしたら、C++の落とし穴を増やすだけ、って話でそ。
素直にコンパイルエラーになって欲しいだろ、と。
895883:2007/06/18(月) 22:35:31
>>884
いや868が写し間違えしまくったまま
コンパイルエラーに混乱してんのかと思った。

>877とかf(double&)にint食わせるとかはBorland C++ 5.0では警告が出るだけでコンパイル通ったはず。
手元のVC2k3はちゃんとエラーになる
896868:2007/06/19(火) 02:22:29
>>891
ありがとうございます。
良く考えられてますね。
写生しそうなくらい感動しました
897デフォルトの名無しさん:2007/06/22(金) 01:04:00
すいません、どなたかご存知でしたら教えてください。

template<?????? Method>
struct A {...};

の、このMethodにメンバ関数を突っ込みたいのですが、
どういう型として定義すればいいんでしょうか?

template<typename T,void (T::*Method)()>
struct A {...};

A<SomeClass,&SomeClass::SomeFunc> a;

というのは出来たのですが、これだと冗長なので

A<&SomeClass::SomeFunc> a;

としたいのですが…。
898デフォルトの名無しさん:2007/06/22(金) 02:28:37
boost::functionとboost::bindを使っても
boost::function< return_valuse(args) > f = boost::find(&T::Method, Instance);
だしなぁ
メンバ関数を扱うAにさらに引数と戻り値サポートさせるとなるとboost::functionを独自で実装する事になるし
あんまりやりたくない問題だ…
899デフォルトの名無しさん:2007/06/22(金) 02:42:59
ちなみに今のところ、冗長な問題についてはマクロで我慢しています。

MakeA(SomeClass,SomeFunc) a;

こんなところが妥協策でしょうか…
900デフォルトの名無しさん:2007/06/24(日) 02:35:05
>897
多分、本当にやりたいこと、を説明した方がいいアドバイスがもらえるような気がする。

とりあえず
1. 型自体はやっぱり冗長。
2. メンバ関数へのポインタは定数値ではなくコンストラクタで渡される。
3. メンバ関数の型に合わせて定義が増加。
で、良ければ↓みたいなのがある。

struct B { void func(void) {} };

template<typename T> struct A { } // dummy

template<typename T> struct A<void (T::*)(void)> { A(void (T::*method)(void)) { /* method の保存とか */ } };

template<typename T> A<T> MakeA(T t) { return A<T>(t); }

int main(void) { MakeA(&B::func); return 0; }
901デフォルトの名無しさん:2007/06/29(金) 16:29:28
脳内準boostのmove_ptrで
struct safe_bool_helper { int x; };
typedef int safe_bool_helper::* safe_bool;
という書き方をみたのですが「int safe_bool_helper::*」がワケワカメです
boost::shared_ptrでもtypedef T * this_type::*unspecified_bool_type;とありこちらも理解できません

「::」の後に「*」があるところが謎です

int main() {
 using namespace std;
 cout << typeid(safe_bool).name() << endl;
 return 0;
}
を実行してみても「int safe_bool_helper::*」と出力されました
902デフォルトの名無しさん:2007/06/29(金) 16:56:33
>>901
>「::」の後に「*」があるところが謎です
メンバ変数へのポインタ。
903デフォルトの名無しさん:2007/06/29(金) 16:56:57
メンバ変数へのポインタ型だね。あんまりいい例が思い浮かばないけど
#include <iostream>
struct A { int x; int y; };
typedef int A::*ptr_to_int_member;
int main() {
A a;
ptr_to_int_member ptim = &A::x;
(a.*ptim) = 1;
ptim = &A::y;
(a.*ptim) = 2;
std::cerr << "x=" << a.x << ", y=" << a.y << std::endl;
}
とかするとわかるかな?
904デフォルトの名無しさん:2007/06/29(金) 17:00:04
メンバ関数ポインタと仕組みは同じやね。
メンバ関数ポインタ以上に使わないけど。
905901:2007/06/29(金) 17:28:52
>>902-904
ありがとうございます
メンバへのoffset用の変数型と理解しました

(a.*ptim) = 1;という文法もはじめて見たのですが
a.*ptimがaのベースアドレス+offsetをして、そのアドレスに1が入るみたいな感じですね
906デフォルトの名無しさん:2007/06/29(金) 17:37:02
まあ、そんな感じだな。
907デフォルトの名無しさん:2007/06/29(金) 18:02:42
>>901
で、なんでそこにメンバへのポインタを使うかというと、
move_ptrやshared_ptrでもif (p)のように条件式で使うため。
しかし、operator boolを提供すると、bool b = p;のように余計なことまでできてしまうので、
メンバへのポインタ型をtypedefし、それへの変換演算子を提供することで、それを防いでいる。
908デフォルトの名無しさん:2007/06/29(金) 18:23:07
クラスのメソッドを関数ポインタみたいに指定して
配列に収めインデックス参照して実行するってことは可能ですか?


class Test{
public:
int type;

public:

void func00() { printf( "func00\n" ); }
void func01() { printf( "func01\n" ); }

void Run()
{
T p[] = {func00,func01};
p();
}
};

RunのTの部分に何を書けばいいのかわかりません。

やはり、staticなメソッドにして、引数にクラス渡して内部利用するしかないんでしょうか?
909デフォルトの名無しさん:2007/06/29(金) 18:33:31
まあなんとタイムリーなこと。
メンバへのポインタ使え。

void Run()
{
typedef void (Test::*pmemfn)();
pmemfn p[] = {&Test::func00, &Test::func01};
(this->*p[0])();
(this->*p[1])();
}
};
910デフォルトの名無しさん:2007/06/29(金) 18:36:59
>>909
おおー。いけました。
ありがとうございます。
911デフォルトの名無しさん:2007/06/29(金) 19:29:39
>>901-910の流れに和んだ
912デフォルトの名無しさん:2007/06/29(金) 19:51:38
こういうのもシンクロニシティの一種なんだろうなぁ。

おいらも908の質問みたいなのかかえて見に来たんだよ。
913デフォルトの名無しさん:2007/06/29(金) 20:23:59
まぁありがちな疑問だしね
914デフォルトの名無しさん:2007/06/29(金) 23:42:58
>>907
bool b = p; はできないとマズイだろ。
915デフォルトの名無しさん:2007/06/29(金) 23:47:21
!!p というタイプ数を犠牲にした代替手段がある一方で
bool への暗黙の変換はたとえば関数の引数を誤るような
バグなど発見しにくい問題を引き起こしうる
このトレードオフを考慮した結果 bool への暗黙の変換は
構文上禁止するほうが妥当という判断なんでしょう
916デフォルトの名無しさん:2007/06/29(金) 23:47:33
整数型として動き出すのを抑えるため、と言えばよかった
917デフォルトの名無しさん:2007/06/29(金) 23:49:05
面白い hack だな。
918デフォルトの名無しさん:2007/07/06(金) 15:25:57
以下のコードですがg++のバージョンによって通ったり通らなかったりします.
$ cat test.cpp
#include <vector>
using namespace std;
template <template <typename> class T> struct Hoge {};
int main ()
{
typedef Hoge <vector> Hage;
return 0;
}
Debian etchの4.1.2 20061115 (prerelease) (Debian 4.1.1-21)ですと問題ないのですが
自前ビルドの4.2.0でコンパイルすると
test.cpp: In function 'int main()':
test.cpp:7: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class> class T> struct Hoge'
test.cpp:7: error: expected a template of type 'template<class> class T', got 'template<class _Tp, class _Alloc> class std::vector'
test.cpp:7: error: invalid type in declaration before ';' token
と怒られます.
恐らくはデフォルトテンプレート引数の扱い方の違いが,両者に違いをもたらしていると思うのですが
規格的にはどちらが正しいんでしょうかね?
あと他のコンパイラだとどんな感じなんでしょうか?
919デフォルトの名無しさん:2007/07/06(金) 16:10:12
>>918 4.2での変更が原因かも

http://gcc.gnu.org/gcc-4.2/changes.html

>The (undocumented) extension which permitted templates with default arguments
>to be bound to template template parameters with fewer parameters has been removed.
920918:2007/07/06(金) 16:39:59
>>919
これみたいですね.
`extension'ってことは,gccの開発陣の見解では
918のコードは規格的にエラーとなるべきだということなんでしょうね
921デフォルトの名無しさん:2007/07/06(金) 21:02:22
横からすまんけど、
<typename>
ってどういう意味?
922デフォルトの名無しさん:2007/07/06(金) 21:12:08
>>921
プロトタイプ宣言の時にパラメータが省略されてるのと違うん?
923デフォルトの名無しさん:2007/07/06(金) 23:37:14
純粋仮想関数のぶんって仮想関数テーブル作られますか?
924デフォルトの名無しさん:2007/07/06(金) 23:41:44
多重継承が出来る以上、継承先で必ず定義されるとは限らないから、作られる。
925デフォルトの名無しさん:2007/07/07(土) 00:05:55
???
926デフォルトの名無しさん:2007/07/07(土) 11:26:09
>>923>>924
もっとくやしく
927デフォルトの名無しさん:2007/07/07(土) 13:31:35
>>923
なきゃ困るだろ。
928デフォルトの名無しさん:2007/07/07(土) 13:37:07
__declspec(novtable) っていうのもあるよ
929デフォルトの名無しさん:2007/07/07(土) 14:02:17
>>928
それはコンストラクタでvtableを初期化子ないだけで、領域は用意される。
930デフォルトの名無しさん:2007/07/07(土) 14:35:57
仮想関数のテーブルというかスロットは純粋仮想だろうがそうでなかろうが用意される。
中身は純粋仮想の場合入れようがないし入れようとさせるのは無理(抽象クラスのインスタンスは作れない)
931デフォルトの名無しさん:2007/07/07(土) 15:09:58
まあ、pure virtual callと叫んで死ぬための
ルーチンが入っていたりするけどね。
932デフォルトの名無しさん:2007/07/07(土) 15:12:49
そういえばそんなメッセージ出して落ちたエロゲーがあった
933デフォルトの名無しさん:2007/07/07(土) 15:25:01
俺は昔Photoshop 5.5でそのエラーを見た。むしろよくそんな面倒なエラーだせたもんだと感心してしまった。
934デフォルトの名無しさん:2007/07/07(土) 15:33:40
A Boneじゃしょっちゅうだぜ
935デフォルトの名無しさん:2007/07/07(土) 15:40:30
よくあるのは、デストラクタ・コンストラクタでpure-virtual-methodに
うっかりさわってしまった場合。
936デフォルトの名無しさん:2007/07/07(土) 20:00:11
コンストラクタ内で仮想関数を呼ぶのがあんまりよろしくないと思うけど
937デフォルトの名無しさん:2007/07/07(土) 21:16:19
アップキャスト・ダウンキャストをばりばりに駆使した壮絶プログラミングだったんじゃないのか
938デフォルトの名無しさん:2007/07/07(土) 21:34:58
>>932
バーチャコール言わせたいだけちゃうんかと
939デフォルトの名無しさん:2007/07/16(月) 18:39:05
>>932
で、落ちたのはお前なんだな。
940デフォルトの名無しさん:2007/07/17(火) 19:17:29
こんなことをしたいんだけど
●a.h
#include "b.h"
class a{
b* testB;
};

●b.h
#include "a.h"
class a{
a* testA;
};

普通にやるとコンパイル通らないんだが、いい方法ない?
941デフォルトの名無しさん:2007/07/17(火) 19:21:42
循環依存はまずいだろ・・・常識的に考えて
あとそれじゃ二重定義になるからそこの所を修正した前提で
とりあえず宣言だけしとけば良いんじゃないか

// a.h
class b;

class a {
b* testB;
};

// b.h
class a;

class b {
a* testA;
};
942デフォルトの名無しさん:2007/07/17(火) 19:21:45
classは両方ともaでいいの?
943デフォルトの名無しさん:2007/07/17(火) 20:42:21
すみません
●a.h
#include "b.h"
class a{
b* testB;
};

●b.h
#include "a.h"
class b{
a* testA;
};

の誤り。
944デフォルトの名無しさん:2007/07/17(火) 20:45:19
補足ですが、それぞれのincludeは2重読み込みしないように、ifdef設定してあります。

AはBを読み込もうとしますが、BもAを読み込もうとします。
ただ、どちらもclass宣言の途中に、もう一方のクラス設定が必要になります。
945デフォルトの名無しさん:2007/07/17(火) 21:00:40
946デフォルトの名無しさん:2007/07/17(火) 23:05:13
自己解決しました。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=920240&SiteID=7

●a.h
#include "i.h"

●b.h
#include "i.h"

●i.h
class a;
class b;

class a{
b* testB;
};

class b{
a* testA;
};

これでクラスの相互参照できました。
(この例だと、a.h m b.h は無くても良いですが)
947デフォルトの名無しさん:2007/07/17(火) 23:08:47
>>941
げ、941に回答あったし
948デフォルトの名無しさん:2007/07/18(水) 19:48:31
#pragma once
使っちゃだめ?
949デフォルトの名無しさん:2007/07/18(水) 20:10:12
#ifndef __XXX__
#define __XXX_
/* ほげほげぬるぽ */
#endif
の方が移植性があっていいかもネ
IDEのマクロ使えば#pragma onceと書くのと大差ない手間まで落とせるし
でも環境非依存のジェネリックなテンプレートライブラリとか作るんでなければどっちゃでもいいと思う
950デフォルトの名無しさん:2007/07/18(水) 20:21:00
移植性考慮するなら処理系予約の識別子を使うなよ。

俺の場合、やるときにはこれくらいやる。
#ifndef XXX
#define XXX

#ifdef _MSC_VER >= 1020
#pragma once
#endif

#endif
やらないときには、#importなどほかにもVC++限定の機能をどうせ使いまくっているので、
#pragma onceだけ使う。

951デフォルトの名無しさん:2007/07/18(水) 20:28:03
アッ 前置の__って予約だったんだ
今度から
zzyyxx_NAME_GUID_xxyyzz
みたいにしようっと^^

あと俺からも質問
↑の例のzzyyxx_はインテリセンスで最後に表示されるという変な理由からで
この性質を使ってクラスや関数のdetaiをzzz_name()みたいにしてるけどやっぱ駄目なのかな?
もし駄目なら代替案としてはどのようなもんがあるでしょか?
952デフォルトの名無しさん:2007/07/18(水) 20:54:05
名前空間
953デフォルトの名無しさん:2007/07/18(水) 21:36:01
演算子オーバーロード難しくてわかんないですっ!
954デフォルトの名無しさん:2007/07/18(水) 23:18:41
俺は後置 _ をつけておく。

#ifndef XXX_H_
#define XXX_H_

#endif // #ifndef XXX_H_
955デフォルトの名無しさん:2007/07/18(水) 23:20:43
>>953
例えば a + b は a.operator+(b) や operator+(a, b) という関数呼び出しに変換される。
どちらかが定義されていれば、その定義通りに実行される。
ただそれだけのことだ。
956デフォルトの名無しさん:2007/07/21(土) 08:29:19
前者がメンバ関数で後者がフレンド関数ですねっ!
うおおおお、なんだかわかってきたぞー!
でもわかったのと使いこなせるのは別の話だけど。
とりあえず演算子のオーバーロードの章は終わって
これから継承ですっ!
957デフォルトの名無しさん:2007/07/21(土) 08:36:39
必ずフレンドにしなきゃいけないわけでもないが、まあどうでもいい話か。
958デフォルトの名無しさん:2007/07/23(月) 05:33:32
CRTPを使った継承と、
普通のコンポジションとの使い分けを教えてください。
959デフォルトの名無しさん:2007/07/23(月) 06:58:43
>>958
CRTP なんて奇怪なコード、本当に必要だと説明できる場面でしか使うな。
960デフォルトの名無しさん:2007/07/23(月) 07:22:16
CRTP は mix-in の代わりとして使う。
961デフォルトの名無しさん:2007/07/23(月) 09:33:40
仮想関数難しすぎますっ
962デフォルトの名無しさん:2007/07/23(月) 09:52:50
アップキャストしても本来の型の関数が呼ばれるってだけの話。
963デフォルトの名無しさん:2007/07/23(月) 11:14:10
基本クラスのポインタで派生クラスを指すことができるのは
覚えるしかないんでしょうけど、
基本クラスのポインタで派生クラスのメンバにアクセスできないのに
仮想関数では派生クラスで再定義されたものが使われるっていうのが
納得できません。
これはもうそういうものだと覚えるしかないんでしょうか。
964デフォルトの名無しさん:2007/07/23(月) 11:56:55
「納得できない」って言葉は仕様や実装を理解した上で、その欠点をはっきり示す事ができ、よりよいモノを自分で提案できる場合にこそ使われるべきだと思うよ。
仕様や実装は理解できてるのかな?
965デフォルトの名無しさん:2007/07/23(月) 11:57:20
>>963
納得できないとか、覚えるしかないとか何を言いたいのかよくわからんが、
どのポインタとして扱われても本来の関数が起動される仕組みとして仮想関数が用意されているだけの話。
嫌なら仮想関数を使わなければいいだけじゃん。
966デフォルトの名無しさん:2007/07/23(月) 11:59:53
基底クラスが仮想関数を起動するってのは、あくまで自分のメンバである仮想関数を起動した結果、継承クラスの仮想関数が起動されるのであって、
直接継承したクラスの関数を起動するわけではない。
967デフォルトの名無しさん:2007/07/23(月) 13:25:07
>>963
そこが仮想関数の「便利」なところなんだぜ。

複数のクラス D, E, F, ... の共通部分を基底クラス B として提供しておけば、
その基底クラス B への参照やポインタを使って処理 X を 1 個だけ記述しておけば、
それから派生している全てのクラス D, E, F, ... に対してその処理 X を適用できる。
派生クラスごとに処理が変わる部分は、全て仮想関数で提供しておけばいい。

X が派生クラスのメンバに直接アクセスできないのはむしろ利点で、
X が派生クラスに依存しない形で書けているからこそ、
B の派生クラスであれば何であっても X で処理することができるのだ。
968デフォルトの名無しさん:2007/07/23(月) 18:58:52
実際のところ動的多態性が要求される場面ってそんなに多いか?
969デフォルトの名無しさん:2007/07/23(月) 19:17:56
ありまくり
970デフォルトの名無しさん:2007/07/23(月) 21:33:41
JISの規格を読みました。
派生クラスで再定義された仮想関数は
基底クラスの仮想関数を上書きするんですね。

本の説明の解釈の仕方・理解の仕方もちょっとまずかったみたいで
頭の中がぐちゃぐちゃになってたみたいです。

まだすっきりしないかんじはあるけど
なんとなくわかってきました。

ありがとうございました。
971デフォルトの名無しさん:2007/07/23(月) 22:28:56
C++からJAVAのオブジェクト(API)を利用する事ができますか?
972デフォルトの名無しさん:2007/07/23(月) 22:30:40
VM的なモノをつくればいけます
973デフォルトの名無しさん:2007/07/23(月) 22:35:21
>>971
JNI使えば可能。
974デフォルトの名無しさん:2007/07/23(月) 22:56:34
>>971
gcj限定でよければJNIよりCNIの方がエレガント
975デフォルトの名無しさん:2007/07/23(月) 23:22:57
C++からJAVA?
976デフォルトの名無しさん:2007/07/24(火) 11:52:27
僕をあなたのクラスのfriendにしてください><
977デフォルトの名無しさん:2007/07/24(火) 23:20:01
クラステンプレート難しすぎますっ!
978デフォルトの名無しさん:2007/07/25(水) 00:41:35
template class Tenpureito<T>
{
 T v_;
 const T get() const { return v_; }
 void set(const T& v) { v_ = v; }
 void print() { cout << v_; }
};
979デフォルトの名無しさん:2007/07/25(水) 00:45:26
>>978
このレベルがサクッと空で書けるようになるには普段からtamplateを
多用していないと無理?
書かれたコードを見れば終えるんだけど、いざコーディングするとなると
経験不足から時間がかかってしまうんだが・・・
980デフォルトの名無しさん:2007/07/25(水) 00:57:23
>>979
最初は適当な型で普通にクラスを書いて、
それからテンプレートに置き換える。
というようにやってみては?
981デフォルトの名無しさん:2007/07/25(水) 01:04:14
>>980
ああ、確かに。適当な型で動作したのならテンプレートにしても
とりあえずその型で使っている限りは同じ動作になるはずなんだもんな。
982デフォルトの名無しさん:2007/07/25(水) 03:14:01
>>979
プログラムをサクッ空で書く必要なんて無いだろ。コンパイルエラーが
出てから直せばいいんだよ。そうしてるうちに慣れる。

さんざんこの過程を経てるはずなのに慣れないってんなら、テンプレート
関係無しにプログラムに向いてないだけだと思われ。
983デフォルトの名無しさん:2007/07/25(水) 06:34:26
>>979
デフォルトのアクセス制御とか、const とか、C++ そのものに慣れて
いないみたいだから、もっと手を動かして体で覚えたほうがいいと思う。
984デフォルトの名無しさん:2007/07/25(水) 09:01:49
テンプレートってのは、要するにどんな型でも使えるよってだけの話だ。
985デフォルトの名無しさん:2007/07/25(水) 09:13:09
test
986デフォルトの名無しさん:2007/07/25(水) 19:40:20
>>テンプレートってのは、要するにどんな型でも使えるよってだけの話だ。
そんなこと言うと変なのが湧くぞ
987デフォルトの名無しさん:2007/07/25(水) 22:13:46
あれだよ
あひるタイピングって奴さ
988デフォルトの名無しさん:2007/07/25(水) 22:47:00
それがアヒルならアヒルだ


この言葉知るまでは「テンプレートによるインターフェース」とか言ってたな
989デフォルトの名無しさん:2007/07/25(水) 23:49:30
ダックタイピングって言葉、C++の方で普及してるの?
python使ってるときは、ダックタイピング、
C++の時は静的インターフェイスとか、テンプレートによるインターフェイスとか言ってる。
990デフォルトの名無しさん:2007/07/26(木) 00:27:41
templateってコンテナ作る以外に何が便利なの?
991デフォルトの名無しさん:2007/07/26(木) 00:31:40
イテレータとアルゴリズム作るのに便利。
992デフォルトの名無しさん:2007/07/26(木) 00:56:39
すまん。立てたが番号間違えたorz
C++相談室 part56
http://pc11.2ch.net/test/read.cgi/tech/1185377587/l50
993デフォルトの名無しさん:2007/07/26(木) 09:09:35
Boost を見ればその便利さが分かる。そして気持ち悪さも。
994デフォルトの名無しさん:2007/07/26(木) 13:09:43
テンプレート引数に型以外の物も使えるというのが重要で、
これによって、コンパイル時プログラミングというジャンルが発展した。
Boostはその成果。

とはいえ、実際のプログラミングの場面では、そこまでのものが必要に
なることはあまり無くて、実用上は、
>テンプレートってのは、要するにどんな型でも使えるよってだけ
という認識でも別にいいかなとも思う。
995デフォルトの名無しさん:2007/07/26(木) 17:58:45
たらいを回してみるのもまた一興
996デフォルトの名無しさん:2007/07/26(木) 18:14:33
暑い
997デフォルトの名無しさん:2007/07/27(金) 14:24:25
エルニーニョ→ショタ
ラニーニャ→ロリ
998デフォルトの名無しさん:2007/07/27(金) 18:15:26
ぬるぽ
999デフォルトの名無しさん:2007/07/27(金) 18:17:10
ぬるぽ
1000デフォルトの名無しさん:2007/07/27(金) 18:17:42
ぬるぽ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。