■過去ログ置き場に戻る■ 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.