■過去ログ置き場に戻る■
1-
前250
次250
最新50
[memo]
"9999999999_00.html#R20"
という感じで、URLの最後に "#R
レスNo
" を追加すると幸せになれます。
C++相談室 part17
251
名前:
デフォルトの名無しさん
:03/03/21 00:09
コンストラクタ内で初期化しろ。
二回目以降はスキップ。
ダサいのがいやならカエレ!
252
名前:
デフォルトの名無しさん
:03/03/21 00:12
>>250
pthread_mutex_t を、initするクラスでラップしといてから
template<class T>
inline CMutex& common_mutex_of() {
static CMutex mutex;
return mutex;
}
253
名前:
250
:03/03/21 00:18
>>251
コンストラクタ内で初期化する方法だと、mutexを初期化するのは、メインスレッド
でやらないと駄目。でもメインスレッドから hoge::init() みたいなのを呼ぶのはダサい(呼び忘れるから)。
で、コンパイル時か、実行時でもmain関数より前に初期化を行いたい。
254
名前:
250
:03/03/21 00:21
>>252
おお。目から鱗かもです。
255
名前:
デフォルトの名無しさん
:03/03/21 00:25
チョッと待て、
>>252
も呼び出す時がいつかで競合の問題がある
ほら
pthread_mutex_t mutex;
bool pinit(){ pthread_mutex_init(&mutex, NULL); return true; }
bool pinitialized=pinit();
これでどうよ?
256
名前:
デフォルトの名無しさん
:03/03/21 00:28
namespaceっていつから流行ってんの?
それ一般的に使われてんの?
学究的な興味なんざ小指の爪の先ほどもない。
職業プログラマとして必要な技術?
257
名前:
デフォルトの名無しさん
:03/03/21 00:29
無理しないでnamespaceと対になったinitializerクラスで我慢しとけよ。
258
名前:
250
:03/03/21 00:36
>>255
あ、それでいいのか。
でもやっぱグローバル変数使わざるを得ない?
staticなメンバ変数と関数だけで済ませられないでしょうか。
(駄目なら、グローバル変数での初期化が定石ってことでいいのでしょうか)
>>256
標準ライブラリで使われている気が、、、
259
名前:
デフォルトの名無しさん
:03/03/21 00:39
>>258
staticなメンバ変数はほとんどグローバル変数と同じようなもんだぞ?
260
名前:
デフォルトの名無しさん
:03/03/21 00:42
マジで標準ライブラリに?
うーむ、ぐぐっても解説等出てこないから比較的新しい技術なのかと思っていたが、
C++の標準的な「何か」なのかな・・・
CからC++へ、なんとなく体で移行してきたんでわからんことが大杉。
本腰入れて勉強しないと限界みたい・・・
261
名前:
デフォルトの名無しさん
:03/03/21 00:44
とあるライブラリの関数foo()と別のライブラリの同名関数foo()を同一ソースでコールしたい。
さてどうする?
262
名前:
250
:03/03/21 00:46
>>259
確かにそうですね。結局、namespaceで保護するのが関の山ですかね。
263
名前:
デフォルトの名無しさん
:03/03/21 00:50
>>262
無名ネームスペースに閉じ込めたら?
264
名前:
デフォルトの名無しさん
:03/03/21 00:55
>>239
正しくない。
意味のある使い方がまだある。
265
名前:
250
:03/03/21 00:58
>>263
なるほど。っていうか、無名namespaceってのは初めて知りました。
mutex を、それを利用するクラスのメンバにして、
初期化は無名namespaceのグローバル変数を使ってやると。
それが一番かもしれないですね。
266
名前:
名無しさん
:03/03/21 01:54
ぬるい話題が多いな。
るいじの質問もあるし…
ぽんと,いい考えがうかばないのか?
267
名前:
デフォルトの名無しさん
:03/03/21 01:58
ぬるくない問題はC++では解決できないからねぇ。
そういう人はとっくにC#に以降済みだし。
268
名前:
デフォルトの名無しさん
:03/03/21 02:03
ミノガスカヨッ
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>266
269
名前:
デフォルトの名無しさん
:03/03/21 09:22
C#だとよ(w
270
名前:
デフォルトの名無しさん
:03/03/21 10:35
>>228
,
>>230
ユーザー定義型を使って標準ライブラリのテンプレートを特殊化することは認められている。
17.4.3.1 -1- (
ttp://www.kuzbass.ru/docs/isocpp/lib-intro.html#lib.reserved.names
)
オーバーロードの追加が認められているという記述は見当たらなかった。
271
名前:
228
:03/03/21 12:32
>>270
おお!特殊化なら合法だったんだ。
これで幸せになれそうです。ありがとうございます。
272
名前:
デフォルトの名無しさん
:03/03/21 15:09
>>270
テンプレートライブラリを作成するときにstd::swap(a,b)を使うことを考えると、
自前のswap処理を作ったならstd::swapの特殊化をしておくべきだと思うんだが、
boost::scoped_ptrなんかは、boost::swapが定義されてるな。
これだと、
scoped_ptr<T> a,b;
std::swap(a,b);
と書いても、a.swap(b)にはならないな。
273
名前:
272
:03/03/21 23:07
http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1296.htm
↑によると、
namespace std
{
template<typename T>
class X {};
template<typename T>
void swap(X<T>& rhs, X<T> lhs);
}
これは特殊化ではなく、オーバーロードの宣言になるので、規格違反になるそうだ。
結果として、
自前のクラスについてstd::swap等の特殊化はできるが、
自前のクラステンプレートについては(規格に従う限り)不可能らしい。
274
名前:
デフォルトの名無しさん
:03/03/21 23:25
クラステンプレートが static なデータメンバを持っているとき、複数のコンパイル単位で、
その static なデータメンバの定義を行っても、リンク時に一つにまとめられてしまうよう
なのですが、これは規格に則った動作でしょうか。
-- X.h --
template<class T> class X {
static T x;
};
template<class T> T X<T>::x;
-- Foo.cpp --
#include "X.h"
void foo()
{
X<int> a;
}
-- Hoge.cpp --
#include "X.h"
void hoge()
{
X<int> b;
}
ここで Foo.cpp と Hoge.cpp をコンパイルしてリンクしても、とくに X<int>::x の
多重定義にはならず、正常にリンクされます。(g++ と VC++ で確認)
しかし、C++第3版の 13章7節によると「非inline の static メンバは、どこかの翻訳単位に
ユニークな定義を持たなければならない。」とあり、上のような動作は保証されていない
ようなのです。
275
名前:
デフォルトの名無しさん
:03/03/22 00:06
>>274
14.5.1.3にX.hの内容と同じ例があげられている。
その挙動を疑うなら、以下のソースも疑うことになると思うのだが・・・。
-- X.h --
template<class T>
void f();
-- Foo.cpp --
#include "X.h"
void foo()
{
f<int>();
}
-- Hoge.cpp --
#include "X.h"
void hoge()
{
f<int>();
}
276
名前:
275
:03/03/22 00:10
あ、ごめん。訂正。
-- X.h --
template<class T>
void f(){}
277
名前:
デフォルトの名無しさん
:03/03/22 00:11
? これ同じ例か?
278
名前:
デフォルトの名無しさん
:03/03/22 03:56
?HogeHoge@@YAHG@Z
を元に戻すテーブルかなにかはありませんか?
279
名前:
デフォルトの名無しさん
:03/03/22 04:01
>>278
WinならUnDecorateSymbolNameというのがある
280
名前:
デフォルトの名無しさん
:03/03/22 04:12
undname -f ?HogeHoge@@YAHG@Z
?HogeHoge@@YAHG@Z == int __cdecl HogeHoge(unsigned short)
281
名前:
278
:03/03/22 04:26
Σ(*゚Д`;)ア…ア…アッハァァァァァァァァ?!!
すばらしいですぞ、このような時間に!!!
はげしくあげしく、感謝します。
282
名前:
デフォルトの名無しさん
:03/03/22 06:37
以下のように、相互にincludeしたいのですが、エラーが出てしまいます(´Д⊂
こういう場合は、2つのクラスを、同じヘッダにまとめるしか無いのでしょうか?
----------------A.h
#ifndef A_H
#define A_H
#include "B.h"
class A(){
A( B* b );
};
#endif
----------------B.h
#ifndef B_H
#define B_H
#include "A.h"
class B(){
B( A* a );
};
#endif
----------------
283
名前:
デフォルトの名無しさん
:03/03/22 06:43
----------------A.h
#ifndef A_H
#define A_H
#include "B.h"
class B;
class A(){
A( B* b );
};
#endif
----------------B.h
#ifndef B_H
#define B_H
#include "A.h"
class A;
class B(){
B( A* a );
};
#endif
----------------
284
名前:
282
:03/03/22 06:49
>>283
見事にリンクできました。これがクラスの前方参照…。
助かりました。ありがとうございました。
285
名前:
デフォルトの名無しさん
:03/03/22 12:02
初歩的質問です。
int x=0;
int *a = &++x; // OK
int *b = &x++; // エラー
bの初期化でエラーになるのはなぜでしょうか?
コンパイラによれば'&'に左辺値がないとのことですが・・・。
自分のイメージとしてはxのアドレスでbを初期化した後、
xをインクリメントするという感じなのですが・・・。
286
名前:
デフォルトの名無しさん
:03/03/22 12:22
&(x++)
287
名前:
デフォルトの名無しさん
:03/03/22 12:28
>>286
エラーですよ
288
名前:
デフォルトの名無しさん
:03/03/22 12:30
優先順かな。
下は&xが評価された後にインクリメントされるから、
一時領域のインクリメントはできないのか、あいまいさではじかれてるのかどっちかでしょう。
エラーコードを見ればどっちかわかる。
289
名前:
285
:03/03/22 12:31
ちなみに私が知りたいのは、どうしたら自分のイメージどうりに
動かせるかではなく、なぜエラーになるのかです。
結合順位からいえば、もともとインクリメント演算子の方が強いのですが・・。
290
名前:
デフォルトの名無しさん
:03/03/22 12:34
禿本の p161 に説明があるけどピンとこないな。
>論理的に可能であれば、左辺値の被演算子を取る演算子の処理結果は、
>その左辺値被演算子を示す左辺値になる。
(略)
>int *p = &++x; // p は x を指す
>int *q = &(x++); // エラー: x++は左辺値(xに格納されている値)ではない
x に副作用が発生するタイミングは前置でも後置でも ; に至るまでの
いつかでしかないと思うのだけど前置のみ左辺値になるのはどうして
だろう。
291
名前:
デフォルトの名無しさん
:03/03/22 12:40
>>289
まあ ++x は、極論すれば、{x = x + 1, x} と同じだからアドレスがとれる。
でも、x++ は、{(x = x + 1)} と言う式になるから、アドレスが取れない。
292
名前:
デフォルトの名無しさん
:03/03/22 12:40
だから、前置は式評価前にインクリメント、後置は式評価後にインクリメントするからだろ?
293
名前:
285
:03/03/22 12:40
本の解説でも、コンパイラのエラーメッセジでも
あくまで&に対する左辺値が無いということが原因みたいですね。
ちなみに
int *r = &(x += 1); // OK
これはOKでした。これが前置と同じことなんですかね・・・。
後置だとカッコの中身が先に評価されないとか(超適当)。
294
名前:
デフォルトの名無しさん
:03/03/22 12:41
式ってのはxね。
295
名前:
デフォルトの名無しさん
:03/03/22 12:45
>>292
前置の場合 x の副作用が式の評価前に行われるのは保証されてるの?
296
名前:
デフォルトの名無しさん
:03/03/22 12:57
int a, b, c;
a = 0;
b = a++;
c = ++a;
bは0、aは1になるのはわかってんだよね?
297
名前:
デフォルトの名無しさん
:03/03/22 12:57
× bは0、aは1
○ bは0、cは1
298
名前:
デフォルトの名無しさん
:03/03/22 12:59
あーちがう!
このままじゃcは2になるやん。
まぁ雰囲気だけ味わってくれ・・鬱だ死のう。
299
名前:
デフォルトの名無しさん
:03/03/22 13:00
cは2じゃないか?
300
名前:
デフォルトの名無しさん
:03/03/22 13:14
int& operator++(int&);
int  operator++(int&,int);
int  x = 0;
int* a = &(operator++(x));
int* b = &(operator++(x,0));
301
名前:
デフォルトの名無しさん
:03/03/22 14:20
T& operator++(void) { m_nakami+=1; return *this; }
T operator++(int) { T temp=m_nakami; m_nakami+=1; return temp; }
後者の返り値は値(一時変数だから参照を返せない)だから
アドレスがとれないってことじゃなくて?
302
名前:
デフォルトの名無しさん
:03/03/22 14:21
基本型でない型の振る舞いと対称性を保つためにエラーにせざるを
得ないということ? template とか。本末転倒な気もするけども。
303
名前:
デフォルトの名無しさん
:03/03/22 14:35
はぁ?
304
名前:
デフォルトの名無しさん
:03/03/22 14:42
Cではどっちもエラーになるな。
305
名前:
デフォルトの名無しさん
:03/03/22 14:45
> int* b = &x++;
↑こんなコード、コンパイルできるようにしてもなんのメリットもないだろ。
306
名前:
302
:03/03/22 14:45
>>303
>>300-301
が言ってるのはそういうことじゃないのか?
307
名前:
デフォルトの名無しさん
:03/03/22 14:56
>>305
だからなんなんだ?
勉強のできないやつってのは、なぜそうなるか?どういう原理なのか?
といったことにはまったく興味をしめさず、できればいい、動けばいい
的な考えなんだよな。だから応用もきかないし、所詮そこ止まりの人間。
そういう奴はベーシックでもやってりゃいい。
308
名前:
300
:03/03/22 15:00
>>306
オーバーロード可能な演算子のシグネチャとして、
C++では演算子'++'を
>>300
のように定義した。
この定義には「基本型でない型の振る舞いと対称性を保つ」目的があったかもしれない。
その結果、Cではコンパイルできなかった式'&++x'はコンパイル可能になった。
ここは「コンパイル可能にせざるを得ない」という話になるだろう。
だが、'&x++'「エラーにせざるを得ない」なんて話には、どうにもつながらない。
ちなみに、300==305。
>>307
何のメリットも無いのに、Cと異なる挙動とする意味でもあるのか?
309
名前:
デフォルトの名無しさん
:03/03/22 15:01
>>306
もし
>>302
の疑問が正しいのであればそもそもC言語でも駄目なのはどうしてだ?
C言語では基本型以外にoperator ++は定義できない
310
名前:
デフォルトの名無しさん
:03/03/22 15:09
>>何のメリットも無いのに、Cと異なる挙動とする意味でもあるのか?
そういうこと言っているわけじゃねぇだろって
もっと一般的な話だろ(プログラムに限らずな)
311
名前:
306
:03/03/22 15:11
>>300
Cと比較すると解釈が逆になることが分かるな。
でもメリットて話だとしたら、&++x にどんなメリットがあったのか
疑問だ。Cと同じように左辺値になり得ないとしたら問題が起こる
のだろうか。
312
名前:
デフォルトの名無しさん
:03/03/22 15:17
>&++x にどんなメリットがあったのか疑問だ。
意味がわかりません!!メリットなんて別にないだろ!!
313
名前:
306
:03/03/22 15:18
>>312
メリットが無いのであれb &++x も C と同じように左辺値に
ならなければよかったんでは。
314
名前:
306
:03/03/22 15:19
>&++x も
++x も
315
名前:
デフォルトの名無しさん
:03/03/22 15:19
VC++って標準C++とは限らないんだな・・・。
for(int i = 0; ... ; ...)
このiのスコープもデフォルトではforブロック外だよな、.netは。
ほかにも、標準C++に沿ったコーディングでエラーにもなるし。
標準C++のコンパイラってあんの?
316
名前:
デフォルトの名無しさん
:03/03/22 15:20
ストラップにメールだしてくれ。
317
名前:
300
:03/03/22 15:22
>>306
> &++x も C と同じように左辺値にならなければよかったんでは
左辺値にならないとしたらオーバーロード可能なシグネチャの定義が、
int operator++(int&)
というようなものになり、
ユーザー定義型で効率のよい実装が難しくなる。
>>310
あれ?外してた?あんた
>>307
か?
何を突っ込まれたのかわからない。ごめん。
318
名前:
デフォルトの名無しさん
:03/03/22 15:28
&++x ←これって左辺値じゃないよね?
++x ←これは左辺値になるけど
x++ ←これは左辺値じゃない
319
名前:
デフォルトの名無しさん
:03/03/22 15:31
まあ、確かに++xを左辺値にする必要はないのかな?
320
名前:
デフォルトの名無しさん
:03/03/22 15:32
(++x)=10;
とかできてもうれしくないしな・・・
321
名前:
デフォルトの名無しさん
:03/03/22 15:35
メリットうんぬんじゃなくて、結合やらなにやらの思想の統一性から
こうしたのかもしれないね・・・。なにを基準に決めたのか知らんけど。
322
名前:
デフォルトの名無しさん
:03/03/22 15:37
でも ++x = ++y とか書きたいときがある。ない?
今議論されてることって一貫性の問題?
323
名前:
322
:03/03/22 15:37
激しくかぶった。ごめ。
324
名前:
デフォルトの名無しさん
:03/03/22 15:38
しかしK&Rにせよストラウストラップにせよ、わざわざ
読者をなやますようなコードをちりばめるね・・・。
参考書というよりは教科書チックだな。
325
名前:
デフォルトの名無しさん
:03/03/22 15:41
C++では (x = y) = z; がエラーにならずに通るからね。Cでは見事に
エラー。
326
名前:
デフォルトの名無しさん
:03/03/22 15:42
>>322
*++x = *++y;
こうじゃないの?
++x = y++
は何が起こるの?
327
名前:
デフォルトの名無しさん
:03/03/22 15:43
++x = ???
ってけっきょく???で上書きされるから
インクリメントを事前にしても意味ないんじゃ・・・。
328
名前:
306
:03/03/22 15:45
効率の問題で ++x が左辺値になることを許してしまうというのも
なんだかな・・・。
329
名前:
デフォルトの名無しさん
:03/03/22 15:48
別に効率の問題ではない。
勘違いしているだけでしょう。
330
名前:
デフォルトの名無しさん
:03/03/22 15:49
int x = 0;
int y = 5;
++x = y++;
cout << x << endl;
cout << y << endl;
result:
5
6
331
名前:
デフォルトの名無しさん
:03/03/22 15:51
はあ
++xは意味がないですね
332
名前:
デフォルトの名無しさん
:03/03/22 15:51
++x = x++;
333
名前:
デフォルトの名無しさん
:03/03/22 15:54
>>332
それは x = x++; と同じで結果が未定義なのでは。
334
名前:
デフォルトの名無しさん
:03/03/22 15:56
int x = 0;
++x = x++;
cout << x << endl;
result:
2
(VC++.net)
335
名前:
デフォルトの名無しさん
:03/03/22 15:57
(++x)++;
336
名前:
デフォルトの名無しさん
:03/03/22 15:59
>>334
の鼻から悪魔が出てきている最中
337
名前:
デフォルトの名無しさん
:03/03/22 15:59
>>334
result:
2
(BCC5.6)
2
(MingGW 3.2.2)
338
名前:
デフォルトの名無しさん
:03/03/22 16:00
++++++++++x;
339
名前:
ハンバーグフートーハルコーギョーコーコー
:03/03/22 16:03
++--+--++----x;
340
名前:
デフォルトの名無しさん
:03/03/22 16:04
もうめちゃくちゃだな
341
名前:
デフォルトの名無しさん
:03/03/22 17:35
質問です。
#include <cstdio>
とすれば、<stdio.h>で定義されている関数がstd名前空間内に入っている形で
利用できると理解していたのですが、
std::puts("俺");
が、「'std'はクラスでも名前空間でもない」と言われます。また、
::puts("誰");
だとコンパイルが通ります。私の勘違いなのでしょうか。
環境はVC6.0です。
342
名前:
デフォルトの名無しさん
:03/03/22 17:39
VCは標準C++準拠じゃありません。
343
名前:
デフォルトの名無しさん
:03/03/22 17:40
>>341
VC6.0を窓から投げ捨てろ
それかSTLportをインストロール
344
名前:
デフォルトの名無しさん
:03/03/22 17:48
>>342-343
そういうことでしたか。
VCを投げ捨てる決心がつくまでの間は、namespace std{ と } で
何とかやっていけそうです。有難うございました。
345
名前:
デフォルトの名無しさん
:03/03/22 18:48
多倍長計算ができるC++用のライブラリの中で、信頼の置けるものはありませんか?
346
名前:
デフォルトの名無しさん
:03/03/22 21:31
例外処理ってどんな時に使用しますか?
347
名前:
デフォルトの名無しさん
:03/03/22 21:37
>>346
例外的なことが起きた時
348
名前:
デフォルトの名無しさん
:03/03/22 21:41
MFCではファイルの読み込みでEOFに達すると例外を投げます。
ハァ
349
名前:
デフォルトの名無しさん
:03/03/22 21:41
>>347
実はその「例外的」の例外の定義について深く知りたかったり…。
350
名前:
デフォルトの名無しさん
:03/03/22 21:41
ageてしまった。スマソ
351
名前:
デフォルトの名無しさん
:03/03/22 21:43
>>346
例外でもなんでもなく、ごく自然にあり得るエラーでも、
すぐ例外投げて責任転嫁する糞な設計のライブラリを
嫌々渋々使わされるとき。
352
名前:
デフォルトの名無しさん
:03/03/22 21:46
>>349
人によって例外の定義は変わる。
ファイルが開けないというのを例外だという人もいれば
それは非常によくあることだから例外ではない、戻り値で知らせるべきだという人もいる
だからごめんなちゃい、わかんないよ
353
名前:
デフォルトの名無しさん
:03/03/22 21:52
>>351
そんなライブラリ使うの止めて、あんたがすばらしいライブラリつくりゃ委員で内科医 ?
354
名前:
デフォルトの名無しさん
:03/03/22 21:57
Javaはコンパイルエラーで例外を吐きます。
ハァ
355
名前:
デフォルトの名無しさん
:03/03/22 22:31
init();
run();
done();
と失敗することを全く考えずに正常系の処理をとりあえず書く。
で、後から判明した失敗する要因をすべて例外として投げる。
356
名前:
デフォルトの名無しさん
:03/03/22 23:46
>>348
iostream系もEOF(やその他エラー)で例外投げるようにできなかったっけ?
357
名前:
デフォルトの名無しさん
:03/03/22 23:54
exceptions() で例外の設定できるね
358
名前:
デフォルトの名無しさん
:03/03/22 23:59
いちいち戻り値をチェックしなくていいから楽チン
359
名前:
デフォルトの名無しさん
:03/03/23 00:01
>>355
ワラタ。
ありがちな泥縄設計だね〜
一部の人にはシャレにならなかったりw
360
名前:
デフォルトの名無しさん
:03/03/23 00:14
>>359
正常系-例外の分離が本質じゃないのか、C++の例外は?
たとえばWindowsのSEHですらcontinueがあるのに、
それすらもない例外なんだから、それ以外の用途は無いだろ
361
名前:
デフォルトの名無しさん
:03/03/23 00:19
bool operator==(T const & a, U const & b) って、クラス T のメンバに
bool T::operator==(U const & b) があればいらないですよね?
362
名前:
デフォルトの名無しさん
:03/03/23 00:41
>>361
ユーザー定義の変換がある場合は、そうとも言い切れない。
363
名前:
デフォルトの名無しさん
:03/03/23 01:10
>>362
どんな変換の場合でしょうか?
T型への変換があった場合でも T::== が呼ばれますよね?
364
名前:
362
:03/03/23 01:30
>>363
↓MEMBERの定義を変えてコンパイルして見れ。
#define MEMBER 1
struct S;
struct T
{
    T();
    T(const S&);// S to T
#if MEMBER
    bool operator==(int) const;
#endif
};
#if !MEMBER
bool operator==(const T&,int);
#endif
bool f(const S& s,int i)
{
    return s == i;
}
365
名前:
デフォルトの名無しさん
:03/03/23 02:26
あるエラーが発生した時、もう復帰が不可能または復帰する必要無しである場合
全て例外投げてます。
って安易な考えじゃだめなのかなぁ。
366
名前:
デフォルトの名無しさん
:03/03/23 02:36
>>364
なるへそ。サンクス。
367
名前:
デフォルトの名無しさん
:03/03/23 02:52
>>365
「復帰が不可能または復帰する必要無し」とかいう用件は、
ライブラリを使う側、使う場所で決まると思うが。
368
名前:
デフォルトの名無しさん
:03/03/23 03:42
>>367
iostream の exceptions みたいにすればいいじゃん。
369
名前:
デフォルトの名無しさん
:03/03/23 04:05
C++よりはJavaかC#なんかの標準ライブラリの例外の投げ方見てると参考になるよ。
で実際は
>355
的な発想でちゃんと設計していくんだけど
例外的な使い方としてgoto的な例外(処理中止例外みたいなの)も織り交ぜるのが通のやり方。
370
名前:
デフォルトの名無しさん
:03/03/23 04:15
>>368
エラーが発生した状態を保持できるようにするのは
そう簡単に決心がつくものじゃない。
全ての処理の前にその状態を問い合わせる必要が出てくる。
371
名前:
デフォルトの名無しさん
:03/03/23 13:29
>>367
もちろん、エラー後の処理を判断しかねる場所では、戻り値でエラーを返します。
特にループ内でも頻繁に使用されるような関数であれば、例外処理のようなコスト
の高い処理を毎回行ってその都度判断を行う事は避けた方が良いと思います。
でも、判断できる場所では、例外無く例外を投げてます。
ってやり方をしてたら、部下に
「例外処理は本当の例外が発生したときのみ使用した方が良いのでは?
想定できるエラーで例外処理を行うのは邪道だと思うんですが」
と意見されてしまいますた…。
372
名前:
デフォルトの名無しさん
:03/03/23 13:42
>想定できるエラーで例外処理を行うのは邪道だと思うんですが
想定できないエラーってなに?という線引きの話だけど
メモリが足りない、ファイルがオープンできない、
他のプロセスが書き込んだあるべきデータが存在しない。
ライブラリにおかしな引数が渡された。
といった自分は悪くないけど発生しうるエラーはすべて例外にするかな。
自分が悪い=バグはそれ専用の例外を投げる。
偶数はスキップして奇数のみを処理する。
という普通にあり得るケースはコスト以前に例外にはしない。
373
名前:
デフォルトの名無しさん
:03/03/23 14:55
>>372
この手のどっちでもいいことって、宗教戦争になるからなぁ。
> ファイルがオープンできない、
これ1つとっても、ユーザーがファイル名を入力していたなら単なるエラー処理とも言えるし。
自分が作成したファイルだったりしたら、例外とも言えるし。
ようは好みの問題だろ。結論なんか出ないよ。
374
名前:
デフォルトの名無しさん
:03/03/23 17:00
> 自分が悪い=バグはそれ専用の例外を投げる。
その場合は悪あがきせずにabort()するべきだと思うが。
ネットワークアプリだったら、バグっているのに実行続けたら、
セキュリティホールになるだろ。
375
名前:
デフォルトの名無しさん
:03/03/23 17:29
「想定できないエラーが生じたら例外」って、誰が考えたんだ?
throwって書いた本人は間違いなくエラーを予測しているだろうが。
俺は、自分自身を復旧させる気が無くて、デストラクタ以外の
今後の動作を保証したくない時か、単にprivate関数の中での
エラーを一番外のpublic関数でまとめて処理したい時に例外にしてる。
376
名前:
371
:03/03/23 18:13
ああ、いわゆる参照オブジェクト系のクラスを設計する時は
同じくそういう手法を用いてます。
逆に、値オブジェクト系のクラスを設計する時は、
なるべくエラー処理を例外処理で行わないよう気をつけてます。
パフォーマンス的な問題で…。
ちなみに、私の部下が言った「想定できないエラー」とは
>>372
さんが中段に書かれているような事でした。
実はその部下に正直に「私は例外処理に詳しくないので、休日使って調べてみる。ごめん」
と言ってしまいましたが、上司として言っちゃダメな事なんだろうなぁ…。
377
名前:
デフォルトの名無しさん
:03/03/23 18:20
>>376
俺は比較的良い上司に思える
378
名前:
デフォルトの名無しさん
:03/03/23 18:31
David Abrahams:"See below"
http://www.boost.org/more/error_handling.html
http://www.boost.org/more/generic_exception_safety.html
ディヴィッド エイブラハム:「↓嫁」
http://boost.cppll.jp/HEAD/more/error_handling.html
http://boost.cppll.jp/HEAD/more/generic_exception_safety.html
379
名前:
デフォルトの名無しさん
:03/03/23 18:43
>>376
理想の上司とは「これは仕様だ」といって突きすすむような人のことだよネ。
380
名前:
デフォルトの名無しさん
:03/03/23 19:56
>>378
ありがとうございます。とても勉強になりました。
(もしかしてここに書いてある内容は常識だったりしますか…?)
>>379
正しい知識を基に(環境要因を含めて)妥当な判断を下せて
(多少強引でも)突き進める人、が私的に理想の上司かなぁ。
ネタにマジレスと知りつつも。
381
名前:
デフォルトの名無しさん
:03/03/23 20:59
理想の上司ってのは言語に詳しい必要ないからなぁ。
382
名前:
デフォルトの名無しさん
:03/03/24 03:44
ここはマ板ですか?
383
名前:
デフォルトの名無しさん
:03/03/25 00:15
すみません。
(void **)&pDirectInput
という表記は一体どういう意味なのでしょうか。void型って型が指定されてないんですよね?
それの2次元配列?にキャスト?ポインタのアドレスを2次元配列にキャスト?意味わからないです。。
384
名前:
デフォルトの名無しさん
:03/03/25 00:19
pDirectInputへのポインタを、void*へのポインタへキャスト。
385
名前:
デフォルトの名無しさん
:03/03/25 00:34
>>383
void ** はvoidへのポインタのポインタ。但し、void *型はオブジェクトの
大きさがわからないので、アドレス演算をしようとしたり、実体化しようと
するとエラーになる。明示的なキャストが必要。それ以外は普通の
ポインタへのポインタと同じ。
386
名前:
デフォルトの名無しさん
:03/03/25 00:45
ポインタに更にポインタがいる場合ってどういう時ですか?
387
名前:
デフォルトの名無しさん
:03/03/25 00:53
>>386
Cスレ逝け
388
名前:
デフォルトの名無しさん
:03/03/25 01:02
>>386
具体的な例って言うと、ポインタ配列をソートしたりする必要がある時
かなあ。
389
名前:
デフォルトの名無しさん
:03/03/25 01:04
あぁ、なるほど。ありがとうございました。二度とこねぇよ!
390
名前:
デフォルトの名無しさん
:03/03/25 01:05
>>386
動的二次元配列の代用
391
名前:
デフォルトの名無しさん
:03/03/25 01:06
>>389
その場合はこのAA貼れ。かっこいいぞ。
┌─┐
|も.|
|う |
│来│
│ね│
│え .|
│よ .|
バカ ゴルァ │ !!.│
└─┤ プンプン
ヽ(`Д´)ノ ヽ(`Д´)ノ (`Д´)ノ ( `Д)
| ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄ . ̄◎ ̄  ̄◎ ̄ ◎−>┘◎
ヽ(`Д´)ノ モウコネエヨ!!
( ) ウワァァン!!
/ ヽ
392
名前:
デフォルトの名無しさん
:03/03/25 01:09
┌─┐
|あ.|
|り |
│が│
│と│
│よ .|
│っ .|
バカ ゴルァ │ !!.│
└─┤ プンプン
ヽ(`Д´)ノ ヽ(`Д´)ノ (`Д´)ノ ( `Д)
| ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄ . ̄◎ ̄  ̄◎ ̄ ◎−>┘◎
ヽ(`Д´)ノ オレイヲイウノガテレクサイゼ!!
( ) ウワァァン!!
/ ヽ
393
名前:
デフォルトの名無しさん
:03/03/25 01:10
argvが手っ取り早い例かと
394
名前:
デフォルトの名無しさん
:03/03/25 01:11
文字列の配列→やっぱり2次元配列の事なのね
395
名前:
デフォルトの名無しさん
:03/03/25 01:17
>>394
C++的にはstd::vector<std::string>だろ。
文字列の配列ごときはコードに直接表現できる。
Cとは違うのだよ、Cとは。
396
名前:
デフォルトの名無しさん
:03/03/25 01:21
>>395
Cを馬鹿にするな
397
名前:
デフォルトの名無しさん
:03/03/25 01:22
悲しいけどここC++スレなのよねぇ
398
名前:
デフォルトの名無しさん
:03/03/25 01:25
Cにmany improvementsをプラスしたものがC++。だからCでできる
事はC++でも大抵できる。敢えてそれをしないのは、それに替わる
もっといい手段が提供されてきたから。
399
名前:
デフォルトの名無しさん
:03/03/25 05:59
質問です。
フルスクリーン動作のゲームをWindowで動作させる監視プログラムを作りたいのですが
ゲームそのものの画面の解像度は変えずに
ディスクトップが1280x1024動作、ゲームが640x480動作を考えてまして
監視しているプログラムだけの画面を切り替えるようにするにはどうすればよいのでしょうか?
ちょっと、わかり難い質問でスミマセン。。。
400
名前:
デフォルトの名無しさん
:03/03/25 06:06
1.DirectXのウインドウモードでフルスクリーンをエミュレートするプログラムを書く
2.該当アプリのDirectX呼び出しを乗っ取る
3.こんな質問をしているようじゃ絶対作れない
4.そもそもスレ違い
401
名前:
デフォルトの名無しさん
:03/03/25 06:39
>>400
やっぱりDirectXの機能を使うしかないですか・・・
仮想的に画面を作るという方法が楽なのかな・・・
402
名前:
デフォルトの名無しさん
:03/03/25 09:22
>>395
std::stringのcopy constructorとoperator=がnothrowだと
保証してくれるなら使ってやるよ。
403
名前:
デフォルトの名無しさん
:03/03/25 09:56
>>402
強い保証が欲しいなら自分でラップすればいい。
コピーしてswap使うとか、boost::shared_ptr使うとか、いろいろあるだろ。
404
名前:
デフォルトの名無しさん
:03/03/25 10:39
質問です。
(ファイル"A.h")
namespace Aspc {
class Aclass {
Bspc::Bclass Bobj;
};
};
----------------------------------
(ファイル"B.h")
namespace Bspc {
class Bclass {
Aspc::Aclass Aobj;
};
};
こんな関係のヘッダをインクルードしようと思ったのですが
どうしたものだかと悩んでしまいました。
ご教授お願い致します。
405
名前:
デフォルトの名無しさん
:03/03/25 10:59
>>404
ヘッダでインスタンスを定義しちゃダメ
406
名前:
405
:03/03/25 11:01
>>404
'class'が見えてなかったよ・・・ごめん。
前方宣言しる。
407
名前:
デフォルトの名無しさん
:03/03/25 11:01
>>404
namespace Aspc {
class Bclass;
class Aclass {
Bspc::Bclass Bobj;
};
};
----------------------------------
(ファイル"B.h")
#include "A.h"
namespace Bspc {
class Bclass {
Aspc::Aclass Aobj;
};
};
408
名前:
405
:03/03/25 11:04
>>404
あぁあ、classの中でもやっぱりインスタンスには前方参照は効かんぞ。
そのクラス定義は、論理的にムリだ。
前方宣言+auto_ptrくらいにしとけ。
スレ汚し、まことにもうしわけない。
409
名前:
404
:03/03/25 11:19
>>405
うあ やはり無理があったですか。
どうやっても片方で名前空間が通せませんでした。
了解しました。構成を見直してみます。
ありがとうございました。
410
名前:
デフォルトの名無しさん
:03/03/25 11:22
Aの中には必ずひとつのBを入れてください。
Bの中には必ずひとつのAを入れてください。
さぁ、Aをひとつ、くださいな。
411
名前:
デフォルトの名無しさん
:03/03/25 11:32
>>404
ワラタ
sizeof(Aclass)はいくつになるんだよ。
412
名前:
459
:03/03/25 12:58
namespace Aspc {
class Bspc::Bclass;
class Aclass {
Bspc::Bclass& Bobj;
};
};
----------------------------------
(ファイル"B.h")
namespace Bspc {
class Aspc::Aclass;
class Bclass {
Aspc::Aclass& Aobj;
};
};
実体はコンストラクタで作られ
413
名前:
404
:03/03/25 13:33
404です 皆さま レスありがとうございますー
結局、どっちみち相互依存が大きいので
独立させる意味なしと判断しますた。
namespace Aspc {
class Aclass;
namespace Bspc {
class Bclass {
Aclass Aobj;
};
};
class Aclass {
Bspc::Bclass Bobj;
};
};
とりあえず今回はこれで回避。
>>412
試してみましたが、やはりどうしても
先に読まれるほうの class Bspc::Bclass; のあたりで
Bspcが未定義になってしまうかと思われます。
>>410
あー、上記は例を簡略しすぎてアレな関係になってますが
実際はクラス同士を持ち合っているわけではないのでご心配なく。
414
名前:
デフォルトの名無しさん
:03/03/25 14:11
>>413
ほんとは AclassとBclassって、
お互いのポインタか参照を持ち合ってるのか?
415
名前:
404
:03/03/25 15:40
たびたびすみません
>>414
もちょい正確にすると、
("A.h")
namespace Aspc {
class Aclass {
void UpdateA();
void FromBclass( データ );
Aspc::BaseClass* pBase;
};
class BaseClass { //実体保持
void Update(); //AobjとBobjの更新ループ
private:
Aspc::Aclass Aobj[n];
Bspc::Bclass Bobj;
};
};
--------------------------------------
("B.h")
namespace Bspc {
class Bclass {
void UpdateB(); //任意のpAclassにデータを投げる
Aspc::Aclass* pAclass[n];
};
};
がんばって要約するとこんな関係ぽ。
名前空間とかおぼえたてで プロトタイプ宣言で
どうにかするのかなと思い。
やっぱりBclassはAspcなしでは動かさないので、
Aspcに内包することにしました。お騒がせしましたー
416
名前:
デフォルトの名無しさん
:03/03/25 19:59
----ファイルcmycl.h----
class mycl{
public:
static int i1;
};
----ファイルcmycl.cpp-----
#include"mycl.h"
int mycl::i1 = 1;
----ファイルtest1.cpp----
#include"iostream.h"
#include"mycl.h"
int main(){
mycl c;
cout << c.i1 << "\n";
return 0;
}
とやって、
bcc32 test1.cpp cmycl.cpp
とコンパイルしたのですが、エラーが出てしまいます。
静的メンバ変数を使えるようになりたいのですが、ご教授お願いします。
417
名前:
デフォルトの名無しさん
:03/03/25 20:07
>>416
どんなエラーが出たのか書け。
あと、インクルードするファイル名を確認しろ。
418
名前:
デフォルトの名無しさん
:03/03/25 20:14
>>416
インクルードガード。散々ガイシュツ。
419
名前:
デフォルトの名無しさん
:03/03/25 22:34
VC++6.0,Winでのチラつかない描画に関する質問。
オフスクリーン描画、WM_PAINTで転送がメジャーだろうけど
もっとかんたんな方法ない?フラグ立てるだけ、とか。
420
名前:
名無しさん
:03/03/25 23:34
ぬるぽを使ってはいけない理由を詳細に説明してください。
421
名前:
デフォルトの名無しさん
:03/03/25 23:34
>>419
レス違い
422
名前:
デフォルトの名無しさん
:03/03/25 23:35
>>421
れすじゃないすれ
423
名前:
デフォルトの名無しさん
:03/03/25 23:38
ぬるぽって何?
nullっぽい って言う意味?
424
名前:
デフォルトの名無しさん
:03/03/25 23:41
とりあえずここではバルスよりも禁句とされている
425
名前:
423
:03/03/25 23:50
なるほど・・・
ヌルポインタのことか
あまり使わない単語だから気づかなかった(汗
426
名前:
デフォルトの名無しさん
:03/03/26 00:13
>>425
(゚Д゚)ハンパネー!!!
427
名前:
デフォルトの名無しさん
:03/03/26 00:19
( ´∀`)<ぬるぽ
428
名前:
デフォルトの名無しさん
:03/03/26 00:31
>>427
(゚Д゚)ハンパネーガッ!!!
429
名前:
国語が足りない奴
:03/03/26 08:03
struct BMP{
struct BMP BP;
};
この構造体をエラーなしにしたい時はどうすれば
いいですか?
でるエラーは「struct BMPは未定義」です。
430
名前:
デフォルトの名無しさん
:03/03/26 08:08
>>429
メンバ変数をstruct BMP *BP;にする。
431
名前:
デフォルトの名無しさん
:03/03/26 18:53
今、Borand C++ Compiler 5.5を使い独習C++で勉強しているんですが、
コンパイルすると次のようなエラーが表示されます。
致命的エラー F1003 c:\Boland\Bcc55\include\stdcomp.h 5:
error 指令: Must use C++ for STDCOMP.H
凄く簡単な下記のようなソースでもコンパイルする際にエラーになります。
一度再インストールしてみましたが、無理でした。
何か対処法はないのでしょうか?
#include <iostream>
using namespace std;
int main()
{
cout << "Hellow world!\n";
return 0;
}
よろしくお願いします。
432
名前:
デフォルトの名無しさん
:03/03/26 18:57
filename.cpp
433
名前:
デフォルトの名無しさん
:03/03/26 19:02
>>432
解決しました。本当にありがとうございます。
ついCの癖でそのまま.cにしていました。
434
名前:
デフォルトの名無しさん
:03/03/26 22:47
質問というかなんというか、ちょっと気になったので、
ご意見が伺えればと思います。
たとえば、
class Hoge {
public:
hoge_t value() const {
// 初期化してないときは、ファイルから読み込んだりして
// メンバを初期化したい。
// でも、いつ使うか分からないのでコンストラクタでは
// 初期化したくない。
// でも、意味的には絶対にconst なのに。。。
}
};
みたいな、メンバを作りたくなったことってないですか?
そんな場合ってどうしてます?
1. しょうがないので、constをはずす。
2. Hoge* h = (Hoge*)this;
3. グローバルな領域に、いつも触れるオブジェクトをおいておいて、
それを参照する。
4. その他
くらいですかね?
1. は、そのためにconstを使わないというのが、のちのち別の弊害を
呼びそうで嫌です。
2.や3.は、このクラスのconstが信用できなくなりそうで嫌です。
結局、オーバヘッドが気になるけど、コンストラクタで初期化して
しまったのですが、なにか良い解決方法ってありますか?
よろしくです。
435
名前:
デフォルトの名無しさん
:03/03/26 22:51
>>434
// 初期化してないときは、ファイルから読み込んだりして
// メンバを初期化したい。
// でも、いつ使うか分からないのでコンストラクタでは
// 初期化したくない。
// でも、意味的には絶対にconst なのに。。。
constの意味解ってますか?
436
名前:
デフォルトの名無しさん
:03/03/26 22:53
>>434
キャッシュ要素やレイトバインディング用には
mutableキーワードが使えるけど
437
名前:
デフォルトの名無しさん
:03/03/26 23:05
>>435
ちゃんと読んでくれ。
>>436
そんなものがあるとは、しりませんでした。
なかなか、知らないことってあります。
でも、使い方は難しそうですね。
コーディング規約で使うなとか、書かれそう。
非const のメンバ関数の評価を必要があるまで行わない、みたいな
機構をコンパイラがサポートしてくれたら、、、
とつくづく思います。
438
名前:
デフォルトの名無しさん
:03/03/26 23:49
>>436
そんな便利なものが、、、と思ったが使い方が難しいですね。
結局、コーディング規約で使用不可になるのも時間の問題かと、、、
必要なときだけ評価してくれるメソッドが作れる仕様になって
くれないかな。と思うよ。
439
名前:
デフォルトの名無しさん
:03/03/27 00:26
>>437
いまいちいみがわからn。
ちょっと解説してくれ
440
名前:
デフォルトの名無しさん
:03/03/27 00:35
const版と非const版をオーバーロードするんじゃダメなのか?
441
名前:
デフォルトの名無しさん
:03/03/27 00:40
そーでなくって、
たとえば、円周率の1万桁目を返すメソッドがあったとする。
毎回、1万桁を計算するのは嫌なので、必要なときに計算したい。
これは、意味的にはconstであると考えられる。
もちろん、コンストラクタで計算するというのもありだが、
もし使わないとしたら、計算時間がもったいない。
どうしよう、、、、
という話です。
442
名前:
デフォルトの名無しさん
:03/03/27 00:47
>>438
使い方が難しいといったのは、constという指定では、本来メンバに
副作用があってはいけないと思います。
が、mutableでは、それができることになります。
ちょうど、friendのようなもので、よほどドキュメントが整備されて
居ない限り、動作を追うのが難しくなります。
本来、副作用を極小化することによって、想定できない動作を防ぐために
classやconstというのはあるはずですから。
そこで、たとえば副作用があってもいい、コンストラクタや非constの
メソッドを呼び出したときに、その動作のうち、時間がかかってしかも
使われないかもしれない初期化のコードなどの評価を必要があるまで
遅延させることができたなら、より安全に記述できるんじゃないかな
って思ったって訳です。
443
名前:
デフォルトの名無しさん
:03/03/27 00:54
面罵のconstとmutableキーワードを言語仕様から取っ払え。
444
名前:
デフォルトの名無しさん
:03/03/27 00:55
>>442
==441なのか?
mutableが最も威力を発揮するような場面なら
使うのが吉かと。
445
名前:
デフォルトの名無しさん
:03/03/27 01:00
>>444
442=441=.... です。
確かに、素直に使うのが吉なような気はしますが、、、、
friendと同じように、禁止されるんでないかなーという
一抹の不安が。
446
名前:
444
:03/03/27 01:04
>>445
禁止されたら邪悪な方法を使え!
class AAA {
int a;
int* p;
public:
AAA() : a(0), p(&a) {}
void asd(int i) const { *p = i; }
};
素人さんにはお勧めでき(以下略
447
名前:
444
:03/03/27 01:08
いや、ま、
p = new int;
ってやれば邪悪でも何でもないんだけどね、、、
448
名前:
デフォルトの名無しさん
:03/03/27 01:32
んー、難しいですねぇ。
というか、
int* p => int const * const p;
という型に変換されないあたりが、なんか仕様的に嫌に思えてきました。
449
名前:
デフォルトの名無しさん
:03/03/27 05:33
C++ではvoid *は使わないんですか?(T.T)
450
名前:
デフォルトの名無しさん
:03/03/27 06:11
>>449
void *って何につかうの?
通常目的の型のポインタを使うと思いますが。
451
名前:
デフォルトの名無しさん
:03/03/27 07:01
> int* p => int const * const p;
int f( int* p )
{
int const * const q = p;
return *q;
}
変換できるぞ。
452
名前:
デフォルトの名無しさん
:03/03/27 07:01
friendやmutableに気をつけろってんならわかるが、
禁止までされてる場合の理由ってどうなってんですか?
453
名前:
デフォルトの名無しさん
:03/03/27 08:42
>>434
class Hoge {
public:
hoge_t value() const {
return GetHogeT();
}
private:
hoge_t& GetHogeT(void){
static hoge_t tmp;
return tmp;
}
};
じゃだめなのか?
(メンバの変わりに常にGetHogeTを介して操作する)
454
名前:
デフォルトの名無しさん
:03/03/27 09:12
>>453
Hogeインスタンス複数作ってあぼーん
455
名前:
デフォルトの名無しさん
:03/03/27 09:17
>>434
そういう場合は
Hoge* pThis = const_cast<Hoge*>(this);
pThis->メンバ = 値
なんてするのがセオリーかな。
第2の選択肢として変更するメンバをmutable宣言する、ってのもある。
mutableは「決してconstではない」という意味で、全てのメンバ関数から
変更できてしまうので、今回の例では適切ではないだろう。
要約すると、概念的にはconstだが、メンバ変数の値を変更する必要がある場合
1.1部のメンバ関数でしか値を変更しない、または値の変更が例外的な場合は
const_cast<Hoge*>(this) を使う。
2.それ以外、つまり多くの関数で値を変更する場合や値の変更が例外的でない
場合は該当メンバ変数をmutable宣言する。
456
名前:
デフォルトの名無しさん
:03/03/27 10:20
volatileつけるとboolが呼ばれるみたいなんだけど
なぜなんでしょうか?
#include<iostream>
using namespace std;
void test(char*)
{
cout << "char*" << std::endl;
}
void test(bool)
{
cout << "bool" << std::endl;
}
int main()
{
test(static_cast<char*>("a")); //char*
test(static_cast<volatile char*>("a")); //bool
test(static_cast<const volatile char*>("a")); //bool
}
457
名前:
デフォルトの名無しさん
:03/03/27 10:37
>>456
引数を明示的にvolatile char*と宣言するとちゃんと呼び出されるので、
volatileを付けたことによりchar*とはマッチしなくなり、次にポインタが
暗黙的にboolに変換されたためと思われる。
void test(char*)
{
std::cout << "char*" << std::endl;
}
void test(bool)
{
std::cout << "bool" << std::endl;
}
void test(volatile char* p)
{
std::cout << "volatile char*" << std::endl;
}
void test(const volatile char* p)
{
std::cout << "const volatile char*" << std::endl;
}
int main()
{
test(static_cast<char*>("a")); //char*
test(static_cast<volatile char*>("a")); //volatile char*
test(static_cast<const volatile char*>("a")); //const volatile char*
}
458
名前:
デフォルトの名無しさん
:03/03/27 11:34
>>449
スレッドへの引数に使う。
Cでもいえることだが。
459
名前:
456
:03/03/27 12:14
C++は強く型付けされてるとよく聞くけど
暗黙的な変換に関しては
なんかしっくりこないことが多い気がする。
一般の関数で行われる標準変換も便利といえば便利だが、
ときには必要もない時もあるし、
動作を変更したいときだってあるはずだと思う。
となるとtemplateと関数オブジェクト使えってことになるわけだが、
それはそれで面倒な訳だが...。
460
名前:
デフォルトの名無しさん
:03/03/27 13:46
>>459
volatileが勝手に外れるのがしっくりくるのか?
461
名前:
456
:03/03/27 13:58
>>460
それもそうだねw
勝手にはずれて一見正常に動いてるように見える恐さと
見当違いなものが呼ばれてる恐さの攻めぎあい...。
462
名前:
デフォルトの名無しさん
:03/03/27 14:00
http://jsweb.muvc.net/index.html
★☆★☆★☆★☆★☆★☆★☆★☆
463
名前:
デフォルトの名無しさん
:03/03/27 14:13
struct X
{
int f();
int f() const;
int f() volatile;
int f() volatile const;
};
int f( X volatile const & x )
{
return x.f();
}
464
名前:
デフォルトの名無しさん
:03/03/27 15:16
というか、そもそもbool<->intの変換とかtype*->boolの変換さえなけりゃ問題ないんだろうに。
465
名前:
デフォルトの名無しさん
:03/03/27 17:45
【フジテレビ】今夜9時〜10時54分
『FNS最高視聴率祭り国民のチャンスライン電話でもらえる1000万』
という番組が放送されるわけだが、この番組は解答者(ゲスト)が
クイズに答えるのだが、どの解答者がその問題を正解してるか視聴者が
スタジオに電話し答えるわけだ。そして、そこに2ちゃんねらーを出演させようじゃないか!
■手順■
1.番組中に公表される番号に電話する。
2.運良くつながる(つながらない場合は根気よくかけ直す)
3.司会者が「もしもし〜」などと切り替えしてくる。
4.大声で「オマエモナー」と叫ぶ。
5.あとは賞金ゲットのために頑張ってください。
※このレスを見かけたら、できれば5つ以上のスレに貼り付けてください。
【企画本部】
http://that.2ch.net/test/read.cgi/event/1048752014/l50
466
名前:
デフォルトの名無しさん
:03/03/27 22:32
extern "C"の使い方がよくわかりません。
たとえば、標準ライブラリでhoge.hというヘッダがあってもchogeがない場合は、
extern "C" {
#include <hoge.h>
}
とするのでよいでしょうか?
467
名前:
466
:03/03/27 22:34
× 標準ライブラリ
○ 標準っぽいライブラリ
468
名前:
デフォルトの名無しさん
:03/03/27 22:36
>>466
extern "C" は主にC++の名前マングリングを防止するためにある。
Cで書かれたライブラリをリンクする場合はインポートする関数を
extern "C" で囲まないとリンカエラーになる。
469
名前:
466
:03/03/27 22:39
>>468
ありがとうございます。
そこまではわかるんですが、それで、
>>466
は正しいのでしょうか?
そういうコードを見たことがないので、不安になったのです。
470
名前:
デフォルトの名無しさん
:03/03/27 22:42
>>468
このドスケベ男め
471
名前:
デフォルトの名無しさん
:03/03/27 22:44
ヘッダをインクルードする時でなくて、ヘッダそのものに、
#ifndef __cplusplus
extern "C" {
#endif
// 本体をここに書いてある
#ifndef __cplusplus
}
#endif
としてあることが多いような。
されてないなら
>>466
のようにするしかない。
472
名前:
デフォルトの名無しさん
:03/03/27 22:46
ifndef でなくて ifdef でした。
すまん。
473
名前:
466
:03/03/27 22:47
>>471
>>472
ありがとうございます。
しかも即レスで。
このスレはレベルが高いので助かりますです。
474
名前:
デフォルトの名無しさん
:03/03/27 22:48
>>470
まんぐりんぐ違い
475
名前:
デフォルトの名無しさん
:03/03/27 23:06
( ´∀`)<ぬるぽリング
476
名前:
デフォルトの名無しさん
:03/03/28 05:05
まんぐろんぐ に いんぽーと か
ここは卑猥なインターネットですね!!!
477
名前:
デフォルトの名無しさん
:03/03/28 09:02
ろんぐ→りんぐ
(-_-)ウツダシノウ ダンッ ──< ===E∩三⊂∀・ )
478
名前:
デフォルトの名無しさん
:03/03/28 11:30
クラスを引数とすると、そのクラスの新しいインスタンスを返すような
メソッド(いろいろなクラスのインスタンスを管理するクラスで)
を作る方法を教えてください。
479
名前:
デフォルトの名無しさん
:03/03/28 11:35
仮想関数を一つも持たないクラスAから派生クラスを作成する場合、
クラスAのデストラクタはvirtualでなければならないのでしょうか?
480
名前:
デフォルトの名無しさん
:03/03/28 11:42
>>478
意味が良くわからん
481
名前:
デフォルトの名無しさん
:03/03/28 11:42
>>479
class A{};
class B : public A{};
A *a=new B;
delete a;
とするようなことがあるのならvirtualにする必要がある
482
名前:
478
:03/03/28 12:02
わかりにくくてすみません。
こんな感じのものを作ってみました。
Factoryクラスがオブジェクトを管理しています。
クライアントがcreateメソッドを呼び出すと、
指定したインスタンスが得られます。
ifの羅列になってしまうのですが・・・
class Factory{
private:
std::list<Object*> m_obj_list;
public:
Object* create(const type_info& a_type){
Object* nobj;
if(a_type == typeid(Integer)){
nobj = (Object*)new Integer;
}else if(a_type == typeid(Symbol)){
nobj = (Object*)new Symbol;
}else{
throw new UExceptionNotSupportType;
}
m_obj_list.push_back(nobj);
return nobj;
}
}
483
名前:
デフォルトの名無しさん
:03/03/28 12:06
>>482
まだいまいちよくわからないのだが
class Factory{
private:
std::list<Object*> m_obj_list;
public:
template <class T>
Object* create(){
Object* nobj=new T;
m_obj_list.push_back(nobj);
return nobj;
}
}
Factory f;
f.create<Integer>();
これじゃだめなのか? なんの役に立つんだこれ?
484
名前:
478
:03/03/28 12:54
>>483
なるほど。ありがとうございます。
インタプリタ作成中なんですが、オブジェクトの管理をする部分です。(GCとか)
485
名前:
デフォルトの名無しさん
:03/03/28 13:30
>>479
n個のクラス C0, C1, C2 〜 C(n-1)があり
クラスCm(1<=m<n)はクラスC(m-1)より派生しているとする
また、クラスCmのデストラクタはvirtual宣言されていないものとする
0 <= a < b < nのとき以下のポインタpaがあるとき
Ca* pa = new Cb;
delete pa; によって
C0のデストラクタがvirtualであるときは
クラスCbから継承ツリーを逆にたどりC0までのデストラクタが順に呼び出される
C0のデストラクタがvirtualでないときは
クラスCaのデストラクタのみ呼び出される
オブジェクトCx(0<=x<n)がデストラクトされるとき
デストラクタがvirtualであるときは
クラスCxから継承ツリーを逆にたどりC0までのデストラクタが順に呼び出される
デストラクタがvirtualでないときは
クラスCxのデストラクタのみ呼び出される
デストラクタを正しく呼び出したいのであれば、virtualを付けなければならない。
486
名前:
479
:03/03/28 14:03
>481
>485
まさしく481の例のようなことをしたかったわけです。
なるほど、よくわかりました。
ありがとうございました。
487
名前:
デフォルトの名無しさん
:03/03/28 16:28
>>484
関数をこうしたほうが使いやすいかな
template <class T>
T* create(){
T* nobj=new T;
m_obj_list.push_back(nobj);
return nobj;
}
488
名前:
デフォルトの名無しさん
:03/03/28 16:59
std::string::c_str() は例外を出す可能性があるから、
きちんと例外処理したほうが良いというのは本当ですか?
489
名前:
デフォルトの名無しさん
:03/03/28 17:12
>>484
のObjectって何?Javaかとおもっちゃった。
490
名前:
デフォルトの名無しさん
:03/03/28 19:14
const修飾子について教えて下さい。
やりたいことはMAX.cppのMAX_SIZEを1個変更する事で
すべてのクラスのMAXサイズを変更できるようにしたいのです。
[AAA.cpp]
extern const int MAX_SIZE ;
class AAA
{
chars[MAX_SIZE];
};
[BBB.cpp]
extern const int MAX_SIZE ;
class BBB
{
char s[MAX_SIZE] ;
};
[MAX.cpp]
const int MAX_SIZE=256 ;
んでこれらのソースをコンパイルすると
「定数式が必要です。」でエラーになります。
#defineを使う方法もあるのですがデバッガに
かけた時に変数名が消えてしまうのでやりたくないのです。
constとexternの使い方まちがってますか?
環境はVC++6です。
491
名前:
デフォルトの名無しさん
:03/03/28 19:20
C++だとconstは内部リンケージじゃなかったっけ?
492
名前:
デフォルトの名無しさん
:03/03/28 19:52
>>490
こりゃ無理だろ
[max.h]
const int MAX_SIZE=16; // or enum { MAX_SIZE = 16 };
[a.cpp]
#include "max.h"
class A { char chars[MAX_SIZE]; };
[b.cpp]
#include "max.h"
class B { char chars[MAX_SIZE]; };
これでどう?
493
名前:
デフォルトの名無しさん
:03/03/28 20:02
enum使え。
494
名前:
デフォルトの名無しさん
:03/03/28 20:09
class Hoge {
public:
static int c;
};
int Hoge::c = 100;
int main () {
Hoge *pHoge = NULL;
cout << "c = " << pHoge->c << endl;
return 0;
}
これ動くのだけれど保証されていますか。
お願いします。
495
名前:
デフォルトの名無しさん
:03/03/28 20:14
>>494
インスタンスのメンバには一切触れないから大丈夫だと思うが
すなおに
cout<<"c = "<<Hoge::c<<endl;
としてはだめなのですか?
496
名前:
デフォルトの名無しさん
:03/03/28 20:28
今日からC++始める。
図書館で独習C++第3版と
1000万人のコンピュータ科学1入門編気軽にプログラミング
っての借りてきた。
BCPadで作ってとGCCでコンパイルします。
よろしくお願いします
497
名前:
デフォルトの名無しさん
:03/03/28 21:26
>>496
いばらの道になるかもしれませんが、ガンガってください
498
名前:
デフォルトの名無しさん
:03/03/28 21:37
491さん
492さん
493さん
どうもありがとうございます。
コンパイル通りました。
const修飾された変数は、格ソース固有の持ち物
であって外部に見せる(公開)する事はできない。
よって、*.hにconst変数を記述し各々のソースに
取込んだとしても、各ソースにconst変数が確保
される。
と理解しましたが合ってますか?
s/格/各/
499
名前:
デフォルトの名無しさん
:03/03/28 23:44
VC++の質問もここでいいのかな??
MFCでアプリケーション作成しているのですが、midiを流す方法がわかりません。
DirectXの知識がないので、APIを使えばできるとか聞いたのですが。
まだWindowsプログラミングは初心者なものでどうしていいか・・・
アドバイスお願いします。
500
名前:
デフォルトの名無しさん
:03/03/28 23:57
>>499
スレッド一覧の検索ぐらいしようよ・・・
■過去ログ置き場に戻る■
1-
前250
次250
最新50
DAT2HTML
0.33f Converted.