[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 06/13 21:23 / Filesize : 84 KB / Number-of Response : 309
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.43【環境依存OK】



1 名前:デフォルトの名無しさん [2007/09/27(木) 11:39:04 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.42【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1188748806/l50
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


159 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:57:26 ]
もしかして、break が無いとそのまま次の case が実行されるってことを知らない?

160 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:58:11 ]
ちなみにこれはDuff's deviceという名で有名。

161 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:02:16 ]
まあただの興味で聞いてるだけだと思うが一応
caseの後には必ずbreak付けろ
使わなくてもdefaultは書け
caseはswitchスコープの直下に置け、ループの途中に挟むなんて言語道断
以上

162 名前:155 mailto:sage [2007/10/02(火) 19:08:41 ]
>>154
ヒントを一つ。caseラベルはswitch以外からは只のラベルにしか見えない。
つまり、switchから飛び込んだ後は存在しないも同然。
各caseラベルを渡り歩く理由については>159にも書かれている通り、breakしないとスルーするわけだ。

163 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:12:30 ]
アルゴリズムの質問なんですが
カオリ、165cm、24歳、年収500万
サキ、150cm、21歳、年収1000万
タカシ、180cm、18歳、年収200万
グレイ、100cm、120歳、年収0etc
というデータがあってa*身長+b*年齢+c*年収の値が一番大きい順にソートしたとき
最もあいうえお順に近い並び方になるa,b,cの値を探すプログラムを書きたいのだが
如何組めばいいか見当がつきません。
教えてください。

164 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:15:26 ]
全通りの並べ方試してみてそれぞれあいうえお順に近いかどうか調べりゃいいじゃん
ところであいうえお順に対する近さって何?

165 名前:154 mailto:sage [2007/10/02(火) 19:20:26 ]
>>159
それは理解してます。

>>160
ありがとう。色々調べてほぼ理解できました。

>>161
自分で書く場合はそうしています。
なので、逆に今回のコードが理解できませんでした。

>>162
最初の case 0: do { ...; case 1: ... の時点で理解不能でした。
switchが単なるcaseラベルへのジャンプだと理解すれば
それ以降は do{ } while() だけに注目すればよく、その中ではcaseラベルに意味はないのですね。


166 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:21:51 ]
あうかえお
○××○○
3/5=60%
という感じでこの値を100に近づけたいんです。
パラメータの全通りとはどのような感じですか?

167 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:22:07 ]
さらにgotoを加えて混乱させればいいのに…



168 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:23:45 ]
>>166
なんで「う」が×なんだ?

169 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:24:51 ]
>>163
Nx3行列A
165 24 500
150 21 1000
180 18 200
100 120 0

3x1行列B
a
b
c

Nx1行列C
6 ← 50音順で何番目か
11
16
8

とするとき
A・B=C
を満たす行列Bを決定すればよい
このとき行列Aの逆行列をPとするとき(上付き文字が使えないので^^;)
両辺に左からPを掛けると
P・A・B=P・C
B=P・C
となり求めることが出来る
逆行列の求め方は本(Numerical Recepies in C/C++ みたいなやつ)に
書いてあるのでそれを見ればおk

170 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:27:48 ]
>>161
ja.wikipedia.org/wiki/Duff's_device


171 名前:163 mailto:sage [2007/10/02(火) 19:28:46 ]
>>168
本来その位置は「い」だからです。
>>169
どうもありがとうございました。
さっそくやってみます。

172 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:34:26 ]
本来って何だ
「あ」「う」「か」「え」「お」のソートに何で「い」が出てくるんだ?
じゃあデータが「さ」「し」「す」「せ」「そ」ならこうなるのか?

さ        し       す      せ       そ
×(本来あ) ×(本来い) ×(本来う) ×(本来え) ×(本来お)
0%

変なの

173 名前:168 mailto:sage [2007/10/02(火) 19:35:26 ]
>>172 は俺じゃないぞw
俺はもう諦めた

174 名前:172 mailto:sage [2007/10/02(火) 19:37:07 ]
いや、168を騙るつもりはないが
なんか致命的な勘違いをしてる予感がしたから聞いてみたんだがもう見てないかな

175 名前:169 mailto:sage [2007/10/02(火) 19:38:07 ]
>>171
>>169 をちょっと訂正
要素数Nが4以上の時は

Nx4行列A (4列目の要素は常に1)
165 24 500 1
150 21 1000 1
180 18 200 1
100 120 0 1

4x1行列B
a
b
c
d

にしないといけない

176 名前:163 mailto:sage [2007/10/02(火) 20:36:22 ]
>>169
追加どうもです。

例が悪かったですね。
あうかえおいきくけこさしすせそ以下順番どおりだとすると
47/50=94%となります。

177 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 21:18:47 ]
例が悪いというか、希望する順列との差異を表したいわけでしょ?
そこで「あいうえお」を例にするから悪いわけじゃね?
普通の人が聞けば「あ」はあるかも知れんが「い」はないかもしれないと思う。



178 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 21:51:19 ]
てことは「んあいうえおかきくけこ…を」だったら0%なわけね
そういう定義ならそれでいいけど目的としてはそれで大丈夫なの?

179 名前:163 mailto:sage [2007/10/02(火) 22:10:54 ]
すみませんでした。

>>177
仰るとおりです。
>>178
大丈夫です。

180 名前:デフォルトの名無しさん [2007/10/02(火) 22:21:34 ]
C++でnewで生成した配列の要素数って求められないんでしょうか?
char* a = new char[5];
char b[5];
sizeof(a) は4(ポインタのサイズ) sizeof(b)は5になるのですが...
お願いします


181 名前:デフォルトの名無しさん [2007/10/02(火) 22:23:10 ]
>>163って、結果が必ず50音順になるわけじゃ無いよな。
効率よくやるのは結構ムズい気がする。
あいうえお順に近い並び方から順に、解があるかどうかを
1つずつ調べていくプログラムが作るの楽なんじゃないかなぁ。

182 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:30:25 ]
>>180
char a[] = new char[5];
にすればおk

183 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:32:27 ]
コンテナ使えやヴォケェ

184 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:33:54 ]
スマソ >>182じゃ無理かも
C++ならvectorでもつかっておけば?
風邪なのに2chやってると判断力が鈍るな

185 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:43:23 ]
コンテナなんてクソ

186 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:48:35 ]
int hoge = 5;
char* a = new char[hoge];
でhoge見りゃいいじゃん

187 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:55:21 ]
要素数とポインタをタプルにしよう☆



188 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:57:40 ]
サイズは定数で無いと受け付けないから

189 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:59:25 ]
じゃあboost::arrayもしくはそれに似たものを自作すればおk

190 名前:182 [2007/10/02(火) 23:05:56 ]
レスありがとうございました. Vector使います.
もひとつ関連質問ですが、Cで関数に配列渡す場合同じことが起きるんですが
関数内で渡された配列の要素数が必要な場合、要素数も別に渡さないと
いけないということですか?
void hoge(char a[], int numOfFactor)みたいに

191 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:10:34 ]
もちろんそうよ
ループの終了条件にしか使わないなら番兵置く手もあるけど

192 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:11:13 ]
>>190
そうだよ。静的な配列ならsizeofで要素数を取得できるけど、そうでない場合は別に値を管理する必要がある

193 名前:190 [2007/10/02(火) 23:14:31 ]
了解しました。重ね重ねありがとうございました。
要素はfactorじゃなくてelementでした。おまいらサンクス!!

194 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:23:50 ]
どっちかと言うと、C++では先頭及び最後の1つ後を指すイテレータ
という2つの引数を取るほうが一般的だと思う。

template<typename Iterator>
void hoge(Iterator first, Iterator last);
要素数はポインタ的にfirst - lastと言いたいとこだが、
std::distance(first, last)で求める。

もうちょっと先進的なのが好みならBoost.Range。
template<typename Range>
void hoge(Range& r);
boost::size(r)で要素数が求まる。
boost::begin(r), boost::end(r)でイテレータ取得。
vectorその他コンテナ一般や配列などを引数に渡せる。

195 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 02:17:51 ]
DWORD dwSize = GetFileSize(...);
LPBYTE lpBuffer = (LPBYTE)malloc(dwSize));

これをNewを使って書き換えるとするとどんな風になりますか?

196 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 02:37:03 ]
Happy New Year

197 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 04:24:39 ]
んー。
std::vector<BYTE> buffer(GetFileSize(...));



198 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 06:57:09 ]
DWORD New = GetFileSize(...);
LPBYTE lpBuffer = (LPBYTE)malloc(New));


199 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 08:33:47 ]
DWORD dwSize = GetFileSize(...);
//1 LPBYTE lpBuffer = new BYTE[(dwSize + sizeof(BYTE) - 1) / sizeof(BYTE)];
//2 LPBYTE lpBuffer = (LPBYTE)new char[dwSize]
//3 LPBYTE lpBuffer = new BYTE[dwSize]

200 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 09:03:51 ]
//4 LPBYTE lpBuffer = new(nothrow) BYTE[dwSize];

malloc差し替えなら挙動が同じ(bad_alloc投げずにNULL返す)new(nothrow)最強

201 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 09:39:48 ]
んなコードは窓から投げ捨ててFileMapping使え

202 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 11:11:39 ]
WindowsServer2003x64上で、64ビットプロセスと32ビットプロセスのメモリ共有を行いたいと思っています。
調べてみるとメモリマップドファイルがあるのですが、これで実現可能でしょうか?単純な方法がありましたら教えていただきたいです。
また、64ビットプロセスでメモリ確保したものを32ビットプロセスでデータ参照するにはどうすればいいでしょうか?



203 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 13:30:07 ]
>>202
可能。メモリマップドファイル経由。

204 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 14:54:08 ]
独学で勉強中です。

ClassA a;
ClassA b = a;
ClassA c(a);
とした場合
bはメンバ変数が初期化され、
cは未初期化状態になります。
これは言語仕様でしょうか?環境依存でしょうか?

WinXP + Cygwin + gcc3.4.4

205 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 15:03:23 ]
やってみたが

#include <iostream>
class ClassA {
public: int x;
};
int main()
{
  ClassA a;
  a.x = 42;
  ClassA b = a;
  ClassA c(a);
  std::cout << b.x << std::endl;
  std::cout << c.x << std::endl;
}

実行結果
42
42

どのへんが未初期化?

206 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:08:56 ]
>>205
>ClassA c(a)
これは、どういうことをしてるの?

207 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:13:35 ]
コピーコンストラクタによる初期化



208 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:19:21 ]
>>207
コピーコンストラクタってどこに宣言・定義されてるの?
#include <iostream> <----ここの中?


209 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:22:39 ]
>>208
>コピーコンストラクタってどこに宣言・定義されてるの?
あなたの心の中。

冗談さておき、特に自前で宣言しなかった場合は暗黙のコピーコンストラクタが用意される。
# なーに、メンバを全部(浅い)コピーに出すだけさ。

210 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:28:28 ]
>>209
>暗黙のコピーコンストラクタ
ってこうしなさいとC++の仕様で決まってるんの?

211 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:55:28 ]
そう。

212 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 17:46:41 ]
浅いコピーっていうのは、単なるビットコピーってこと?

213 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 17:49:46 ]
浅いコピーなんだから深く考えちゃだめ

214 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 17:50:38 ]
そのメンバがコピーコンストラクタを持っていればそれを使うが、ない場合はそういうことになる。

215 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 19:47:41 ]
>>205
すみません、説明不足でした。

> ClassA a;
> a.x = 42;
> ClassA b = a;
> ClassA c(a);

> a.x = 42;
を取ると
0
17〜〜〜(-1のunsinged表記?)
のように表示されてます。

両方ともコピーコンストラクタによりインスタンスが生成されていますが
結果が異なっていたため気になった次第です。

216 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 19:56:40 ]
そもそも元のメンバ変数を初期化していない時点で
まともな動作を期待するなよ

217 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 20:14:24 ]
>>216 的確ワロスw



218 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 20:52:49 ]
int x;
printf("%d\n", x);

219 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:09:32 ]
>>216
int x;
int y;
x = y;
この場合, x, yは異なる可能性があるの?

220 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:19:33 ]
>>219
マジで?

221 名前:デフォルトの名無しさん [2007/10/03(水) 21:20:08 ]
C++で使用対象のクラスが参照カウンタを実装している可能性があるので
ZeroMemoryなどでデータを初期化するのはご法度

と何処かで目にしか記憶があるのですが、同様の理由で構造体に対しても
ZeroMemoryを使うことはあまり好ましくないのでしょうか?

C言語では常套手段だったので。

222 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:24:57 ]
#include <tr1/memory.hpp>
#include <cassert>

struct Base { virtual char f(void) =0; };

struct A : public Base {
char f(void) { return 'A'; }
};

struct B : public Base {
char f(void) { return 'B'; }
};

int main() {
std::tr1::shared_ptr<Base> p;
p.reset(new A);
assert( p->f() == 'A' );
p.reset(new B);
assert( p->f() == 'B' );
}
こういう実行時バインディングをCRTPを使って書きたいんですがどう書けばいいんでしょうか?

223 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:25:53 ]
>>215
ローカル変数として定義したオブジェクトはデフォルト初期化される
組み込み型の場合のデフォルト初期化は不定値
どんな実装でどんな結果になろうが、考えること自体意味がない

224 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:27:02 ]
>>221
その構造体・クラスがPODならZeroMemoryしても構わない。
PODになるには色々条件(コンストラクタ・デストラクタ、仮想関数禁止など)があるが、
概ねCでそのまま使えるような単純な構造体なら大丈夫と思っていい。

それでも、ZeroMemoryよりは初期化子などでゼロ初期化を促すほうが一般的だと思うけど。

225 名前:221 mailto:sage [2007/10/03(水) 21:29:51 ]
>>224
素早い回答ありがとうございます。

226 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:44:15 ]
そもそもコンストラクタで初期化させるように設計するものなのでは?

227 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:48:41 ]
でも外部のライブラリなんかで、
そういうCと共通のヘッダを使うなんて機会もあるし。
#そういうのはラップしろというのは同意。



228 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:59:40 ]
>219
>>215 の報告を信じるなら、クラスのメンバ変数の場合には異なることが
ありうるってことだねぇ。最適化の関係かな。

229 名前:222 mailto:sage [2007/10/03(水) 22:19:01 ]
#include <cassert>

template <typename Derived>
struct base
{
  char interface() { return reinterpret_cast<Derived*>(this)->implementation(); }
  static char static_func() { return Derived::static_sub_func(); }
};

struct derived : base<derived>
{
  char implementation() { return 'A'; }
  static char static_func() { return 'B'; }
};

template <typename T>
char f(base<T>& t) { return t.interface(); }

int main() {
  derived d;
  assert( f(d) == 'A' );
}
英語版wikipediaを参考に書いてみましたがまだしっくりきません
というかあきらかに違うような気がします

230 名前:202 mailto:sage [2007/10/03(水) 22:46:03 ]
>>203
ありがとうございます。メモリマップ先をファイルでなくメモリで可能ですよね?ただ、やはりメモリ幅の違いが気になります。実装は困難なのでしょうね・・・


231 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 23:17:09 ]
>>229
reinterpret_castではなく、static_castにすべきだが、ほかは合っている。

232 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 23:19:59 ]
>>230
自分でメモリマップを実装するのは困難だろうけど使うだけなら簡単
#include<windows.h>
#include<stdio.h>

#define IS_PARENT // ←この行の有りと無しでコンパイルする
#define MEMMAP_ID "maptest"

int main(void){
HANDLE hmap;
char *ptr;

#ifdef IS_PARENT
hmap=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 256, MEMMAP_ID);
if(hmap!=NULL && GetLastError()==ERROR_ALREADY_EXISTS){
CloseHandle(hmap);
return 1;
}
ptr=MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 256);
ptr[0]='\0';
while(scanf("%255s", ptr)==1) ;
#else
hmap=OpenFileMapping(FILE_MAP_WRITE, FALSE, MEMMAP_ID);
if(hmap==NULL) return 1;
ptr=MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 256);
while(getchar()!=EOF) printf("%s", ptr);
#endif
UnmapViewOfFile(ptr);
CloseHandle(hmap);
return 0;
}

233 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 23:20:05 ]
>>230
size_tのような64ビットと32ビットで大きさの違うデータ型を読み書きしようとしない限り問題ない。
32ビットプロセス同士でやるのと同じ。

234 名前:202 [2007/10/04(木) 00:24:19 ]
>>232, 233
ご返信ありがとうございます。
今メモリ共有を行いたいのは、unsigned char型の配列です。
この場合も普通に232さんの教えくださったサンプルで問題ない
という認識でよろしいでしょうか?

235 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:30:36 ]
>>234
なぜ、やってみないのでしょうか?

>>232 はただの動作確認のためだけのサンプルです
サンプルで問題がないかどうかは使い方によります
使用しているAPIについて*自分で*調べて下さい

236 名前:202 [2007/10/04(木) 00:35:11 ]
>>235
ご返信ありがとうございます。おっしゃるとおりです。
自分で調べずにすぐに質問してしまいました。
実装にトライします。
ありがとうございました。

237 名前:デフォルトの名無しさん [2007/10/04(木) 01:12:29 ]
>>103
enable_if 使う初心者w





238 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 10:11:51 ]
そんなこと言われても、mplなんて使いこなせないんで…

239 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 10:42:45 ]
stdのcoutやcinはヘッダを見るとextern宣言されてますが、定義はどこで行われているんでしょうか?

240 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:02:01 ]
>>239
標準ライブラリのソース内でしょう。

241 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:11:59 ]
C++はヘッダファイルではなくヘッダをインクルードしますが
ヘッダファイルとヘッダの違いって何ですか?
ヘッダの中でヘッダファイルがインクルードされてる?

242 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:18:39 ]
>>241
ほとんどのコンパイラの実装ではヘッダといえばそれに対応するファイルが
用意されているので、ほとんど同義。ただしコンパイラは <stdio.h> というヘッダを
ファイルとして実装する必要はなく、規定された動作さえすればいい。これは
C でも C++ でも同じ。

で、一般的にヘッダファイルといえばヘッダのように動作するユーザー作成の
ファイルも含む。

243 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:34:30 ]
>>242 ものすげえわかり易くてワロスw

244 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:10:53 ]
<iostream>ってヘッダファイルぢゃないの?

245 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:13:19 ]
>>244
C++ の標準ヘッダではあるけど、ファイルであるかどうかはコンパイラの実装しだい。

246 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:17:38 ]
>>242
なるほど。ということはユーザー定義のヘッダファイルを
#include "hoge.h" とした場合でも、規格上はhoge.hの実装
がファイルでなくてもよいということですか?

247 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:19:34 ]
>>245
例えばファイルではないヘッダを使っているシステムってあるのですか?
LinuxとかWindowsのコンパイラの場合、OSがファイルシステムを持っているから
事実上はファイルとして実装されてるということになるのですかね?



248 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:20:31 ]
>>246
いいんじゃねーの。
実際プリコンパイルドヘッダが用いられるときなんかはhoge.h以外の
とこから情報取ってきてるわけだし

249 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:23:16 ]
privateな仮想関数って意味ありますか?
派生クラスで上書きしても呼び出せないのに。

250 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:25:05 ]
>>248
プリコンパイルドヘッダというのはコンパイル済みヘッダということだと
思うので、バイナリファイルを覗きに行くのですかね?

251 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:25:12 ]
delphiのinterface節/impliments節ってよくできてると思う

252 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:27:47 ]
>>249
Non virtual interface と呼ばれる手法で使われる。
似たような話でデザインパターンの Template method とか。

253 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:32:52 ]
>>250
ただのファイルにするかDBにするかインターネットからとってくるかは、
コンパイラ作成者の自由なんじゃないの?規格も神も制限してないんだから。

そんなの俺に聞いてどう答えて欲しいの?

254 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:39:36 ]
>>249
派生クラスから呼び出せなくても、基本クラスから上書きバージョンを呼び出すことは出来る。

255 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 15:37:19 ]
>>252
>>254
class B
{
public:
void mf(){ privmf(); }
private:
virtual void privmf();
};

class D : public B
{
private:
void privmf();
}

int main()
{
D objd;
objd.mf();

return 0;
}

このプログラムでobjd.mf() 内で呼び出される関数がB::privmf()ではなく、
D::privmf()になるのですがなぜですか?
ポインタか参照に対して呼び出されたときにポリモルフィズム機構
が働くと思うのですが。
void mf(){ privmf(); }はvoid mf(){ this->privmf(); }と同じことですが、
このthisポインタが指している実際のオブジェクトの型がクラスDの
場合(上のプログラムの場合)はD::privmf()が呼ばれるということで
しょうか?

256 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 15:59:23 ]
そのとおり

257 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 16:11:28 ]
>>256
ポインタthisに対する多態性ということですか。
objd.mf() を実質 mf(&objd)と考えて this と &objd
が等しいものを表すため、クラスDの仮想関数
テーブルが参照され、そこに登録されている
D::privmf()が呼ばれるということで納得できました。




258 名前:BOLT [2007/10/04(木) 18:19:42 ]
自分、C++の初心者です。以後お世話になると思いますがよろしくお願いします。
ccplus.blog121.fc2.com/ちなみにプログラミング系のブログやってます。
よろしければ見に来てください。

259 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 18:22:29 ]
クソショボイブログだなw
誰も見ないしとっとと閉鎖しろよ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<84KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef