■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part18
251 名前:デフォルトの名無しさん :03/04/20 16:04
>>249
なぜvectorを教えない!

252 名前:248 :03/04/20 17:07
>>251
おお、ありがとう。みてみます。

253 名前:デフォルトの名無しさん :03/04/20 17:10
>>252
初心者はvectorなんか使ってはいけません

254 名前:デフォルトの名無しさん :03/04/20 17:12
>>253
newの方が初心者には危険だろ?

255 名前:248 :03/04/20 18:02
vectorの
atメソッドがg++に無いということが書かれていました。
g++でも動くように、
v.at(3)=100;
を、
v[3]=100;
って書いていいということですか?
というかatメソッドは、意味無い?

256 名前:デフォルトの名無しさん :03/04/20 18:05
クラス定義の中で実装を書くと
明示的に inline って書かなくても
インラインになるの?

class hoge
{
public:
Hoge();
~Hoge();

void Method1(){ ... } //これインラインになる?
};

257 名前:デフォルトの名無しさん :03/04/20 18:17
いぇs

258 名前:デフォルトの名無しさん :03/04/20 18:18
>>255
意味はあるさ。オーバーインデックスした時、
atは例外を出すからデバッグしやすい。

>>256
普通はinline展開されない。VC++だと、コンパイルオプションで設定できた。

259 名前:tantei :03/04/20 18:18
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●別れさせ工作
あらゆる手段を使ってターゲットを別れさせます!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
その他人生相談からどんなお悩みでも解決いたします!!
 直通  090−8505−3086
URL  http://www.h5.dion.ne.jp/~grobal/
メール  hentaimtt@k9.dion.ne.jp
   ■グローバル探偵事務所 



260 名前:248=255 :03/04/20 18:27
>>258
わかりました。ありがとうございます。

261 名前:デフォルトの名無しさん :03/04/20 18:44
あるClassの中に、別のClass型変数を持つのって駄目?
継承して使うべきかな?

262 名前:デフォルトの名無しさん :03/04/20 18:52
>>258
>普通はinline展開されない。
え? 普通はされるだろ

263 名前:デフォルトの名無しさん :03/04/20 18:53
>>261
has-a を is-aに置き換えることは愚行

264 名前:デフォルトの名無しさん :03/04/20 18:56
>>261
effective-C++読んどけ。

265 名前:デフォルトの名無しさん :03/04/20 18:57
コンパイラは inline 化に積極的になってくれるが実際に inline 化
されるかどうかは Method の実装次第てとこだね

266 名前:デフォルトの名無しさん :03/04/20 18:59
>>258
でも、せっかくチェックしてくれるなら、例外なんか投げないで
abort()してくれればいいのに。
結局、STLportのデバッグモードとかの方が有難かったり。

267 名前:261 :03/04/20 19:01
"has-a" "is-a" でぐぐってみたら

C++でプログラムを設計するということは、"is a”と"has a"の関係に分離し抽出することと考えることができる。
(ttp://toba.yanagi.gifu-u.ac.jp/lecture/prog2/11/)より

ということでした。
ありがとうございました。

でも置き換えるの意味がわかんないです。


268 名前:デフォルトの名無しさん :03/04/20 19:04
>>267

class Engine{};

class Car
{
Engine engine;
};

は正常。車はエンジンを持っている。

class Car : public Engine{};

は異常。車はエンジンではない。

269 名前:261 :03/04/20 19:08
>>268
なるほど!かなりよく分かりました。
そのまんまのいみでしたね^^;

>>264
今度本屋で立ち読みしてきます。

ありがとうございました。



270 名前:デフォルトの名無しさん :03/04/20 19:31
class A;
.
.
.
class N;

A.m_classB.m_classC...m_classN.a = 1; (N回クラスが連結した先の変数aに代入している)
このような繋がりってあんまり多いと駄目ですよね。
最高どのぐらいが限界でしょうか?

271 名前:デフォルトの名無しさん :03/04/20 19:58
>>270
限界なんてものは無いが、クラスを使うということは、複雑な問題を分割・整理するのが目的なのに
外から内側が丸見えでは問題を複雑なままにしているので駄目だな。


272 名前:デフォルトの名無しさん :03/04/20 20:03
>>270
なるほど。そりゃそうですよね。
268の例みたいに
CarとEngineを"is-a"の関係で記述したときって
EngineをCarから操作できるようにするんですよね?
例えば、Car.GetEngineType(); とかのように。
Car.engine.GetType(); では駄目駄目だということですよね?


273 名前:デフォルトの名無しさん :03/04/20 20:36
>>272
まだよくわかってないんじゃない?
とりあえず、
Car.engine.GetType();
なんて、メンバ変数(この場合engine)が公開されてる
時点でおかしい


274 名前:デフォルトの名無しさん :03/04/20 20:56
悪い例がCar.engine.GetType(); で
Car.GetEngineType(); が良い例です。
これでも駄目ですか? engineは隠蔽されていると思うのですが・・

275 名前:デフォルトの名無しさん :03/04/20 21:02
Car.GetType(ENGINE);

276 名前:270 :03/04/20 21:08
>>275
ENGINEは定数ですよね?
Carクラスの中で、定数ENGINEを定義して、それを公開するということですか。
GetEngineType(); と同じ気がするんですが・・・気のせいですか?
自分の無知さが恥ずかしいです。

277 名前:デフォルトの名無しさん :03/04/20 21:11
Carの定義もEngineの定義も見ずに良いとか悪いとか言ってる奴は信用できない。

278 名前:デフォルトの名無しさん :03/04/20 21:12
class Car{
public:
Engine &GetEngine(){ return engine; }
}

279 名前:デフォルトの名無しさん :03/04/20 21:20
まず、engine の型を外部から知る必要がある設計が駄目。
どうしても知る必要があるなら、>>274 の Car::GetEngineType() でいい。



280 名前:デフォルトの名無しさん :03/04/20 21:24
誤解を招いたかもしれませんが、
GetEngineType() とは型番とか、製造社とかを返すつもりで使いました。
例がとっさにうかばなかったもので・・・

281 名前:デフォルトの名無しさん :03/04/20 21:28
>まず、engine の型を外部から知る必要がある設計が駄目。
んなこたないよ。そんなの普通にあるだろ。

282 名前:デフォルトの名無しさん :03/04/20 21:28
>>280
その型番とか製造社を使って、
Carクラスの使用者は条件分岐したりするの?

283 名前:デフォルトの名無しさん :03/04/20 21:30
>>281
なにそれ。
if( car.GetEngineType() == HONDA ) {
car.アクセルを緩める();
} else {
car.アクセルは固定();
}
とか、こんなコード書くのか?

284 名前:270 :03/04/20 21:35
>>282
そうですね。使うとしたら・・表示させたり、条件分岐とかですかね。
さきほど言いましたけど、
とっさに考えた例なので、使い道は考えていません^^;

285 名前:デフォルトの名無しさん :03/04/20 21:37
そもそもメンバ変数は公開/非公開どちらにすべき?って質問だよね。
"is-a"の話の流れで書いちゃってるけども、"is-a"の話とは関係ないよね。

286 名前:270 :03/04/20 21:38
if(car.GetEngineType() == YAMAHA)
car.PointUp(1);
ヤマハのエンジンだったら評価を上げるっていう例です。
さっき思いつきましたが


287 名前:デフォルトの名無しさん :03/04/20 21:41
>>283
多態を使うべき場面っぽいですなー

288 名前:デフォルトの名無しさん :03/04/20 21:44
おまいらdynamic_cast知らんの?

289 名前:デフォルトの名無しさん :03/04/20 21:45
各々がいろんな場面想定して書いてるからまとまらないのな

290 名前:デフォルトの名無しさん :03/04/20 21:47
dynamic cast 知りません。
名前だけ知ってる・・・

291 名前:デフォルトの名無しさん :03/04/20 21:49
多態って?


292 名前:デフォルトの名無しさん :03/04/20 21:49
>>291
検索してくたたい。

293 名前:デフォルトの名無しさん :03/04/20 21:52
ごめん。多種・多様しかC++の特徴として覚えてなかった。
やっぱ一緒だった。タタイ?

294 名前:デフォルトの名無しさん :03/04/20 21:54
>>273 はおかしくない。


295 名前:デフォルトの名無しさん :03/04/20 22:05
ポインタを理解できないと
プログラムは組めないと言うよりアプリが作れない。
ポインタを理解するのに数年はかかると言われている。

本当のところ、どうなの?

296 名前:デフォルトの名無しさん :03/04/20 22:09
>>295
ポインタはすぐに理解できるよ。

297 名前:sage :03/04/20 22:11
アセンブラを習得したら完全に理解できるよ。
アセンブラ習得するのに、数年もかからんでしょ。

298 名前:デフォルトの名無しさん :03/04/20 22:12
>>295
たかがポインタに大げさだなあ

299 名前:デフォルトの名無しさん :03/04/20 22:20
>>298
関数ポインタはどんな場合に使うの?

300 名前:デフォルトの名無しさん :03/04/20 22:25
>>299
どの関数をコールするのかを、実行時に決める時に使う。
C++では、virtual関数やtemplateをうまく使えば使わなくてすむ。

つか、>>299よ、なぜ>>298に対して聞くんだ。


301 名前:デフォルトの名無しさん :03/04/20 22:26
"is-a"について質問ですが、
"手牌"と、"牌1つ"は"is-a"ですか?"has-a"ですか?(麻雀用語ですみません。)

class HAI{
private:
移動用クラス;
数値用クラス;
};
class TEHAI{
private:
HAI m_hai[14];
};

みたいにしたいんですが、
手牌の中には牌が14枚あるということから、"is-a"としたんですが・・
HAIクラスのメンバにTEHAIクラスからアクセスするのに長々と
TEHAI.GetHai(N番目).移動用クラス.ひっくりかえす(); みたいに書かないといけないですか?
まだよくわかってないみたいですか?
付け加えると、移動用クラスは、別のプログラムでも使えるようにと
汎用化したつもりなんですが。

長々とすみません。

302 名前:デフォルトの名無しさん :03/04/20 22:27
>>299
実装とインターフェイスの分離。多態(笑)
ってこれは概念も分からない人には少し早いんじゃないかな。

まずポインタの基本概念の理解の話なら、
自分の知識にあった説明さえ得られれば瞬時に理解できるんじゃないの。

C言語の複雑なポインタ式の知識は、あるに越したことないけどしっかり把握する
必要もあまりない(一般的に、複雑な式はバグの元なので避ける)

303 名前:デフォルトの名無しさん :03/04/20 22:28
>>299
>関数ポインタはどんな場合に使うの?
あれは、C++を使えない老人のオブジェクト指向ごっこ。
C++では使わない。その必要がない。

304 名前:デフォルトの名無しさん :03/04/20 22:30
>>300
298はポインタを理解してるとみた。
300は298ではないね。
信頼して聞いたんだよ。信頼と信用は違うけど。

305 名前:デフォルトの名無しさん :03/04/20 22:32
>>301
手牌は、特定のプレーヤーの管理下の牌の集合を保持したものである。

牌は、山に積むことができる。順番にツモって捨てられることができる。
鳴かれることができる。ドラ表示に使われることがある。

「手牌」は、「牌」の一種といえますか?
手牌は、「牌」の集合を所持するだけとしか思えませんが。

306 名前:デフォルトの名無しさん :03/04/20 22:36
>>303
必要がないわけじゃないよ。
関数メンバポインタがないからイベント通知にとても苦労してるよ。
overrideさせると切り替えが面倒だしそれ以外の解決法もぴったりのものはないからね。

307 名前:デフォルトの名無しさん :03/04/20 22:36
>関数ポインタ
WindowsならDLLからGetProcAddressするときに

308 名前:デフォルトの名無しさん :03/04/20 22:38
>>301
お前のコード、
「手牌 is a 牌」って表現してないだろ。
お前のコードは
「手配 has a 牌」っていうのを、14個分用意している。

自然言語に対する感覚をどうにかしろ。
そして is-a、has-aについて調べろ。

TEHAIクラスのpublicなメンバ関数は
”全部を引っくり返す”とか、
"手牌全部をみて、点数計算をする"とか、
"手配全部を見て、待ち牌をさがす"とか、

そういう、手配全部に対してアクセスする物と、

AddPai( class HAI* p ) // ツモ
removePai( int i ) // 牌を捨てる
とか、こんな感じで、手配の中の一牌をを
どうにかするメンバ関数の2種類を作れ。


あと、"移動用クラス"が何なのか知らねーが、
それは"引っくり返す関数"のなかでこっそり呼べ。

最後に、ストラテジーパターンについて学んでおけ。

309 名前:デフォルトの名無しさん :03/04/20 22:38
Templateがあるからvoid*は使わないって本当?

310 名前:デフォルトの名無しさん :03/04/20 22:38
ですよね!
でも長々と鎖をたどっていくのはいやなんですけど・・・スマートな
記述方法ってありませんか?


311 名前:デフォルトの名無しさん :03/04/20 22:39
>>309
ウソ。


312 名前:デフォルトの名無しさん :03/04/20 22:41
WNDCLASS 構造体に WndProc のポインタを設定したり
Enum〜 系の API にも関数ポインタ必要

313 名前:デフォルトの名無しさん :03/04/20 22:41
>>309
ホント。

314 名前:デフォルトの名無しさん :03/04/20 22:42
>>306
virtual関数使やいいだろ。
C++は多重継承を許す言語だぜ。


315 名前:デフォルトの名無しさん :03/04/20 22:42
>>309
ウソ。
template があってもなくても、void * は使わない。
template があってもなくても、マシンを直接アクセスしなきゃならないときは
void * を使わざるを得ないこともあるから、その場合だけ使う。


316 名前:デフォルトの名無しさん :03/04/20 22:45
>>308
ありがとうございます。
もう一度調べてみます。

317 名前:デフォルトの名無しさん :03/04/20 22:46
>>314
通知イベントが数十あって必要なものだけイベントハンドラ書いて
実行時にイベントハンドラ切り替えたりイベントハンドラ複数登録したり
とかはどうやってやる?

318 名前:デフォルトの名無しさん :03/04/20 22:46
>>310
std::for_each() 使えば?


319 名前:デフォルトの名無しさん :03/04/20 22:47
もともと、void *っていつ使われるんだろう。
mallocとかの返り値が void * だけど、
他にvoid *って使う価値がないような気がする。

"指しているオブジェクトが何か解らないポインタ"の使い道...
ん-...

>>315
マシンを直接アクセスするとき?void *がどう役に立つの?

320 名前:デフォルトの名無しさん :03/04/20 22:47
>>317
std::map<Event,Handler>じゃないの?

321 名前:デフォルトの名無しさん :03/04/20 22:49
>>319
memcpy使ったこと無いのか?

322 名前:デフォルトの名無しさん :03/04/20 22:53
>>321
ああ、そうか、memなんとか系のライブラリ関数では使われることがあるのか。
mallocもそうだけど、c++じゃあんまり使う機会がなさそうだな。void *


323 名前:デフォルトの名無しさん :03/04/20 22:54
>>322
うん。ほとんど使う機会がない。ガンガン使っているとしたら設計に問題があるかも。


324 名前:デフォルトの名無しさん :03/04/20 22:55
>>322
templateがあるからな。

325 名前:デフォルトの名無しさん :03/04/20 22:55
>>324
template は関係ない。


326 名前:デフォルトの名無しさん :03/04/20 22:58
>>320
やってみればわかるけど死ぬほど面倒だよそれ。

327 名前:デフォルトの名無しさん :03/04/20 23:00
>>317
Event - Listener モデル使えば?


328 名前:デフォルトの名無しさん :03/04/20 23:00
>>325
memcpyじゃなくてstd::copyを使うってことだと思うが、関係ないのか?

329 名前:デフォルトの名無しさん :03/04/20 23:02
>>317
たとえばイベントがn個あるなら、
class EventListener {
  virtual handleE_0() = 0;
  virtual handleE_n() = 0;
};
みたいなクラスを作って、イベントの影響を受けるクラスで、
これを実装しておけばいいだろ。


330 名前:320 :03/04/20 23:02
>>326
どの辺が?

331 名前:デフォルトの名無しさん :03/04/20 23:03
>>319
知らず知らずのうちに使っているはず。
抽象化や隠蔽化する際にはとても重要だ。

たとえば、もしキミがGetModuleHandleを直接または間接に呼び出したとする。
ハイ、使いましたね。 → typedef void * HMODULE
でもGetModuleHandleを呼ぶとき、モジュール構造体がどうなっているかなんて
考えないでしょ?


たとえば、もしキミがCreateProcessを直接または間接に呼び出したとする。
ハイ、使いましたね。 → typedef void * HANDLE
でもCreateProcessを呼ぶとき、オブジェクト構造体がどうなっているかなんて
考えないでしょ?

たとえば、もしキミが...(以下省略)

いっぱいあるよ。


332 名前:デフォルトの名無しさん :03/04/20 23:04
#define STRICT

333 名前:デフォルトの名無しさん :03/04/20 23:08
memcpy??mem??????????
????????????????????????????????
???memcpy()?????????????
?????????????????????????????
memset()????"????????????????"????????????
???????

334 名前:デフォルトの名無しさん :03/04/20 23:08
>>328
std::copy を使っても、シーケンスの operator=() で memcpy が使われているかも
知れないし、std::copy を使わなくても、unsigned char * としてバイナリ・イメージを
コピーすることはできる。
ようは、void * と template とは関係がない。


335 名前:デフォルトの名無しさん :03/04/20 23:08
>>333
なんで?になってるの?

336 名前:デフォルトの名無しさん :03/04/20 23:09
>>331
Windowsに偏ってるのがイマイチだ。

337 名前:デフォルトの名無しさん :03/04/20 23:10
HMODULE や HANDLE がどう typedef されていても、関係のない話だね。


338 名前:333 :03/04/20 23:11
うがー

339 名前:デフォルトの名無しさん :03/04/20 23:12
>>330
>329のようなクラスの定義・登録・呼び出し・スコープの制御もろもろ全部。
イベント通知・受信のメカニズムが全部むき出しだからとても煩雑になる。

340 名前:デフォルトの名無しさん :03/04/20 23:12
>>334
そうか?漏れがmemcpyを使わなくなった理由はstd::copyがあるからなんだが。
だいたい、「operator=() で memcpy が使われているかも知れない」からって、
void*を使ってることにはならんだろ。

341 名前:デフォルトの名無しさん :03/04/20 23:13
Cで使われるって前提なのもイマイチだ

342 名前:デフォルトの名無しさん :03/04/20 23:14
どうやら老人が紛れ込んだようだな。老人 == >>317

343 名前:デフォルトの名無しさん :03/04/20 23:15
C++使いにとって、Cで書かされることほど屈辱的なことはない。


344 名前:デフォルトの名無しさん :03/04/20 23:15
>>340
std::copy() が使えるってことは、= 演算子が使えるってことだよね。
なら、memcpy() なんて使わずに、ループでコピーしておけばいいんじゃない?
std::copy() が使えない C でもそれでいけるよ。


345 名前:301 :03/04/20 23:15
>>308
"is-a" と "has-a"を間違って書いてました。

>「手配 has a 牌」っていうのを、14個分用意している。
これって駄目ですか?

>ストラテジーパターンについて学んでおけ。
なかなかインターネットで見つかりません^^;
googleで検索しても数件しかヒットしませんでした。
本屋で、デザインパターンについて調べたら見つかりそうですか?

移動用クラスってのは、行列をたくさん集めたやつです。
・回転用行列
・移動用行列
・拡大用行列
ってかんじです。
別に「牌クラス」に記述する必要はあまりないですね・・・
クラスの外に宣言してやってみます。


346 名前:デフォルトの名無しさん :03/04/20 23:17
>>331
CreateProcess() で得られたものと GetModuleHandle() で得られたものって、
同じようにアクセスしていいの?

つか、"抽象化"って言葉の意味や"隠蔽"の概念は知っているの?

347 名前:デフォルトの名無しさん :03/04/20 23:18
>>339はヴァカという結論で、よろしいか?

348 名前:デフォルトの名無しさん :03/04/20 23:20
>>347
MFCの解説でも読んで、自分が実装してる気になってんだろ。春だしな。

349 名前:デフォルトの名無しさん :03/04/20 23:20
Delphiならこんな議論は起こらないのに(ぼそっ)

350 名前:デフォルトの名無しさん :03/04/20 23:20
C++ではvoid*ってあまり使わないね、って話の時にWin32APIの話出されてもあまり説得力が・・・

351 名前:デフォルトの名無しさん :03/04/20 23:20
C#ならこんな議論は起こらないのに(ぼそっ)


352 名前:デフォルトの名無しさん :03/04/20 23:20
MFCなんて使う気にならないんですが、病気ですか?

353 名前:320 :03/04/20 23:22
>>339
そういう話なら、mapを実装に使うクラスでラップすればいいだろ。

もとの話し見たら、「仮想関数あるから関数ポインタいらね」って話だったのね。
確かに、仮想関数だけじゃHandler型の実装には役不足だなぁ。
しかし、実装に使うにしても「関数ポインタ」が
表に現れないように実装するのがマナーだろうな。


354 名前:デフォルトの名無しさん :03/04/20 23:22
>>345
has-aで表現することは正しい。


355 名前:デフォルトの名無しさん :03/04/20 23:23
C++使いの皆さんに質問です。
MFCは"なんちゃってC++"なのはともかく、WTLはどう思いますか?
MFCよりもマシなC++の使い方してると思いますか?

356 名前:デフォルトの名無しさん :03/04/20 23:24
Win32 API は、非 OOPL からでも使えるように、クラスになっていないから void *
が出てきちゃったりするんだね。
C とかから API アクセスできなくてもいいんなら、Win32 API を OO で設計することが
できるから、void * なんて出てきやしないよ。

357 名前:デフォルトの名無しさん :03/04/20 23:27
OO で設計するときに、非 OO なライブラリとリンクしなきゃならないときに、
void * が出てくる可能性は高くなる。だって OO じゃないから。


358 名前:デフォルトの名無しさん :03/04/20 23:28
マシでもクソでもATL/WTLはCOM扱う時に楽だ


359 名前:デフォルトの名無しさん :03/04/20 23:29
COM 扱うなら、BCB の COM の取り込みで VCL コンポーネントにラップしちゃうのが
もっと楽だ。


360 名前:デフォルトの名無しさん :03/04/20 23:31
いや、COMは扱わなくて良いです。ただのWinアプリを作るライブラリとしてのATL/WTLで。

361 名前:デフォルトの名無しさん :03/04/20 23:31
データ構造を隠蔽化して機能をエクスポートするようなDLLを
作ったことがない達人気取りの厨房は、ママのおっぱいでも飲んで早く寝なさい。

...全く信じられんな、こいつらは。
どうせVBやDelphiで作っても大して変わらないようなGUIアプリしか
作ったことないんだろうな。...可哀想に。



合掌。



362 名前:デフォルトの名無しさん :03/04/20 23:31
もうGUIまわりはなんでもいいと思うのはまちがですか?

363 名前:デフォルトの名無しさん :03/04/20 23:33
>>361が何逝ってるかわからないのでつが。

364 名前:デフォルトの名無しさん :03/04/20 23:33
>>363
やっぱり厨房だな


合掌。

365 名前:340 :03/04/20 23:33
>>344 なるほど、そうだな。

366 名前:デフォルトの名無しさん :03/04/20 23:34
DLLを作ったことがないのが達人?
DLLを作ったことがあるのが達人?

DLLを作るのって、そんなにすごいの?

367 名前:デフォルトの名無しさん :03/04/20 23:36
>>361
>> ...全く信じられんな、こいつらは。
>> どうせVBやDelphiで作っても大して変わらないようなGUIアプリしか
>> 作ったことないんだろうな。...可哀想に。

開発環境に強く依存するようなGUIアプリを開発すると幸せになれるんですか?




368 名前:デフォルトの名無しさん :03/04/20 23:36
DLLを作るのがすごいことだと思っている厨房です。

369 名前:デフォルトの名無しさん :03/04/20 23:36
>>366
全然すごくないが、少なくとも>>361の言うようなDLLを作るときには、
void*や関数ポインタがよく出てくる。

370 名前:デフォルトの名無しさん :03/04/20 23:37
>>366
単にDLLを作るだけならマニュアルを読む能力があるかどうかぐらい

371 名前:デフォルトの名無しさん :03/04/20 23:38
もひとつ言うと、たとえば、
>データ構造を隠蔽化して機能をエクスポートするようなDLL
なんだか覚えたての言葉を無理に使ってるようで、微妙に変だが、
「データ構造を隠蔽して機能をエクスポート」してないDLLってあるの?

ちょっといじめすぎちゃったかな、俺?

372 名前:デフォルトの名無しさん :03/04/20 23:38
大漁だ(藁

373 名前:デフォルトの名無しさん :03/04/20 23:38
>>371
変数dllexportしまくりなDLLとか(藁

374 名前:デフォルトの名無しさん :03/04/20 23:39
あ、>>363==>>366==>>371です。

375 名前:デフォルトの名無しさん :03/04/20 23:41
>>355の話題と混同したのかな?

376 名前:デフォルトの名無しさん :03/04/20 23:48
「C++は便利」という結論でよろしいか?

377 名前:デフォルトの名無しさん :03/04/20 23:51
「propertyとdelegateとdynamic class loadingがないので糞。
その不便さに気づいてない奴も糞。」という結論でよろしいか?

378 名前:デフォルトの名無しさん :03/04/20 23:52
君が去ってくれるなら、それでいいよ。

379 名前:デフォルトの名無しさん :03/04/20 23:53
もともとのDLLって、C++じゃなくてCを基準に作られてるだろ。
まずいのはDLLの仕様であってC++ではないと思う。
ぼろが出るといやなんであんまり具体的には書かんが。

380 名前:デフォルトの名無しさん :03/04/20 23:55
>>301
http://member.nifty.ne.jp/yamazaki/doc/cpp_design_pattern.html#Strategy

381 名前:デフォルトの名無しさん :03/04/20 23:55
>>379
じゃあ俺がぼろを出す覚悟で代わりに書いてやるよ。

382 名前:デフォルトの名無しさん :03/04/20 23:56
>>353
Qtのsignal/slotなんてのは、関数ポインタへの回帰だと
思うが。クラス単位でなく、オブジェクト単位での関係
を表したい時は、やっぱり関数ポインタの方が直観的
だし、既存の継承階層をいじらずに済むだけ柔軟性も
高いと思う。

383 名前:デフォルトの名無しさん :03/04/21 00:02
仮にDLLをクラスをexportできるような仕様に変えられるとしても、
言語やコンパイラによる縛りが関数単体でexportしている現在より強く出てしまうのではないかなあ。
関数だけだと、呼びだし規約程度しか迷うところが無いけど、
クラスだと、VMTのレイアウトやnew/deleteの挙動を揃えないといけないから。

384 名前:デフォルトの名無しさん :03/04/21 00:04
>>383
COM はそうなっている。


385 名前:デフォルトの名無しさん :03/04/21 00:04
「VC++.NETに移行すれば万事解決」という結論でよろしいか?

386 名前:デフォルトの名無しさん :03/04/21 00:04
>>383
その new や delete の、クラスごとに異なる部分って言うのは、
どこに揃えられると期待してますか?

387 名前:デフォルトの名無しさん :03/04/21 00:08
>>383
エクスポートされたクラスのユーザが、そのクラスのVMTのレイアウトまで
知る必要があるの?
COMを使うのってそんなに大変?

388 名前:デフォルトの名無しさん :03/04/21 00:09
最後の1文は>>384へ。

389 名前:デフォルトの名無しさん :03/04/21 00:10
>>386
Windows ならこれで OK。

template<class T>
class myallocator<T> {
IMalloc *pMalloc;
public:
myallocator() { CoGetMalloc(&pMalloc); }
~myallocator() { pMalloc->Release(); }

allocate(...) { return pMalloc->Alloc(...); }
deaclloacte(...) { pMalloc->Free(...); }
};


390 名前:デフォルトの名無しさん :03/04/21 00:11
>>387
大丈夫です。Windows 上の VTABLE は事実上 COM 規格で統一されています。

391 名前:デフォルトの名無しさん :03/04/21 00:17
>>390
GNAT(gccのAda)のVTABLEは、少しずれる(先頭に8バイトのメタクラス情報が入る)ので、
直接COMを使えませんでした…。
(C++と関係無い話でごめん)

392 名前:デフォルトの名無しさん :03/04/21 00:18
>>391
こんな感じですかね。
http://www.tietew.jp/cppll/archive/1907


393 名前:デフォルトの名無しさん :03/04/21 00:22
>>386
Xerces-C の XMLString::release() の実装を見ればわかりますよ。


394 名前:デフォルトの名無しさん :03/04/21 00:22
>>389
コピーしたらあぼーん。

395 名前:デフォルトの名無しさん :03/04/21 00:22
>>392
そうそう。(探してた情報が…サンクス)
あれ?ということは、Adaに限らずgccを使った場合はC++もダメ?

396 名前:デフォルトの名無しさん :03/04/21 00:22
おまえら、Tietewタソのコピペを、あたかも自分で考えたかのように語るのは勘弁してくだちい。

そんくらいにしとかないとぶっ殺しますよ。




つか、最低限、引用しろやコピペ野郎。その上、わざわざageで? 馬鹿じゃねえの?

397 名前:デフォルトの名無しさん :03/04/21 00:30
>>395
だめですね。

398 名前:デフォルトの名無しさん :03/04/21 00:30
>>396
名無しに名無しで何言ってんだ。
「おまえら」ってことはコピペが複数あんのか?どれがコピペ?
自分で考えたかのように語って誰かが得したり損したりするほどの内容は見当たらないが。

本人が「見て見て〜」ってageで書いてたりしたら面白いな。

399 名前:デフォルトの名無しさん :03/04/21 00:32
>>398
ネタにネタレスカコワルイ!

400 名前:デフォルトの名無しさん :03/04/21 00:36
誰かがMINGW32でDirectXを使っていたような…
lpDirectDraw->lpVtbl->Release(lpDirectDraw);とかやっていたのだろうか




401 名前:◆TJ9qoWuqvA :03/04/21 05:27
.

402 名前:デフォルトの名無しさん :03/04/21 08:41



      このスレは終了しました。





403 名前:デフォルトの名無しさん :03/04/22 14:01
C++が非手続型言語といわれる意味がわからない。
Cが手続型言語といわれる意味はなんとなくわかる。
だけど俺にはC++ってのはCにクラス機能が付いた程度にしか
思えないので、どうしてそれが非手続型なのかがわからない。

どなたかわかりやすく教えてくれろ。

404 名前:デフォルトの名無しさん :03/04/22 15:26
>>403
> C++が非手続型言語といわれる意味がわからない。
どこに書いてあるのでしょか

405 名前:デフォルトの名無しさん :03/04/22 16:12
>>403
とりあえず、憂鬱本でも読んどけ

406 名前:デフォルトの名無しさん :03/04/22 16:14
templateは関数型っぽいけど、基本的に手続き型じゃないの?
"非手続型"ってじゃあ何型なんだ

407 名前:デフォルトの名無しさん :03/04/22 16:23
>>400

IDirectDraw_Release(lpDirectDraw) みたいにマクロが用意されてる。


408 名前:デフォルトの名無しさん :03/04/22 16:42
>>403
それがわかったところでなにかうれしいことがあるかい?
漏れにはどうでもいいことだとしか思えないが

409 名前:デフォルトの名無しさん :03/04/22 17:01
>>408
死ね

410 名前:デフォルトの名無しさん :03/04/22 17:46
>>409
つうほうしといたよw
あーあww
死ねとか逝っちゃたねwww
ひろしにIP提出されてタイーホwwww
みじめだねーwwwww

411 名前:デフォルトの名無しさん :03/04/22 18:17
ひろし、って誰だよ。
さくらももこの父親か?

412 名前:デフォルトの名無しさん :03/04/22 19:18
ひろしかよ

413 名前:デフォルトの名無しさん :03/04/22 19:28
管理人っていうか、IPを見れる権限がある人の一人だよ。

414 名前:デフォルトの名無しさん :03/04/22 19:38
スーパーハカーキターーーーーーーーーーーーーーーーーーーー!!!!

415 名前:デフォルトの名無しさん :03/04/22 19:40
ハッシュテーブルは標準化されてないってホントですか?

416 名前:デフォルトの名無しさん :03/04/22 20:03
ぬるぽも標準化してください

417 名前:デフォルトの名無しさん :03/04/22 20:38
namespace std{

typedef NullPointerExeption Nullpo;

class ( ´∀`){
public:
 Nullpo* ぬるぽ(){
   return hammer_cast<Nullpo*>( ガッ );
 }
}

418 名前:デフォルトの名無しさん :03/04/22 22:14
唐突で申し訳無いけど、ちょっと質問。
今VC++でWin32のアプリを作っているんですが、その自身の中で、
「自分のファイルネーム」って、どうやって取得したらええんでしょうか。


419 名前:デフォルトの名無しさん :03/04/22 22:21
一番目のパラメータにNULLをセットし、モジュールの名前をゲットします。

420 名前:デフォルトの名無しさん :03/04/22 22:36
(´-`).。oO(というかVCスレかWin32APIスレで聞けよ‥‥
       ちなみにBCBだとApplication->ExeNameに入ってたり‥‥)

421 名前:418 :03/04/22 22:41
>>419-420
そスね。失礼。

422 名前:デフォルトの名無しさん :03/04/23 19:52
変数から、その変数の型を取得することって出来ますか?

423 名前:デフォルトの名無しさん :03/04/23 19:58
>>422
typeidでgoogle


424 名前:422 :03/04/23 20:37
>>423
ありがとうございます

425 名前:デフォルトの名無しさん :03/04/23 21:22
VisualC++6.0は-GXオプションをつけないと例外処理が有効にならないみたいなんですけど、
デフォルトで例外処理機構を有効にすると、なにか不都合なことがあるんでしょうか。
最適化の妨げになるとか・・・

426 名前:デフォルトの名無しさん :03/04/23 22:45
>>425
心配するな、お前が考えている「例外処理」は常に有効だ。

(なんでヘルプを読まんのか...。)

427 名前:デフォルトの名無しさん :03/04/23 22:56
>>426
cl /?とやっても-GXに関するヘルプは表示されないけど。

428 名前:デフォルトの名無しさん :03/04/23 22:57
/GXならでるけど、「enable C++ EH (same as /EHsc)」って何よ!? ExceptionHanler?

429 名前:デフォルトの名無しさん :03/04/23 23:02
しかたないからごみの山からMSDNライブラリを出してきて見てみた。

このオプションは、extern C 関数が例外をスローしないと想定して、同期例外処理を有効にします。これは、/EHsc と同じです。

はぁ・・・よくわかんね。

430 名前:デフォルトの名無しさん :03/04/23 23:09
>>427-428
-GXと/GXは同じだ馬鹿

431 名前:デフォルトの名無しさん :03/04/23 23:37
>>429
よくわからないなら、まだお前には関係ないということだ。
そのままにしておくのが吉。

432 名前:デフォルトの名無しさん :03/04/23 23:38
-GXはうざい警告を消すためのものと覚えておけばいいね。


433 名前:デフォルトの名無しさん :03/04/24 00:41
/GundamX

434 名前:デフォルトの名無しさん :03/04/24 00:57
http://210.153.114.238/img-box/img20030423224051.jpg

435 名前:デフォルトの名無しさん :03/04/24 10:05
>>418
argv[0]


436 名前:デフォルトの名無しさん :03/04/24 10:47
http://210.153.114.238/img-box/img20030424082109.jpg
どうやって組めば良いですか??

437 名前:デフォルトの名無しさん :03/04/24 10:52
>>436
それで合ってる。問題ない。

438 名前:デフォルトの名無しさん :03/04/24 11:03
>>436は見てないけどあちこちにあるからきっとブラクラ

439 名前:デフォルトの名無しさん :03/04/24 11:09
>>438は押す事もできないヘタレの癖にあちこちで同じコメントしてる腰抜けインポ野郎

440 名前:デフォルトの名無しさん :03/04/24 11:10
>>436
むしろこっちが聞きたい
強いて点をつけるなら満点だよ 自信持て

441 名前:デフォルトの名無しさん :03/04/24 11:12
マルチのくせに偉そうだな(w

442 名前:デフォルトの名無しさん :03/04/24 11:19
>>441=マルチポスト

443 名前:デフォルトの名無しさん :03/04/24 11:29
>>436がマルチなんだからレスもマルチになるよ。当然。

444 名前:デフォルトの名無しさん :03/04/24 13:02
書き込み違反の例外ウィンドウが出てしまいます。
string s1="abcdefg123456789";
char *c1;
s1.copy(c1,6,0);
どうしてでしょう。
どうかよろしくお願いします。

445 名前:デフォルトの名無しさん :03/04/24 13:19
c1が何もさしてないじゃん

446 名前:444 :03/04/24 13:54
>>445
レスありがとうございました。動くようになりました。

447 名前:デフォルトの名無しさん :03/04/24 18:18
質問ばかりですみません。
string s1="";
string s2="";
string vs1="abcdefg123456789";
char *c1;
c1 = (char *)s1.c_str();
vs1.copy(c1,6,0);
s2=s1;
s1のなかには"abcdef"が入っているのに、s2の中身は""です。
なぜなのでしょうか?

448 名前:デフォルトの名無しさん :03/04/24 18:24
>>447
なんでc_strがconst char*を返すのか考えろ。
s1.c_str()が返すポインタの先にたまたまメモリが確保されてただけの話。

449 名前:デフォルトの名無しさん :03/04/24 19:22
>>447
俺も前それやったが、
vs1.copyの行で、そういう風にコピーすると s1の領域(size)が変更されない
(しかも、s1文字列がNULLで終わるかどうかわからない)
ので、
s2=s1の行で最初に指定されたsizeの分しかコピーしない。
この場合だとNULL文字1文字分か、0文字しかコピーされないので
s2は""になる。


450 名前:447 :03/04/24 19:45
>>448
レスありがとうございます。
亀レスすみません。長考してます。
>>449
なるほど。

451 名前:447 :03/04/24 19:54
string s1="";
string s2="";
string vs1="abcdefg123456789";
int n=6;
char *c1=new char[n];
vs1.copy( c1,n,0);
s2=s1=c1;
これでできたみたい。これでいいのでしょうか。
ご迷惑をおかけいたしました。

452 名前:デフォルトの名無しさん :03/04/24 20:01
>>451
良いと言えば良いけど、何でそんなことする必要があるの?
substr使えばいいじゃん。

453 名前:447 :03/04/24 20:02
そこまでいう理由はないだろ?

454 名前:デフォルトの名無しさん :03/04/24 20:05
別に言えとは言ってないがな。まぁ、がんがれ。

455 名前:447 :03/04/24 20:08
>>452
うわ、そういうのあったのですね。しりませんでした。
>>453は、
私じゃないですよ。

456 名前:デフォルトの名無しさん :03/04/24 21:51
このスレにも粘着のなりすまし荒らしがいるな……

質問する人はトリップ付けた方がいいと思うよ
捨てトリップでかまわないので

457 名前:デフォルトの名無しさん :03/04/24 22:51
>>447
なぜ、char*を使う必要があるのか疑問なのだが?

458 名前:デフォルトの名無しさん :03/04/24 23:07
せっかくstring使ってるのにねえ

459 名前:447 :03/04/25 11:41
レスありがとうございます。
>>457
copyメソッドの引数の型がchar*だったのでって単純な理由なのですが。
>>458
その文の意味はつまり、substrを使えばいいのにってことで理解すればいいですか?

460 名前:デフォルトの名無しさん :03/04/25 12:25
>>459
基本的に同種のコンテナなら、それをそのままコピーするメソッドがあるから
stringの場合char*を使う必要はないと思われ。

substr使わなくても
string vs1="abcdefg123456789";
string s1( vs1, 0, 6);


string s1= "";
string vs1="abcdefg123456789";
s1.assign( vs1, 0, 6);

でいいんじゃない?


ところで、char* を引数にとるAPIにstring入れる場合て
int size = 10;
string str(size);
hoge_API( const_cast<char*>(str.data()), str.size() );
とかって、やったりしてるんだけど、やっぱテンポラリな配列なりなんなり作成して
ポインタ代入したほうがよろしいのでしょうか?

461 名前:デフォルトの名無しさん :03/04/25 17:37
ぼくはいつもnoge_API((char*)s.c_str(),s.c_str())ですが、コンストポインタのキャスト後の動作に保障はないんっでしたっけ?

462 名前:デフォルトの名無しさん :03/04/25 20:55
有馬線

463 名前:デフォルトの名無しさん :03/04/25 22:32
class AAA {
private:
int m_a;

public:
Set(int a){ m_a = a; }
};

class BBB {
private:
AAA m_aaa;

public:
AAA GetAAA(){ return m_aaa; }
};

class CCC {
private:
BBB m_bbb[100];

public:
Insert(int i){ m_bbb[i].GetAAA().Set(100); }
};

464 名前:つづき :03/04/25 22:33
クラスCCCのInsert()関数を実行してもクラスCCCのメンバのm_bbb.m_aaa.m_a
の値が変わりません。なぜでしょう・・・
テストにクラス中のprivate:をpublic:に変えて、
直接代入してみましたところ、ちゃんと値が変わりました。
どこかが致命的に間違っていると思うのですが、グーグルでは調べきれなかったので
皆様の力を貸していただきたいです。お願いします。
(かなり簡単化したので、このプログラム自体にあまり意味はありません。)

465 名前:デフォルトの名無しさん :03/04/25 22:38
> AAA GetAAA(){ return m_aaa; }
コピーを返しているから。参照返せ。

466 名前:464 :03/04/25 22:40
あ、なるほど・・・
ありがとうございました^^

467 名前:デフォルトの名無しさん :03/04/25 22:52
>>464
クラスのメンバにクラスのインスタンスは持たせないほうがいいと思うが・・・。
比較的小さいのならともかく、 operator= の実装がめんどくさそうな位
でかいクラスなら、ポインタもたしたほうがよくないか?


468 名前:464 :03/04/25 23:00
>467
あまりわかりませんが、
class CCC {
private:
BBB *m_bbb;
};
こういう風にするんですか?
よろしくお願いします。



469 名前:467 :03/04/25 23:46
実際の実装は
BBB *m_bbb;
としてコンストラクタで
CCC::CCC(int n)
{
m_bbb = new BBB[n];
}
としていますが。

470 名前:464 :03/04/25 23:47
464でした。

471 名前:デフォルトの名無しさん :03/04/26 02:58
467とは別人だけど…

>>470
ちゃんとメモリリークの対策してればそれでよいと思う。
データを共有しても問題ないのなら、
参照回数計測を実装したポンタのラッパークラスのテンプレートを使うとベターかな。
場合にもよるけど。

472 名前:471 :03/04/26 02:59
ポンタってなんだよ…
ポインタですた。

473 名前:デフォルトの名無しさん :03/04/26 03:00
ああ、突っ込もうと思ったのに

474 名前:デフォルトの名無しさん :03/04/26 03:07
ポンタって良い感じだな。

475 名前:デフォルトの名無しさん :03/04/26 07:59
「インターフェースの継承」はいいけど「実装の継承」はだめって、
C++ではどういうことなんでしょう。
それとも、これって、Javaマンセー厨のごたく?

476 名前:デフォルトの名無しさん :03/04/26 08:33
>>475
言語は関係ない話だろ。

477 名前:デフォルトの名無しさん :03/04/26 09:05
>>476
で、どーゆー話?

478 名前:デフォルトの名無しさん :03/04/26 09:27
こんなはなし。
http://www.microsoft.com/japan/msdn/library/ja/vbcn7/html/vaconWhenUseInheritance.asp
http://www.microsoft.com/japan/msdn/library/ja/vbcn7/html/vaconWhenToUseInterfaces.asp

479 名前:デフォルトの名無しさん :03/04/26 09:30
>>475
「実装の継承」はダメって云われたら
private 継承の立つ瀬が無いような気がする。

480 名前:470 :03/04/26 11:14
>>471
もちろんデストラクタで、delete [] m_BBB; で開放しています。
>参照回数計測を実装したポインタのラッパークラスのテンプレートを使うとベターかな。
どんな利点がありますか?

481 名前:デフォルトの名無しさん :03/04/26 11:22
>>480
デストラクタで、delete [] m_BBB; で開放する必要が無くなる
コピーコンストラクタを特に書く必要が無くなる
代入演算子を特に書く必要が無くなる

他いろいろ

482 名前:デフォルトの名無しさん :03/04/26 11:33
>>480
具体的な例は「プログラミング言語C++第3版」のP347以降を読むといいよ。


483 名前:デフォルトの名無しさん :03/04/26 11:34
BCB6で
PNGの解凍をしてGraphics::TBitmapで利用できる形にしたいのですが
GLDPNGは使用条件の関連でアウトなんで
何か簡単な方法ってないでしょうか?
読み込みだけでいいんで・・・

SUSIEも考えたんですが別途SUSIEプラグイン用意しろっていうのも
なんなんで・・・

よろしくおねがいします

484 名前:デフォルトの名無しさん :03/04/26 11:48
ここはBCBスレじゃない。

485 名前:デフォルトの名無しさん :03/04/26 11:52
>>484
スマソ・・該当スレが見つかったんでそちらに移動します

486 名前:デフォルトの名無しさん :03/04/26 13:35
>>478
つーか、それVBだからじゃねーの?


487 名前:デフォルトの名無しさん :03/04/26 18:18
「実装の継承」がどうのって言ってるのは、Java廚かブビ廚だけ。
C++の言葉にはない。


と言っておこう。

488 名前:480 :03/04/26 18:22
>>481,482
え、そんな便利なクラスがあるんですか・・・
作り方なんて載ってるHPなんてないですよね。
やっぱ本を買うしかないんですか。
親切にありがとうございました。

489 名前:デフォルトの名無しさん :03/04/26 18:28
>>488
boostを使うべし
ttp://www.boost.org
解説
ttp://www.kmonos.net/alang/boost/

490 名前:488 :03/04/26 18:50
>>488
ありがとうございます。
やっぱり便利なものは世界の誰かが作ってるもんですね。
こういうライブラリって皆さん使ってるんですか?
ラッパークラスっていうぐらいだから、自分が作ったスーパークラスから
派生させたクラスだと思いました。

491 名前:デフォルトの名無しさん :03/04/26 19:18
C++最強のCSVライブラリって、プログラミング作法に
載ってる香具師でいいんですか?

492 名前:デフォルトの名無しさん :03/04/26 20:23
C++でC#のデリゲートに相当する機能って実現可ですか?

493 名前:デフォルトの名無しさん :03/04/26 20:27
可です。

494 名前:デフォルトの名無しさん :03/04/26 20:49
>>490
便利といえば便利だが、仕様をしらないで使ってるとはまるので気をつけるべし。

とりあえず、template、参照、継承あたりをきちんと理解してから使ったほうがいいと思われ。
あとは、キャストかな?
dynamic_cast,const_cast,static_cast,reintrupt_castとか大丈夫?

あと、stlが使えることが前提条件かな?

495 名前:デフォルトの名無しさん :03/04/26 20:54
> reintrupt_castとか大丈夫?
...大丈夫?

496 名前:デフォルトの名無しさん :03/04/26 20:59
>>495
再割り込みキャスト?

497 名前:494 :03/04/26 21:02
reinterpret_castだね。
あんまつかわんから、大丈夫じゃねーや。
回線きって(略

498 名前:デフォルトの名無しさん :03/04/26 21:06
すいません。どなたかちょこっとおしえてください。
.NET Microsoft Framework SDK で、C言語のソースを
コンパイルする方法を教えてください。


499 名前:492 :03/04/26 21:14
>>493
どうやればいいのかわかりませんがやってみます

ありがとうございます

500 名前:デフォルトの名無しさん :03/04/26 21:50
>>498
てきとーにパス通してDOS窓から
cl aiueo.c

>>499
boost::bind とか、あるいは std::mem_fun + std::bind1st とか。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.