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


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

C++相談室 part10
251 名前:デフォルトの名無しさん :02/08/25 10:09
>>249
それって通ぶってるか?

252 名前:デフォルトの名無しさん :02/08/25 10:31
>>251
健全なスキルアップは健全な用語からだ。ってことじゃないの?


253 名前:デフォルトの名無しさん :02/08/25 12:48
>>242
それはD?
C++では無理かやっぱり

254 名前:デフォルトの名無しさん :02/08/25 15:00
>>253 メンバ関数でいいような気が。
なぜコンストラクタじゃないと駄目なの?

255 名前:デフォルトの名無しさん :02/08/25 15:25
唯一のオブジェクトを記述するのに
クラス指向でないオブジェクト指向でエレガントに記述してみたかっただけ
C++では機能が少なすぎるな

256 名前:デフォルトの名無しさん :02/08/25 15:47
pragmaってどういう意味?使い方じゃなくて、英単語として。名前の由来というか。

257 名前:デフォルトの名無しさん :02/08/25 16:00
>>256
pragmatic、の略。
http://www.dictionary.com/search?q=pragma&db=*

258 名前:デフォルトの名無しさん :02/08/25 16:02
>>255
new、delete オーバーロードして自前で関数を呼び出すとか。

259 名前:デフォルトの名無しさん :02/08/25 16:04
と思ったけど名前が無いから無理か・・・。

260 名前:デフォルトの名無しさん :02/08/26 13:42
>>37>>98

上に関連して教えて下さい.
コンパイル単位が複数あるときに,あるコンパイル単位中のグローバルオブジェクト
やグローバル変数を一番最初に初期化する方法ってありますか?main()関数内でこれ
らを初期化する関数を最初に呼び出せば良いでしょうけど,できればこの関数の呼び
出しをmain()関数内で明示的に呼び出すのではなく,裏側でこそっと呼び出したいの
ですが.


261 名前:デフォルトの名無しさん :02/08/26 13:50
>>260

グローバルオブジェクトを初期化する関数をmain()関数内で最初に呼べばok
かどうかも妖しくなってきた.

262 名前:デフォルトの名無しさん :02/08/26 14:08
>>260
realmainをつくれ

263 名前:デフォルトの名無しさん :02/08/26 15:33
>>262
どうもです.
realmainの補足説明をもう少しいただければありがたいのですが.
〜を調べろとか,〜のサイトを見ろとか.


264 名前:デフォルトの名無しさん :02/08/26 15:43
>>263

int realmain()
{
 /* main のかわり */
 return 0;
}

int main()
{
 初期化();

 return realmain();
}

265 名前:デフォルトの名無しさん :02/08/26 16:12
シャブ中の1が何言っても無駄

266 名前:デフォルトの名無しさん :02/08/26 16:16
質問です。

int *a;

int* a;
って何が違うんでしょうか?

267 名前:デフォルトの名無しさん :02/08/26 16:17
>>266書き方が違う。
int * a;って書くやつもいる。

268 名前:デフォルトの名無しさん :02/08/26 16:19
>>264
ありがとうございます.コードをじっと見てるうちにその意味が
少しだけわかってきました.勉強させてもらいます.


269 名前:デフォルトの名無しさん :02/08/26 16:21
>>267
書き方だけの違いだったのか。
了解しました。

270 名前:名無しさん@カラアゲうまうま :02/08/26 16:23
>>266
http://pc3.2ch.net/test/read.cgi/tech/1027347982/472-476

271 名前:デフォルトの名無しさん :02/08/26 16:24
Rubbj mkl,,......CCCC*********++

272 名前:デフォルトの名無しさん :02/08/26 16:26
>>269
オブジェクト指向な俺は
インテジャーポインタという型だと主張したいから
int* a;と書く方針。
他人には強制しないがint *a;派のやつからはいろいろ文句言われる。

273 名前:266 :02/08/26 16:30
>>272
ポインタ型として宣言するか、
宣言したものがポインタであるのか。

結局同じ事なのか・・・

もう一つ質問です。
int* a;がなんでオブジェクト指向なんすか?

274 名前:272 :02/08/26 16:38
>>273
>int* a;がなんでオブジェクト指向なんすか?
それ自体はオブジェクト指向でもなんでもないけど、
ポインタなんていう概念をできるだけ隠蔽したいという意志の現れだから。

275 名前:デフォルトの名無しさん :02/08/26 17:16
質問お願いします。
以下のように、一時変数をリストに挿入した場合、スコープを抜けた後も、
リストに挿入したtemp_msのデータは保持されるのでしょうか?

list<MyStruct> list_ms;

func(){
  MyStruct temp_ms;
  list_ms.push_back( temp_ms );
}

main(){
  func();
}

276 名前:デフォルトの名無しさん :02/08/26 17:22
値を保存しているのだから当然格納されたオブジェクトは
コンテナと同じ寿命を持ちえる

277 名前:デフォルトの名無しさん :02/08/26 17:43
<<276

本当? push_back関数が値コピーして要素追加するならいいが
void push_back(const T& x)となってる.
ローカルオブジェクトは関数から抜けると破棄されるから危ないのでは?

278 名前:デフォルトの名無しさん :02/08/26 17:47
えいくそっ! <<276 じゃなくて >>276 だった.

279 名前:デフォルトの名無しさん :02/08/26 17:54
list<MyStruct&>ならばね。しかし
参照型のコンテナはそもそも許されないはず

280 名前:デフォルトの名無しさん :02/08/26 17:55
>>277
>本当? push_back関数が値コピーして要素追加するならいいが
>void push_back(const T& x)となってる.

TがMyStructでMyStruct temp_msとあるから
listのスコープが終わればその要素も破棄されるよ。
ただしMyStructのデストラクタをちゃんと書いてなければ
MyStruct内で定義されたデータは破棄されないことに注意。

>ローカルオブジェクトは関数から抜けると破棄されるから危ないのでは
この文章をみると知識だけあって理解してない厨房に見えるけど。

281 名前:226 :02/08/26 17:58
C++ での DLL 作成に関して質問をした者です。
>227 様のヒントのおかげでどうにか解決できました!
ありがとうございました。
おかげでバックグラウンドの重めの処理を C++ で作成、 GUI は別の言語で
作りこむっていうステキなことが出来るようになりました。

原因
以前のが上手くいかなかったのは、C++だとなにやら「マングル」という卑猥な単語
が激しく関係する為だったようです。

回避策
関数郡を extern "C" してあげればそれが回避できるようです。

bcc32 -O2 -WD dll.cpp // DLL 作成時のコンパイラオプション
bcc32 -O2 test.cpp // EXE 作成時のコンパイラオプション
-- dll.h --
#ifndef __DLL_H__
# define __DLL_H__
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) int __stdcall MyFunction(int);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // __DLL_H__

-- dll.cpp --
#define __MAKE_DLL__
#include "dll.h"
namespace mydll{
 __PORT int __stdcall MyFunction(int x)
 {
   return x+100;
 }
}

-- test.cpp --
#include <windows.h>
#include <cstdio>
using namespace std;
typedef int __stdcall (*TFUNC)(int);
int main() {
 HINSTANCE  hInstDLL;
 TFUNC DllFunction;
 if((hInstDLL=LoadLibrary("dll.dll"))==NULL) { printf("オープン失敗"); exit(1); }
 if (DllFunction=(TFUNC)GetProcAddress(hInstDLL,"MyFunction")) printf("%d\n\n",DllFunction(1));
 else printf("しっぱい\n");
 if(!FreeLibrary(hInstDLL)) { printf("クローズ失敗"); exit(1); }
 return 0;
}
-- 実行結果 --
C:\SLLTEST>test
101

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

282 名前:SITNAM :02/08/26 18:09
前スレで1000とったのは俺だよ…エヘヘ…
俺って天才だよな。

283 名前:デフォルトの名無しさん :02/08/26 18:11
>>282ああおまえは天才だ。とおだてたところで一発ネタかましてください。

284 名前:226 :02/08/26 18:13
>281
dll.cpp にいらぬものが入ってました。

訂正。
-- dll.cpp --
#include "dll.h"
__declspec(dllexport) int __stdcall MyFunction(int x)
{
 return x+100;
}

板汚し、すんまそん。

285 名前:デフォルトの名無しさん :02/08/26 19:48
>>277

勘違い! void push_back(const T& x)は値コピーで要素追加だった.
コピーコンストラクタの引数も const T& x だし.

>この文章をみると知識だけあって理解してない厨房に見えるけど。

ああ永遠の厨房よ.

286 名前:デフォルトの名無しさん :02/08/26 20:00
>const T&
C++3rdの135頁に詳しくかいてある

287 名前:デフォルトの名無しさん :02/08/26 20:06
>>277=>>285 自己修正してるらしいけど・・・・
そっとしておいてやるべきか、いやはっきり逝ってやるのがいい。
(・∀・)カエレ

288 名前:275 :02/08/26 20:08
>>276-280 >>285
お礼が遅くなってすいません。今まで下さったレスの意味を
必死で考えていました。

listが内部で自動的にnew、deleteか何かをしてくれていて、
リスト追加は、ポインタ(参照)リストとかでない限り、値コピーで渡される。
clear()した場合はデストラクタが呼ばれる。…ということですよね

まだC++始めたばかりで、本当に助かりました。
レス有り難うございました。

289 名前:デフォルトの名無しさん :02/08/26 20:18
>>277は間違い。

290 名前:デフォルトの名無しさん :02/08/26 20:18
>>285は間違い

291 名前:デフォルトの名無しさん :02/08/26 20:20
>>289は間違い

292 名前:275 :02/08/26 20:44
>>289-291
おおお、混乱してきました(@〜@

293 名前:デフォルトの名無しさん :02/08/26 20:53
>>292
他人を信じることが間違い

294 名前:デフォルトの名無しさん :02/08/26 22:30
質問です。
class Test
{
public:
 Test(void)
 {
  cout << "コンストラクタ" << endl;
 }
 void operator () (void)
 {
  cout << "オペレーター" << endl;
 }
};
というクラスがありまして、
Test a;
とやるとコンストラクタが呼ばれるんですが、
Test a();
とやると、コンストラクタが呼ばれないんですが、
これは仕様ですかね?それとも違う(隠れた?)コンストラクタ呼んでるんですかね?

295 名前:デフォルトの名無しさん :02/08/26 22:32
Test a();
ってTestを返す関数aの宣言では?

296 名前:294 :02/08/26 22:46
>>295
なるほど!!
スコープ内でも宣言ができるとはしらなんだ。
どうもありがとうございました。

297 名前:デフォルトの名無しさん :02/08/26 22:52
>>295
・・・罠?

298 名前:デフォルトの名無しさん :02/08/26 23:16
まあ罠といってもいいでしょうね。
C++ では、「宣言とみなせるところは宣言と解釈する」というのが
ルールのようですから。

299 名前:デフォルトの名無しさん :02/08/26 23:30
>>260
一般には、ない。ただし処理系によってはリンカのオプションで指定できる
ケースもある。

良く使う workaround は「ローカル static オブジェクト」を使うことだね。こんな
感じ。

CFoo& GetGlobalCFoo() {
  static CFoo foo;
  return foo;
}
#define g_foo GetGlobalCFoo()

ローカル static オブジェクトに関しては、最初に参照されたタイミングで
初期化されることが決まってるから。

300 名前:デフォルトの名無しさん :02/08/27 00:41
コールバック関数ってどういうときに便利なんですか?
Windowsのコールバックでなくて、もっと一般的な意味で
コールバックを使った簡単なコードを誰か貼り付けてもらえませんか?
ちなみに私はコールバックを使ったことが一度もありませんが、
特に困ったことはありませんでした(多分)。

301 名前:デフォルトの名無しさん :02/08/27 00:43
>>300
その質問、何度も見た。

302 名前:デフォルトの名無しさん :02/08/27 00:43
>>300
C++ だと関数オブジェクトや仮想関数が使えるからな…。

素の C だと、たとえば qsort() で比較に用いる関数を指定するのに使ったり
するわな。

303 名前:デフォルトの名無しさん :02/08/27 02:05
漏れの持ってる本には、メンバー関数定義するとき、
常にvirtual宣言せよって書いてあるんだけど、実際そうなんですか?

304 名前:デフォルトの名無しさん :02/08/27 02:08
>>303読み間違いでは?
本の名前と原文をうpしてくださいw

305 名前:303 :02/08/27 02:16
本の名前は、
「憂鬱なプログラマのためのオブジェクト指向開発講座」
Tucker!著 です。

その本の151ページに、
「メンバ関数はどれも将来オーバーライドされる可能性があり・・・(中略)
メンバ関数は基本的にすべて仮想関数として実装しておいたほうがいいでしょう」

と書いてあったのです。


306 名前:デフォルトの名無しさん :02/08/27 02:18
>>300
DLLを作ったことがない人にはわかりません。

307 名前:303 :02/08/27 02:18
ちなみにこれです。
http://www.amazon.co.jp/exec/obidos/ASIN/4881356194/ref=sr_aps_b_12/250-6712356-7321008

308 名前:デフォルトの名無しさん :02/08/27 02:20
>>306
発想が貧困だね。

309 名前:デフォルトの名無しさん :02/08/27 02:20
>>303 常にってのはちょっと、、、、

>>300
コールバック(というより関数ポインタ?)使うのは
関数ポインタでテーブル作ってswitchの代用にしたり、
STLとかの関数オブジェクトにしたり、
あとはUIの応答のときとか
シグナルや入出力を待つときとかに使うくらい、

310 名前:デフォルトの名無しさん :02/08/27 02:23
>>305一理あるけど、
他人や将来の自分にオーバーライドしてほしくない関数は基本的に仮想関数にしないよね。


311 名前:300 :02/08/27 02:24
>>306
逆に言うと、DLLを作らないならコールバックはまったく使わなくて
いいということでしょうか?

312 名前:デフォルトの名無しさん :02/08/27 02:26
>>311
あなたがコールバックを使うレベルになるまで、使う必要はありません。

313 名前:303 :02/08/27 02:27
>>310
多くの場合は、仮想関数にしておいて、
特別な関数は、仮想関数にしないという事でしょうか?

だとすると、特別な関数ってどんなのか知りたいです。

314 名前:デフォルトの名無しさん :02/08/27 02:29
300には将来に渡って、コールバックは必要ないでしょう。

315 名前:デフォルトの名無しさん :02/08/27 02:34
>>313 inline

316 名前:デフォルトの名無しさん :02/08/27 02:35
>>313特別っていうかfinalにしたい関数は仮想にしないよね。
再利用の可能性がまったくない、他人に弄ってもらっては困る関数など。
ってゆうかDLLのみでソースがないときに
オーバーライドしたいけどできねーってことがないようにvirtualにしておくことはおすすめだけど、

そういう用途でなければ通常は後からvirtualキーワードを書き足せばいいわけで。
まあ実用的なプログラムつくるようになればわかるよ。

317 名前:303 :02/08/27 02:40
>>316
ご丁寧にありがとうございます。
ちょっと理解しますた。

318 名前:デフォルトの名無しさん :02/08/27 02:47
>>315はアホ

319 名前:デフォルトの名無しさん :02/08/27 02:52
>>310
> 他人や将来の自分にオーバーライドしてほしくない関数は基本的に仮想関数にしないよね。
まぁ、あの本は OO の入門書だから。

>>313
OO 分析の過程で出てきたメソッドではないもの。
例えば Generic Programming の流儀から出てくる operator() とか、実装の都合で
「処理が長くなるから関数に分けるか」ってな感じで作った private メソッドなど。

個人的には、実装の都合で出てきたメソッドに関しては pimpl イディオム使って
隠蔽した方が良いと思うけど。

320 名前:303 :02/08/27 03:02
>>319
今の漏れの実力じゃ、理解できないです。
もうちっと勉強してから出直してくるよ。
どうも、ありがとうございます。

321 名前:315 :02/08/27 03:19
>>313,>>318 gomen

322 名前:319 :02/08/27 03:50
>>320
ちと言葉足らずだったね。

C++ ってパラダイムごった煮の言語で、「憂鬱本」が解説してるような OO 流儀で
書くことも出来れば、STL のような Generic Programming 流儀で書くこともできる。
伝統的な C 言語のように、データ抽象 + 手続き指向も可という懐が広い言語。

OO 流儀でプログラミングする場合には

1 まず問題を OO で分析して
2 それを元に OO でクラス階層を設計して
3 最後に実装する

という手順を踏むから、必然的に 2 で出てくるクラスのメソッドは、原則として
virtual になる。

ただ純粋な OO 以外の設計・分析も入ってくると、必ずしも継承前提のクラス
ばかりではなくなるから(継承しない以上)virtual も不要になる。たとえば STL
コンテナは Generic Programming という OO とは別の流儀を採用してるから、
メソッドは全て non virtual だよね。

とりあえず「憂鬱本」は OO の入門書で、OO で分析・設計した成果をコードに
落とす道具として C++ を使っている。ただ C++ では他の流儀も使えるよ、って
ことだけ頭の隅に置いておけば良い。

(憂鬱本を読み終えたら、次に CODE COMPLETE とか Generic Programming
とか読んでみると良いかも)

323 名前:303 :02/08/27 04:07
>>319
親切なレスにめちゃくちゃ感謝してます。
まずは、ありがとうございます。

最近まで、はじめてのC++的な本で勉強していて、一通り理解したので、
他のスレで紹介されていた憂鬱本を読み始めたんです。
UMLとか全く知らなかった自分にとって、この本に書いてある事は
かなり衝撃的で面白く読めました。

是非、次は教えて頂いた本を読んでみようと思います。

324 名前:デフォルトの名無しさん :02/08/27 06:24
基本的にvirtualになんてのは古い考えだね。
virtualは情報隠蔽の原則を破壊する、この欠点は大きいということが
最近になって強く認識され出した。
JavaでデフォルトがvirtualになったがC#の時代になると、デフォルトが
finalに戻った。

325 名前:デフォルトの名無しさん :02/08/27 09:28
>>299
アドバイス,ありがとうございます.

326 名前:勉強中@C++ ◆lawMy/JQ :02/08/27 13:15
こんにちは。スレ名につられて、別のスレに書き込んだのですが、どうやらそこはネタスレ
だったようです。鬱
マルチポストになって申し訳ありませんが、改めてここで質問させてください。

以下コピペ

>はじめまして。オブジェクト指向を勉強中のものです。

>最近、ミックスインクラスとロールプレイングクラスの存在を知りました。

>私は複数(かなり多い)の問屋を相手にするオンラインシステムを開発・メンテしている
>のですが、問屋毎にいわゆる「特別処理」が多く、手を焼いています。

>そこで、ロールプレイングクラスを使うとこの「特別処理」をすっきり実装できるのでは?
>と考えているのですが、似たような案件を扱った方がいらっしゃれば、ご意見をお聞かせ
>いただけませんでしょうか?よろしくお願いいたします。

327 名前:デフォルトの名無しさん :02/08/27 13:30
>>324
先生、何故virtualが情報隠蔽を壊すのでしょうか?
継承が壊すというのは分かります。

328 名前:デフォルトの名無しさん :02/08/27 13:53
char型のデータを数値として出力したいんですけど
cout ではどうするんでしたっけ?
C だとこんな感じのやつ
printf("%d", ch); // ch はchar型


329 名前:デフォルトの名無しさん :02/08/27 13:56
intにキャストすれば?

330 名前:デフォルトの名無しさん :02/08/27 13:56
cout << dec << ch << endl; だったけな?

331 名前:デフォルトの名無しさん :02/08/27 14:24
>>327
まぁ、厳密にはそうだね。virtualだと継承した時に内部の実装を
知る必要が出てくる事が多いし壊しやすいと言うこと。

332 名前:デフォルトの名無しさん :02/08/27 14:29
static_cast<int>(ch)
int(ch)

333 名前:デフォルトの名無しさん :02/08/27 14:33
int(ch)

これってint型の一時オブジェクトを生成して左辺に代入ってことですか?

334 名前:デフォルトの名無しさん :02/08/27 14:45
>>333
左辺ないだろうに。intでキャストしているだけ。

335 名前:デフォルトの名無しさん :02/08/27 14:49
>>333
ISO+IEC+14882-1998.pdf
とか見れ。

336 名前:デフォルトの名無しさん :02/08/27 16:18
C言語初心者ですが、
LSI C-86 v3.30c試食版を使ってコンパイルしようと思うのですが、
書いてあるとおりやってからプロンプトで「lcc ****.c」 と入力すると、
「lccは操作可能な・・・ではありません」とか出てきてしまって、コンパイルできません。
一体どうしたらできるようになれるのでしょうか。。。

337 名前:デフォルトの名無しさん :02/08/27 16:23
VC6.0 スタンダードでも
ProcessorPackを入れると最適化できるようになるって
本当ですか?

338 名前:SITNAM :02/08/27 16:54
C++相談室の前スレ(パート9)で1000を取ったのは俺だからな
http://pc3.2ch.net/test/read.cgi/tech/1027347982/1000/
ほれ、みろ!すごいだろ!

339 名前:デフォルトの名無しさん :02/08/27 17:14
>>336
ネタ?

340 名前:デフォルトの名無しさん :02/08/27 17:15
>>336
パス通した?
っていうかLSI-CよりBCCを使えと(略)

341 名前:339 :02/08/27 17:21
漏れもBCCへ乗り換えをお勧めする。
この辺読めばわかるだろ。
http://www.forest.impress.co.jp/article/2000/07/05/sundayprog1.html

342 名前:デフォルトの名無しさん :02/08/27 18:27
Cygwinいれてgccという手もある。
unix系を扱ったことがあるなら、こっちもおすすめ

343 名前:デフォルトの名無しさん :02/08/27 19:01
VC6.0のメンバーテンプレートの問題って、
メソッドテンプレートだけじゃなかったんだね。

template<class T> class Outer {
 class Inner_ {
  T t;
 private:
  Inner(const T& ref) : t(ref) { }
 } Inner;
public:
 Outer(const T& ref) : Inner(ref) { }
};

これが通らなくて鬱ですた。

344 名前:デフォルトの名無しさん :02/08/27 21:21
>>343
なにがしたいの?

345 名前:デフォルトの名無しさん :02/08/27 22:02
>>331
> virtualだと継承した時に内部の実装を知る必要が出てくる事が多いし
それは仮想関数ではなく、実装継承のデメリットを語ってるように聞こえるが…。

346 名前:デフォルトの名無しさん :02/08/27 22:44
インターフェース継承も実装継承もvirtualキーワードしか関係しないからねえ...

347 名前:デフォルトの名無しさん :02/08/27 23:37
>>345-346この人達の言っていることを初級者の俺にもわかりやすく
教えてください。

348 名前:デフォルトの名無しさん :02/08/27 23:59
>>331
それは、親クラスがいい加減な実装をしているか、
子クラスの実装が親クラスの仕様を無視しているだけ。

349 名前:デフォルトの名無しさん :02/08/28 00:29
>>347
継承によるコード再利用は諸刃の剣。素人にはおすすめできない。

350 名前:347 :02/08/28 00:38
>>349御託はいいから教えてくださいよ〜w

351 名前:346=349 :02/08/28 01:20
>>350
めいっぱい易しく書いたつもりなんだが。

とりあえず「実装継承」と「インターフェース継承」で google 逝ってくれ。

352 名前:347 :02/08/28 01:31
>>351いみわかったよ!お手数かけてスマソ

353 名前:デフォルトの名無しさん :02/08/28 03:33
バカらしい質問で申し訳ないのですが。
様々な変数を宣言します。
int iText;
BOOL bText;
char cText;

さて、TCHAR型なら
なんという変数名ならみなさん見やすいですか?

354 名前:デフォルトの名無しさん :02/08/28 04:00
あんたの命名規約意味不明なんでなんとも。

355 名前:353 :02/08/28 04:18
>354
えっもしかして、現時点で私狂ってます?

356 名前:デフォルトの名無しさん :02/08/28 04:32
>>355人に聞かなくても自分を客観的にみれるようになれば一人前だよ。

357 名前:デフォルトの名無しさん :02/08/28 08:36
>>353
TCHAR tText;

358 名前:デフォルトの名無しさん :02/08/28 09:23
>>353
bool型のテキストってなんかいやん。

359 名前:デフォルトの名無しさん :02/08/28 09:34
bool型、int型でTextとだけ付ける事自体間違ってる。


360 名前:デフォルトの名無しさん :02/08/28 10:34
つかTextってどういう意味が?

361 名前:デフォルトの名無しさん :02/08/28 10:43
文字ならばtextよりもcを使うかな。TCHAR,char,wchar_tに依らず。

362 名前:353 :02/08/28 10:51
すみません、
bTest
のつもりでした。
間違えてテキスト、とタイプしていたようです。
申し訳ない。
tTest
ということでよろしいでしょうか?

363 名前:デフォルトの名無しさん :02/08/28 13:50
>>353
型情報を変数名に付加しなければいけないほど
プログラムが汚いってことですか?

364 名前:デフォルトの名無しさん :02/08/28 14:15
Cのcallback,C#のdelegateのような処理は
C++ではどのように実装するのが一般的でしょうか?

class EventHandler
{
public:
 void Execute(); virtual;
}

のようなクラスインスタンスを仲介役に
使うことくらいしか思いつきません・・・

365 名前:デフォルトの名無しさん :02/08/28 14:24
moc

366 名前:デフォルトの名無しさん :02/08/28 14:40
>>364
外に出す。

367 名前:デフォルトの名無しさん :02/08/28 14:43
templateで、、、

368 名前:デフォルトの名無しさん :02/08/28 14:49
アホな質問ですいません。

class Class{
Class(int i) : n(i){}
private:
  int n;
};

main(){
  Class a(0);
  Class b(1);
  b = a;  //b.n = 0;
}
privateなメンバ変数に対して、これが出来てしまうのが腑に落ちなくて…。
デフォルトoperator=は、自動的にfriendになってしまうのでしょうか?

369 名前:デフォルトの名無しさん :02/08/28 14:56
いやoperator=は常に非staticなメンバ関数のはず

370 名前:デフォルトの名無しさん :02/08/28 15:11
>>368friendにはなってないと思われ。

371 名前:デフォルトの名無しさん :02/08/28 15:16
>>368
代入を禁止したいのなら、operator=()でもprivateにしたら?

372 名前:デフォルトの名無しさん :02/08/28 15:23
>>369-370
レスありがとうございます。非staticメンバ関数で非friendなんですね。

むはーん、しかしでは何でこんな嫌なことができてしまうのでしょう(;´Д`)
自分でoperator=を定義したときは、friendにするかget系関数を用意しない限り、
privateメンバ変数を参照するのは無理ですよね…。

デフォルトoperator=は特別という解釈で宜しいのでしょうか?

373 名前:デフォルトの名無しさん :02/08/28 15:25
>>371
と、書いているうちにすいません。
ありがとうございます。禁止するときはそうします。

374 名前:デフォルトの名無しさん :02/08/28 15:27
>自分でoperator=を定義したときは、friendにするかget系関数を用意しない限り、
>privateメンバ変数を参照するのは無理ですよね…。

そんなことない。

375 名前:デフォルトの名無しさん :02/08/28 15:28
>>372
んなこたーない。

376 名前:デフォルトの名無しさん :02/08/28 15:28
>privateメンバ変数を参照するのは無理ですよね…。

んなこたぁない

377 名前:375 :02/08/28 15:30
かぶった。そしてみな言い方がおなじw

378 名前:デフォルトの名無しさん :02/08/28 15:30
思い込みが禿げしいと人生損するよ。>>厨さん

379 名前:372 :02/08/28 16:02
>>374-377
ぐぁ、本当だ。皆さんすいません。operator==になってたのと、
インテリセンスで引数相手のメンバ変数が出てなかったのに惑わされました…。

うーん、もう何がなにやら…情報のカプセル化って、
オブジェクトごとではなくて、クラスごとなんでしょうか…。勉強し直してきます。

380 名前:デフォルトの名無しさん :02/08/28 16:12
>>379撤退するときはうんこもらさないように気をつけよう。

381 名前:デフォルトの名無しさん :02/08/28 16:23
380=379のリンクから漏れた378うんこか?w

382 名前:380=378 :02/08/28 16:33
>>381俺は言いたいことはわかるけど
わかり難いので日本語修正しといてやる。
>>380>>379のリンクから漏れた>>378はうんこか?w」

383 名前:デフォルトの名無しさん :02/08/28 18:01
どうすればオマエらみたいに、プログラミングのプロになれますか?

384 名前:デフォルトの名無しさん :02/08/28 18:01
>>383
就職する

385 名前:デフォルトの名無しさん :02/08/28 18:06
>>384
転職というか、まだ学生なのですが
就職先で教えこまれるのですか?

386 名前:デフォルトの名無しさん :02/08/28 18:07
[警告・危険]

2チャンネルでの書きこみは直ちにやめて下さい。
私はここに書き込んだために、アドレス帖の中身を覗き見られました。
これは嫌がらせではありません。

[警告・危険]

387 名前:デフォルトの名無しさん :02/08/28 18:13
みられるほどアドレスありません。

ともだりすくないのれ。

388 名前:デフォルトの名無しさん :02/08/28 18:15
>>384
ごめん、就職って書いてあったな。
眼科いってきます。

389 名前:デフォルトの名無しさん :02/08/28 18:32
そもそもメーラなんて入ってないし….

390 名前:デフォルトの名無しさん :02/08/28 19:44
こりゃだめメーラ。ヽ(´ー`)ノ

391 名前:デフォルトの名無しさん :02/08/28 19:47
>>390
....................................................................................................(゚Д゚)ハァ?

392 名前:デフォルトの名無しさん :02/08/28 20:42
>>364
boost::function とか Loki::Function とか。

393 名前:デフォルトの名無しさん :02/08/29 00:16
はじめまして、C++初心者なのですが質問があります。
クラスの宣言で、例えば
class A{
public:
void a1();
void a2();
}

というクラスを継承して
class B : public A{
};
というクラスBを作ったとします。
このクラスBのオブジェクトからは関数a1にはアクセスできるけど
関数a2にはアクセスできないようにしたいのですが、
どのようにすればよいでしょうか?

なんだかprivateやらprotectedやらすこし混乱しています。
どうか教えてください。

394 名前:デフォルトの名無しさん :02/08/29 00:23
そのくらい簡単に試せるでしょう?

395 名前:デフォルトの名無しさん :02/08/29 00:39
>>393
基底で公開しているものをパブリック継承先で
非公開にするのは無理だし(出来たとしても)すべきではない。
実装継承するならprivate継承も一つの手だが

396 名前:デフォルトの名無しさん :02/08/29 01:08
>基底で公開しているものをパブリック継承先で
>非公開にするのは無理だし(出来たとしても)すべきではない。
>実装継承するならprivate継承も一つの手だが

基底では使えるけど継承先で使えない関数を作るのは
無理って言うことなんでしょうか。
いまいち継承の種類も良くわからないのですが・・

397 名前:デフォルトの名無しさん :02/08/29 01:09
private関数

398 名前:デフォルトの名無しさん :02/08/29 01:14
インターフェースの設計をしなおしたほうがいいんでは。

399 名前:デフォルトの名無しさん :02/08/29 01:15
>>396
a1,a2が公開メンバであるのに
継承先で非公開にしたいのはなぜ

400 名前:デフォルトの名無しさん :02/08/29 01:19
class Bで
private: using a2;ってやってできない?

401 名前:デフォルトの名無しさん :02/08/29 01:26
>>400
393の文は基底で非公開にしたいように見えるが

402 名前:デフォルトの名無しさん :02/08/29 01:29
>>399
なぜかというと、a1の関数の中でやっている処理はそのままクラスBでも
行ないたいのですが、a2の関数の処理は行ないたくないからです。

まあ呼ばなければいいんですが、間違って呼んでしまうことも
有るかもしれないので、Bの変数からは呼ぶことができないように
できればいいなと思ったんです。

403 名前:デフォルトの名無しさん :02/08/29 01:32
なんか混乱してきたんですが、やりたいことは
「クラスの変数から関数を呼びたいけど継承はしたくない」
っていうことです。
説明が下手ですみません。

404 名前:デフォルトの名無しさん :02/08/29 01:34
クラスの変数っていうのは、メンバ変数じゃなくて

class A{
public:
void a1();
void a2();
}

A a;
のような,宣言されたaのことです。

405 名前:デフォルトの名無しさん :02/08/29 01:43
もしAのプライベートの属性とかをBでは使ってないなら委譲したらいいかも。

class A{
public:
  void a1();
  void a2();
}

class B {
private:
  A a_;
public:
  void a1() {
   a_.a1();
  }
}

あ、Aのprivateにアクセスしたかったらfriendにしたらいいのね。

406 名前:デフォルトの名無しさん :02/08/29 02:00
>>405
ありがとうございます。
なんとか思い通りに動作するようになりました。
皆さんありがとうございました。


407 名前:デフォルトの名無しさん :02/08/29 02:06
>>402
間違い防止なら、これで十分だろ。
class B: public A {private: void a2() {A::a2();}};

408 名前:デフォルトの名無しさん :02/08/29 04:05
とりあえずクラスの自作をして見ようと思う。
自作アプリケーションが雑誌に乗るぐらいプログラムやってきたけど
一度たりともクラスを作った事がない、がはは(涙

409 名前:デフォルトの名無しさん :02/08/29 04:32
>>408フリーのアプリ?

410 名前:デフォルトの名無しさん :02/08/29 04:53
>>364
遅レスですが、gtkmm 等で使われてる libsigc++ なんかどうですか?

http://libsigc.sourceforge.net/

411 名前:デフォルトの名無しさん :02/08/29 04:59
>>408
ガンパレ

412 名前:デフォルトの名無しさん :02/08/29 07:37
assing

413 名前:デフォルトの名無しさん :02/08/29 09:48
                 ∩
                 | |
                 | |
        ∧_∧   | |  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`)//  < 先生!C++の仕様書の日本語版はありますか?
      /       /    \
     / /|    /        ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  __| | .|    |
  \   ̄ ̄ ̄ ̄ ̄ ̄ ̄\
  ||\             \      モシ モッテル ヒトイタラ ヒヒョウモ オナガイシマス
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              ||

414 名前:デフォルトの名無しさん :02/08/29 09:52
C++って、プログラム言語でなく、業界言語ですか?
プログラマや趣味でやってる人はともかく、注坊は使っちゃいけない気がしてきた。
(言語仕様が複雑すぎ)




415 名前:デフォルトの名無しさん :02/08/29 10:15
>>414
リア注でも使おうと思えば使える。DQNは知らんが。

一般にクラスは大規模プログラムに適しているが、小規模プログラムには適していない。
(稀に小規模でもクラス使ったほうが良い場合もある)
だからクラスを使うかどうかは考えた方が良い。

ただクラスを使わなくてもC++を使う価値は充分にある。
オーバーロード、新しいキャスト、名前空間…
少なくともCを使うよりは同じプログラムをC++で書いたほうが良いとも思う。(型チェックが厳しいから)

>(言語仕様が複雑すぎ)
頭に叩き込め。それしかない。
個人でする分にはリファレンス片手でも何とかならんでも無いが。


416 名前:デフォルトの名無しさん :02/08/29 10:26
>>414
中学生ならふつー。

417 名前:デフォルトの名無しさん :02/08/29 10:39
>>415
> 一般にクラスは大規模プログラムに適しているが、小規模プログラムには適していない。
おいおい…

418 名前:デフォルトの名無しさん :02/08/29 13:12
規模に関係なく、クラス使ってないと管理不能になってしまう漏れは吊ったほうがよいでつか?

419 名前:デフォルトの名無しさん :02/08/29 13:38
そうだね。昔は全て把握できてスパゲッティを量産できたんだが…
最近ちょっと脳が衰えてきた。
OOの弊害だ

420 名前:デフォルトの名無しさん :02/08/29 13:41
使ってないと2ヶ月前のコードが追えなくなるのでクラス必至です。

421 名前:デフォルトの名無しさん :02/08/29 20:07
教えてくだされ〜

VC++6でスタティックリンクライブラリを作っています。
グローバル変数のコンストラクタを使ってライブラリの初期化を
自動的に走らようとしているのですが、上手くいきません。

どうも、グローバル変数の初期化単位が、ファイル毎のようで
ファイルにアクセス行かないとコンストラクタが実行されないのです。
コレなんとかならないでしょうか?

========== ライブラリコード ===========
--- a.cpp ---
struct A{ A(){ std::cout<<"A"<<endl; } } g_ob;
void test_a(){}

--- b.cpp ---
struct B{ B(){ std::cout<<"B"<<endl; } } g_ob;
void test_b(){}

========== クライアントコード ===========
void test_a();
void test(){ test_a(); }
main(){}

これで "A" は表示されるのですが "B" が表示されません。
なにか良い方法はありませんか?



422 名前:デフォルトの名無しさん :02/08/29 20:31
>>421
クラス定義はヘッダーファイルに書いてインクルードしないとまずいんで
ないかい?

423 名前:デフォルトの名無しさん :02/08/29 21:06
>>421
つーかグローバル変数の初期化タイミングは未定義なので
あてにすんのが間違い。


424 名前:デフォルトの名無しさん :02/08/29 21:11
変数の初期化とか関係なくて、
クライアントコードからb.cppへの参照が無いから、
最適化で落とされちゃってるんじゃないの

425 名前:デフォルトの名無しさん :02/08/29 21:15
b.objはリンクされてないだろうね。
ビルドの設定で.mapファイルを吐かせてみるとよいよ

426 名前:デフォルトの名無しさん :02/08/29 21:34
すみません。本当に初歩的な所でつまづいています。

iosクラスのメンバを含むクラスをグローバル領域で定義すると、実行時エラー
になるのはなぜでしょうか。コンパイラはBCC5.5.1です。

#include <iostream>

class C {
C() { std::cout << "C()" << std::endl; }
} cc;

int main()
{
}

これを実行すると、一般保護違反が出て止まります。

427 名前:デフォルトの名無しさん :02/08/29 22:19
>>426
グローバル変数の初期化の順番は未定義だから。
その例なら、cc のコンストラクタより先に std::cout の
コンストラクタが呼ばれてる保証がない。

428 名前:デフォルトの名無しさん :02/08/29 23:17
ファイルを単に1byteづつ読み出したいのですが、
char ch;
ifstream in(argv[1], ios::in | ios::binary);
in.get(ch);
とすると、読み出したいファイル中に2byte文字が存在するとget()は2byte文字を一気に読み込んでしまうのです。
in.read((char*) &ch, 1);
としても1文字づつしか読み込んでくれませんでした。
なにか良い方法あありますか?

429 名前:デフォルトの名無しさん :02/08/29 23:37
ifstreamってそんなにインテリジェントだっけ?

430 名前:デフォルトの名無しさん :02/08/29 23:55
バイナリオープン。

431 名前:428 :02/08/30 00:04
>>429
ifsreamをいまいち理解できてないのですが、とりあえず2byte文字でも1文字として
読み取るようなので・・

>>430
ifstream in(argv[1], ios::in | ios::binary);
で自分的にはバイナリオープンしたつもりだったんですがほかの方法があるのでしょうか?

432 名前:デフォルトの名無しさん :02/08/30 00:07
2バイト文字の1バイト目だけ読み込まれて、2バイト目が読み飛ばされて
しまうということ?

433 名前:デフォルトの名無しさん :02/08/30 00:10
>>427
ありがとうございます。目から鱗が落ちるような思いです。
これを友達に見せて、悩ませてみようかと思います。

434 名前:デフォルトの名無しさん :02/08/30 00:20
>>428>>431
Cygwin +gcc 2.95.3 および bcc32 で試したが、
ちゃんと1バイトずつで読み込んでいる。

435 名前:428 :02/08/30 00:26
>>432
申し訳ありません。勘違いだったようです。
ちゃん2byte文字部分も2byte目も読み込まれていました。

ただ、単純に
in.get(ch);
cout << (int)ch;
とやると、「A」ならば41と表示されるのに、「あ」ならffffff82(1byteめ)/ffffff82(2バイト目)
となっていました。

お騒がせしました。

436 名前:421 :02/08/30 01:01
>>422
直接、呼び出しているわけではないので多分平気です。
念のため、宣言だけ抜き出してクライアントに
インクルードさせてみましたが、結果は変わりませんでした。

>>423
未定義なのは翻訳単位での初期化順だと思っていたのですが。
mainが呼ばれる前にcpp_init?で初期化されるんですよね。
CPP_UNITでテストの登録とかもグローバル変数のコンストラクタで
やってたと思ったけど、違ったっけ?

>>424
>>425

一度.libに落ちているのですが、それでも削除されてしまうようですね。

未参照グローバル変数の削除は規約上、正当な最適化なのでしょうか。
コンストラクタで何をやっているか分からない以上、リンカで削るのは
無理な気がするのですが。

ライブラリ側のオプションで最適化の抑止は無理っぽいし、
皆さんなら.libファイルの初期化はどのようにやらせますか。
COMみたく明示的に呼び出させるのが楽は楽なんだけど。


437 名前:デフォルトの名無しさん :02/08/30 01:10
>>436
.objをリンクするときに勝手に削除しちゃまずいだろうが、
.libの場合、必要な物を引っ張り出してきてくっつける(リンクする)わけだから、
判断できないんじゃないの?

賢いリンカなら出来るかも知れないけど、オバカなリンカだと
.libすべてをリンクする羽目になるよね。

438 名前:デフォルトの名無しさん :02/08/30 01:15
グローバル変数コンストラクタネタが続くのは集合的無意識の仕業。

>>436
> 未参照グローバル変数の削除は規約上、正当な最適化なのでしょうか。

リンカは参照されないシンボルを削除するんじゃなくて、
参照しているシンボルを再帰的に辿ってオブジェクトを集めるのが仕事
だと思うが、どうか。

>>436
>.objをリンクするときに勝手に削除しちゃまずいだろうが、

.objと.libってリンカの入力として区別されたっけ?

439 名前:デフォルトの名無しさん :02/08/30 01:20
.objと.libってリンカの入力として区別されたっけ?

普通は区別される。
objをリンク指定したばあい、シンボルが参照されていなくてもリンクされるはず。

440 名前:デフォルトの名無しさん :02/08/30 01:42
>皆さんなら.libファイルの初期化はどのようにやらせますか

とりあえずやるほうほう。うまいかどうかはさておき。

(1)Cっぽいが安全
XXX_init() と XXX_end() を用意して、利用者に呼ばせる。
コンストラクタの呼ばれる順番に依存しないため、
それに起因するバグに悩む必要がなくなる。精神衛生上よろしい。

(2)C++にこだわる
初期化ルーチンをLIB_Initクラスのinit()メソッドに突っ込む。
LIB_Initクラスのインスタンス(init_obj)をグローバル変数として持たせる。
そのライブラリの関数全てが、最初にinit_obj.init()を呼ぶようにする。
(ライブラリを使う限り、このインスタンスはリンクされる)
LIB_Initクラスのデストラクタは、ライブラリの終了処理をする。

(2')init()を遅らせる必要がないなら、LIB_Initのコンストラクタで
初期化し、Lib_Init::check()で初期化の成否を返すようにし、
check()をライブラリの各関数が最初に呼ぶようにすればよい。

2,2'ともに、そのライブラリが全く呼ばれなければ
init_objが生成されない。よって気前よくリンクできる。

ただし、同じやり方をする複数のライブラリが相互に参照する場合は
大変面倒なことになったりするので(1)に回帰することもしばしば。

441 名前:デフォルトの名無しさん :02/08/30 01:59
>>435
それは C 言語の時代から有名な、符号拡張の罠です。0xff でマスクするか
unsigned char 使って下さい。

442 名前:デフォルトの名無しさん :02/08/31 00:23
>>435
なるほど。ありがとうございます。

素直に0xffでマスクしてみます。

443 名前:デフォルトの名無しさん :02/08/31 01:40
文字コードをcharのまま比較するとマズーとかいう罠もあったな。
if(ch>=0xa0)とかいうような

444 名前:436 :02/08/31 15:42

>>437-439
私のリンカに対する理解が、間違っていたようです。
今まで、グローバル変数が削除されるなんて、思っても見なかったので
今回の件は、かなりショッキングでした。

私も、まだまだ勉強不足のようです。
参考になるレス、ありがとうございました。

>>440
> (1)Cっぽいが安全
やっぱりコレですか。
でも、初期化しなくても死ぬわけではない罠にかかりそうですね。

> (2)C++にこだわる
こっちも考えたんですが、どうせ自分のやることだから
仕様拡張したときに、呼ぶの忘れるだろうと考え直しました。

アドバイスどうもありがとうございました。
うーん、lib_mainが欲しい。

445 名前:デフォルトの名無しさん :02/08/31 22:06
質問。
名前空間についてなんですが
あるファイルの中で定義されている名前空間を
2つ以上の別のファイルの中で使いたいのですが、どうすればよいのでしょうか。

ヘッダファイルの中に名前空間のメンバを記述して、
使いたいファイルの中でincludeすると、
すべてのメンバに「再定義されています」というエラーが出てしまいます。
レベルの低い質問だと思うのですが、良かったら教えてください。

446 名前:デフォルトの名無しさん :02/08/31 22:23
.h のほうで extern で宣言して .cpp で定義するようにしてはどうか。

447 名前:デフォルトの名無しさん :02/08/31 22:30
>>446
ありがとうございます。
解決しました。
本当にありがとうございました。

448 名前:デフォルトの名無しさん :02/08/31 23:06
>>436
最終手段としてCOMにするというのがあるが一般人にはおすすめできない

449 名前:デフォルトの名無しさん :02/09/01 09:19
質問があるのです。

VBのSendkeysに相当する命令はC++には無いと思うのですが、
同じようなこと(ウィンドウにキーを送信)をさせるには
どうすれば良いのでしょうか?

現在C++をSDKから勉強中で、
できれば、MFCを使わずにできる方法があれば教えていただきたいのです。

よろしくお願いします。

450 名前:デフォルトの名無しさん :02/09/01 09:27
>>449
SendMessageでWM_KEYDOWNとWM_KEYUPを送信しちゃどうだい
あと、これはC++というより、VC++とかWIN32APIとかのスレの方がいいな

451 名前:デフォルトの名無しさん :02/09/01 10:03
SendMessageで漢字って送れるのかな?

452 名前:sage :02/09/01 13:15
>>451
勘違いしてるぞ

453 名前:デフォルトの名無しさん :02/09/01 13:28
>>452
いや、別に勘違いしているつもりはないがSendKeysは漢字を送れるんだよ。
SendKeysと全く同じ物を作るにはどうすればいいのかなと。

454 名前:デフォルトの名無しさん :02/09/01 13:30
keybd_event()

455 名前:デフォルトの名無しさん :02/09/01 13:38
>>454
keybd_eventなら漢字を送れるということ?

456 名前:450 :02/09/01 19:22
>>451
WCHAR test[]=L"逝って良し";
for (int i = 0;i < 5;i++)
SendMessage (hWnd,WM_CHAR,test[i],1);
↑で送れると思うよ。

457 名前:449 :02/09/01 20:42
みなさんありがとうございます。
ところでSendMessageでBackSpaceを送るにはどうすれば良いですか?
または、Alt+Cとか?

458 名前:デフォルトの名無しさん :02/09/01 20:44
VK_BACK_SPACE

459 名前:デフォルトの名無しさん :02/09/01 22:35
>>457
スレ違いだから、↓とかで聞いて
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50

460 名前:デフォルトの名無しさん :02/09/01 23:35
保守

461 名前:デフォルトの名無しさん :02/09/02 17:37
今までクラスを避けて通ってたけど意外と簡単だった・・
オブジェクト指向:塊

462 名前:デフォルトの名無しさん :02/09/02 18:52
オブジェクト指向:魂

463 名前:デフォルトの名無しさん :02/09/02 19:12
オブジェクト指向:塊

464 名前:デフォルトの名無しさん :02/09/02 19:13
オブジェクト指向:醜

465 名前:デフォルトの名無しさん :02/09/02 21:40
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=19
こいつを
BigNum a;
a = 10;
cout << a.ToInteger() << endl;
というような感じでやったんですが、ToInteger()を2回以上呼び出すとおかしな値になります。
ずいぶん悩んだんですが、原因がわかりません。
ちなみにVC++6.0です。

466 名前:デフォルトの名無しさん :02/09/02 21:42
オブジェクト指向:堺

467 名前:デフォルトの名無しさん :02/09/02 21:52
オブジェクト指向:蜀

468 名前:デフォルトの名無しさん :02/09/02 22:02
>>465
operator=などが一時オブジェクトを生成

デフォルトコピーコンストラクタが呼ばれる

一時オブジェクト消滅

一時オブジェクトのデストラクタが呼ばれる。

Num配列あぼーん

もとのオブジェクトがNum配列参照

プログラムあぼーん

469 名前:465 :02/09/02 22:03
>468
なんとなく感じ分かりました。ありがとう御座います。

470 名前:デフォルトの名無しさん :02/09/02 22:06
>>468
最低な言語だな。

471 名前:デフォルトの名無しさん :02/09/02 22:21
>>468
そだね。return *this の時にコピーコンストラクタが呼ばれるのが原因だね。
なんちゅうややこしい言語なんだ。

472 名前:デフォルトの名無しさん :02/09/02 22:27
auto_ptrとかshared_ptrにすれば解決じゃん

473 名前:デフォルトの名無しさん :02/09/02 22:30
なんでこんな単純な物をテンプレートまで持ち出して複雑にしなくちゃならないんだよ。

474 名前:デフォルトの名無しさん :02/09/02 22:33
自前でコピーコンストラクタを書いてやれば解決すます。それだけ。

Effective C++の11項「メモリを動的に割り当てるクラスでは、コピーコンストラクタ
と代入演算子を宣言しよう」当たりを参照。

475 名前:デフォルトの名無しさん :02/09/02 22:34
Bignumをそれなりに実装しようとしたら
結構複雑になりますが何か。

476 名前:デフォルトの名無しさん :02/09/02 22:41
> テンプレートまで持ち出して
テンプレート使うのがそんな大そうな事か。つかコーディング楽になるもんだろ。

477 名前:デフォルトの名無しさん :02/09/02 22:44
わざわざ頑張らんでもとりあえずはvector<int>で十分だろ。

>>472
shareしたりauto_ptrで破壊したりしちゃったらダメだと思ふ…

478 名前:デフォルトの名無しさん :02/09/02 22:45

 (´Д`;)ヾ 473はこれからtemplateやSTL覚える人なんでかんべんしてください。
   ∨)
   ((


479 名前:デフォルトの名無しさん :02/09/02 22:46
>>476
>>465の問題は他の言語では何もしなくてもコーディングが楽ですがなにか?

480 名前:デフォルトの名無しさん :02/09/02 22:49
C++は普通レベルに使えるまで長くかかる言語だなぁ。templateやSTL必須か。
まさかtemplateやSTLは上級レベルとか言わないよね。

481 名前:デフォルトの名無しさん :02/09/02 22:51
>>479
>>465の問題なんかどうでもよくて
テンプレートのことについて話してるんですが何か?

482 名前:デフォルトの名無しさん :02/09/02 22:54
>>477
465の問題についてはって事。

483 名前:デフォルトの名無しさん :02/09/02 22:56
>>481
俺は>>465の問題について話してる。これについては否定はしないようだね。
テンプレート自体は「テンプレートは何のためにあるか?」の答え通りに
使えば便利なのは良く分かっている。

484 名前:デフォルトの名無しさん :02/09/02 23:08

 (´Д`;)ヾ すいません
   ∨)  他の言語は>>465みたいなオブジェクトのコピーはどう行われるのか
   ((    このC++厨に教えてください

485 名前:デフォルトの名無しさん :02/09/02 23:21
>>477
俺も vector 使うに一票だが auto_ptr 使うのは、コピーコンストラクタをきちんと
書くという条件の下では、問題ないと思うぞ。shared_ptr も参照カウントをチェック
して copy-on-write できるし。

>>479
楽な分だけ、代償は支払ってるけどな。

486 名前:デフォルトの名無しさん :02/09/02 23:24
>>484
他の言語が何をさすかわからんがJavaやC#等はポインタ(参照)はshared_ptrとか適当なことを言ってみるテスト。

487 名前:質問君 :02/09/02 23:44
operator=とかの宣言方法なのですが、
const CTimeEx& operator=(time_t t);
のようになっている場合があるかと思うのですが、
この最初のconstってどういうことなのでしょうか?
戻り値のCTimeExの参照についてconst指定するって
いうのは、thisがconst?などと考えてしまうのですが
いかがでしょう?
無知ですみませんが、気になって仕方ないので...

488 名前:デフォルトの名無しさん :02/09/02 23:47
戻り値が変更不可能ということ

489 名前:デフォルトの名無しさん :02/09/02 23:49
thisが指してるオブジェクト(*this)が const

490 名前:デフォルトの名無しさん :02/09/02 23:51
C++4年目でSTL勉強し始めた俺は逝って良しですか?

491 名前:デフォルトの名無しさん :02/09/02 23:59
>>490
VC使ってれば使わない罠

492 名前:C++初心者 :02/09/03 00:00
C++で一度実行をしてexeファイルを作ってから、
プログラムを書き換えてもう一度実行しようとすると

書き込みモードで Debug/Sample1.exe を開けません

ってエラーが出るんですが原因として考えられるのはどんなことがあるんでしょうか?


493 名前:質問君 :02/09/03 00:02
resありがとうございます。
戻り値または、*thisが変更不可能ということは、
定義内で、*thisに代入とかはできないことになるのですか?
それとも、戻り値が返された後、代入されたくないときに
指定するということですか?

494 名前:デフォルトの名無しさん :02/09/03 00:02
実行中

495 名前:デフォルトの名無しさん :02/09/03 00:21
>>493
constになるのはreturnを受けた側の話

496 名前:デフォルトの名無しさん :02/09/03 00:22
>>493
>定義内で、*thisに代入とかはできないことになるのですか?
ではなく、単純に返却値を定数扱いするということ。

497 名前:質問君 :02/09/03 00:25
ふむふむ、なるほど、そういうことでしたか!
でも、returnを受けてそれに代入不可能
とかしたいということがあるんでしょうか?
具体的にはa=b=cとかしたくないってことですか?
というか、const指定するのが一般的なんでしょうか?

498 名前:デフォルトの名無しさん :02/09/03 00:30
数値をクラスとして考えると
1 + 2 = 1 だめ
a + b = c いい(const無し)
a + b = c だめ(constあり)


499 名前:デフォルトの名無しさん :02/09/03 00:30
=演算子の返却値を const にするのは代入の途中で値が変わらない
ことを保証するため。a=b=c で c と a の値が違ってたら困る。

500 名前:デフォルトの名無しさん :02/09/03 00:31
500


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