■過去ログ置き場に戻る■
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
>>368
friendにはなってないと思われ。
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.