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


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

C++相談室 part6
251 名前:デフォルトの名無しさん :02/04/22 22:35
>>249
実行してみれ。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
int *p;
vector<int> *vp;

p = new int[10];
vp = new vector<int>(10);

for (int i = 0; i < 10; i++)
cout << p[i] << ' ';
cout << endl;

vector<int>::iterator pv = vp->begin();

for (; pv != vp->end(); pv++) cout << *pv << ' ';
cout << endl;
}

252 名前:デフォルトの名無しさん :02/04/22 22:44
p.119
4.9.5 初期設定
中程の
「配列と構造体のメンバは、配列構造体が静的であるかどうかに関わらず、デフォルトで初期化される。」
と書かれているのは誤植で

http://www.longtail.co.jp/errata/
によると
pg.119 s/静的であるかどうかに関わらず、デフォルトで初期化される/静的であるかどうかによって、デフォルトで初期化されるかどうかが決まる/

と訂正されている。

253 名前:デフォルトの名無しさん :02/04/22 22:46
>>251
その例は、STLが明示的なコンストラクタ呼び出しを行っているので
0初期化される例だね。

だけど、今回の>>246は単なるstructのnewの話なので、違う話だな・・・

254 名前:253 :02/04/22 22:49
>>253
あ、見当違いだった。

>>251
new(の過程で呼ばれるメモリ確保が) 0初期化する処理系だと
どっちも0になってしまうよね。

試しに手元のgcc 2.9.5 で struct を new してアセンブリ出力してみたが
メンバの初期化コードは生成されなかった。

255 名前:デフォルトの名無しさん :02/04/22 22:51
>>252
見てみた。
俺の第3版は初判第1冊だ。
鬱だ・・・・・・・・・

256 名前:名無しかも :02/04/22 22:54
プログラムの始めにdefineで変数の値を決めることのメリットはなんですか?defineのなかに数式とかも書けるのでしょうか?

257 名前:デフォルトの名無しさん :02/04/22 22:56
>>256
C++の場合はなるべくdefineの代わりにconstやinlineを使うように。
ただ#ifdefなどのマクロ評価はC++でも多用される。

258 名前:デフォルトの名無しさん :02/04/22 23:06
#defubeの主な目的は、 定数に名前を付けることである。円周率πを使うたびに
3.141592653589793と記述する代わりに、変数 pi にdefineを使って値を割り
当てることができ、3.14...という長い定数を使う代わりに pi を使うことが出来る。
さらに、円周率が変わった場合に、プログラムの変更が容易になるという利点がある。

259 名前:256 :02/04/22 23:09
ありがとうございます♪

260 名前:9999 :02/04/22 23:10

-------風俗の総合商社・MTTどこでも-------

〇デリバリーヘルス〇デートクラブ〇女性専用ホストクラブ〇
〇ハードSM奴隷クラブ〇レズビアン倶楽部〇ホモ・オカマ倶楽部
〇変態痴女と遊ぶ会〇痴漢・覗き趣味の会〇変態同好会・各種!
●楽しく遊べます! 090-8002-8356番
-----------美男・美女会員など多数在籍中-----------
  http://www.mttdocomo.jp/
-----女性アルバイト随時募集・高収入(日払い)月100万円可能-----
-----レズビアン・スタッフ●ホモスタッフ●女性専用ホストスタッフ同募-----
http://www.mttdocomo.jp/
------------------------------------------------

261 名前:デフォルトの名無しさん :02/04/23 00:28
>>252
あと、p293 「10.4.2 デフォルトコンストラクタ」も読むとよいかと。
つか、ここにも誤訳があるんだよなぁ… (ページの終わりのあたり)

262 名前:デフォルトの名無しさん :02/04/23 02:04
>>258
「約3」なんかになっちまったおかげで、jokeがjokeで無くなってしまった...

263 名前:デフォルトの名無しさん :02/04/23 03:14
char* out(size_t size){
class local_c{
public:char* temp;local_c(size_t val):temp(new char[val+1]){}
~local_c(){delete[] temp;temp=NULL;cout<<"local_end"<<endl;}
};
local_c lo(size);

while(size--){
lo.temp[size]=pdata[size];
cout<<lo.temp[size]<<endl;
}
return lo.temp;
}
pdataは何処かで定義されている配列です。この関数を、
cout<<out(3)<<endl;
とすると、どうやらアドレスがchar*にキャストされて表示されている・・・みたいです。
returnの部分を何とか出ませんか?

264 名前:デフォルトの名無しさん :02/04/23 03:25
>>263
それはともかく、return された lo.tempの指すメモリは、returnされた時点で開放されてるので
coutに渡されたときにはすでに無効アドレスだべ。

265 名前:デフォルトの名無しさん :02/04/23 03:32
>>264
サンクスです。何か根本から間違っていました。出直してきます。

266 名前:デフォルトの名無しさん :02/04/23 03:38
>>264
いや、無効にならないように、関数内でnewして新規に確保しているわけだが、
デストラクタ~local_c()で既にdeleteされたポインタを返しているのが問題では
ないだろうか。

267 名前:デフォルトの名無しさん :02/04/23 03:56
うむデストラクタで解放しちゃってるな。

268 名前:デフォルトの名無しさん :02/04/23 03:59
なんつーか、文字列の安全な所有権の移動(共有)をやりたいだけなら
std::string使っとけばいいんとちゃうん?

269 名前:デフォルトの名無しさん :02/04/23 04:00
264さんと266さんは多分同じ事を言っているんだろうな。

270 名前:デフォルトの名無しさん :02/04/23 10:36
>>217
効率をあまり考えないなら(どうせ sprintf だし効率悪くても良いだろ)、

1. fprintf() で /dev/null に書き込んで文字列長さを取得
2. alloca() でスタック上に文字列を書き込むバッファ領域を確保
3. 2 で確保した領域に sprintf()
4. そのバッファから std::string() をコンストラクトして返す

とかで簡単に実装できる。

271 名前:あう :02/04/23 11:09
#include<iostream>
using namespace std;

int max(int temp,int a){ /* 最大値を求めるときに渡す関数 */
return temp<a;
}

int min(int temp,int a){ /* 最小値を求めるときに渡す関数 */
return temp>a;
}

/* 一般的にトップを求める関数 */
int gettop(int* a,int size,int (*p)(int,int)){
int temp, i;
temp = a[0];

for(i=1;i<size;i++){
if((*p)(temp,a[i])) temp = a[i]; /* 共通化した処理 */
}
return temp;
}

int main(){
int data[] = {36,47,19,11,18,25,20,57,39,67,28}; /* 対象データ */

int size = sizeof(data)/sizeof(int); /* 配列サイズを求める */

/* 実際に使ってみる */
cout << "最大値 : " << gettop(data,size,max) << endl;
cout << "最小値 : " << gettop(data,size,min) << endl;

return 0;
}
一番最初の最初のmax関数とmin関数ですが、temp>aとか条件を返して
ますよね?なのになんで返り値の型はなんでintなの?boolじゃないの?
不思議に思ってコンパイルしてみたらちゃん通りましたけど理由がわかりません
どなたか教えて下さいおねがいしまう。



272 名前:デフォルトの名無しさん :02/04/23 11:22
>>271
if((*p)(temp,a[i])) temp = a[i]; /* 共通化した処理 */
で、真か偽かだけを見ているので、boolでもintでも通ります。

273 名前:デフォルトの名無しさん :02/04/23 11:26
つか、ふつー、std::max_elementとか、std::min_elementとか、
あるいは、関数テンプレートとか使わね?

274 名前:あう :02/04/23 11:29
わかったようなわからないような・・・
だったらやっぱりboolって書くべきじゃないですか?

275 名前:あう :02/04/23 11:31
>>273
私が書いたわけじゃないので・・・
メルマガにのっていました。

276 名前:デフォルトの名無しさん :02/04/23 11:56
某処理系で以下のプログラムが seg. fault をおこすそうですが、
これって不正ですか?

#include <iostream>
using namespace std;
void foo(int i) throw (char*)
{
 if (i == 0) throw "zero";
 cout << "non-zero";
}

main()
{
 try {
  foo(0);
 } catch (char* s) {
  cout << "error : " << s <<endl;
 }
 return 0;
}

string& で受けても同じだそうです。

277 名前:デフォルトの名無しさん :02/04/23 12:56
>>276
某処理系って何?

278 名前:デフォルトの名無しさん :02/04/23 14:48
#include<iostream>
using namespace std;

bool f1(void){
return true;
}
bool f2(void){
return false;
}
void get_f(bool (*p_func)(void)){
bool n=(*p_func)(void);
if(n)cout<<"nはtrue"<<endl;
else if(!n)cout<<"nはfalse"<<endl;
}
int main(void){
get_f(f1);
get_f(f2);
return 0;
}

関数ポインタを引数にとる関数つくりたいんだけどできません。
なぜ?

279 名前:デフォルトの名無しさん :02/04/23 14:54
>bool n=(*p_func)(void);

関数呼び出しに日下部はいらんよ

280 名前:デフォルトの名無しさん :02/04/23 14:59
>>279

あ!そうでした。すいません。馬鹿だ・・・
ところで日下部ってどういう意味?

281 名前:デフォルトの名無しさん :02/04/23 15:02
>>279
voidが不要って事ね。

282 名前:デフォルトの名無しさん :02/04/23 15:02
>>280
http://pc.2ch.net/test/read.cgi/tech/1019372139/l50

283 名前:デフォルトの名無しさん :02/04/23 15:56
>>277
http://pc.2ch.net/test/read.cgi/linux/996170115/l50
かと

284 名前:デフォルトの名無しさん :02/04/23 16:32
日下部ってまだ居るの?
 Λ Λ
(. .)
(   )〜
みたいなのだろ

285 名前:デフォルトの名無しさん :02/04/23 16:32
>>276
g++だとchar *を投げても受け取られませんね。

#include <iostream>
#include <cstdlib>
#include <exception>
using namespace std;

void my_terminate()
{
cout << "unexpected error occured!" << endl;
exit(1);
}

void foo(int i) throw (char *)
{
if (i == 0) throw "zero";
cout << "non-zero";
}

int main()
{
set_terminate(my_terminate);
try {
foo(0);
}
catch (char *s) {
cout << "error : " << s <<endl;
}
}

286 名前:デフォルトの名無しさん :02/04/23 16:40
>>276
if (i == 0) throw "zero";


if (i == 0) throw static_cast<char *>("zero");

にしたらg++でも正しく動作しました。
どうやら throw "zero"; だけではchar *型の例外を投げたことには
ならないようです。やれやれ。

287 名前:デフォルトの名無しさん :02/04/23 16:44
>>285
某処理系(w)では

11c12
< void foo(int i) throw (string&)
---
> void foo(int i) throw (char *)
13c14
< if (i == 0) throw string("zero");
---
> if (i == 0) throw "zero";
23c24
< catch (string& s) {
---
> catch (char *s) {

でもBus Errorを起こすみたいです。

288 名前:287 :02/04/23 16:46
うが、引数逆にしちゃった(w

289 名前:デフォルトの名無しさん :02/04/23 16:50
>どうやら throw "zero"; だけではchar *型の例外を投げたことには
>ならないようです。やれやれ。

const char* 投げてることになってるんじゃないかな?

290 名前:デフォルトの名無しさん :02/04/23 17:18
>>289
産休。某処理系で試してみてくらしゃい。

#include <iostream>
#include <cstdlib>
#include <exception>
using namespace std;

void my_terminate()
{
cout << "unexpected error occured!" << endl;
exit(1);
}

void foo(int i) throw (const char *)
{
if (i == 0) throw "zero";
cout << "non-zero";
}

int main()
{
set_terminate(my_terminate);
try {
foo(0);
}
catch (const char *s) {
cout << "error : " << s <<endl;
}
}

291 名前:241 :02/04/23 19:34
>>241=>>244です。
再makeしたら動くようになりました。
これを使って、coutを継承してoperator<<をオーバーライドし、
int等の自動変換を継承しつつ、
char*やstringが渡された時に自動的に文字コードを変換するようなものを
作ることはできるのでしょうか?

292 名前:デフォルトの名無しさん :02/04/23 19:41
できるか、という御下問ですが、結論だけをもうしますと、できます。
ただし、インスタンスであるcoutを継承する、ということはできません。
#defineなど邪法を用いれば、おそらくお望みの結果となるでしょう。

293 名前:デフォルトの名無しさん :02/04/23 20:52
>>291
フィルタ的なストリームバッファを実装してみたら。

294 名前:デフォルトの名無しさん :02/04/23 21:18
>>290
某処理系では何を投げても seg. fault か bus error になるようです。set_terminate効かず(泣
どうも原因は283のリンク先にあるとおりlibc_mallocでこけてるみたいです。

295 名前:デフォルトの名無しさん :02/04/23 21:46
>>294
ライブラリがバグってるんじゃ手の施しようがないね。
g++の修正差分って配布されてないの?

296 名前:デフォルトの名無しさん :02/04/24 00:54
class A{
public:typedef void(CA::*FUNC)(void);
template<typename T>typedef void(CA::*Multi)(T);
FUNC fff[4];
A(){fff[0]=(Multi)foo;}←--------このMultiみたいに汎用のキャストって出来ます?
void func(){cout<<"func"<<endl;}勿論これはエラーなんですが・・・・・。
void foo(int a){cout<<a<<endl;}
};

297 名前:デフォルトの名無しさん :02/04/24 01:04
>>296
何をしたいのかよくわからんが、
関数オブジェクトでも使っとけ。

298 名前:デフォルトの名無しさん :02/04/24 01:08
ち、違うんだ〜〜
typedef void(*FUNC)(void);
void foo(int a){......}
void hoge(double a){........}
FUNC fff;
fff=foo;//エラー
これを、
fff=(Multi)foo;
fff=(Multi)hoge;
と書きたいんだ〜〜

299 名前:デフォルトの名無しさん :02/04/24 01:17
>298
fffを引数可変な仮装関数みたいな感じにしたいみたいだが、
ちっとはコンパイラ開発者の身にもなってみろよ。
そういうそういうことができたとして、
fff = (multi)foo; fff(3);
fff = (multi)hoge;fff(3);
を、どうコンパイルする、っていうんだ?
引数をpritnfスタイルにして共通化するとか、
VARIANTオブジェクトに共通化しる!

300 名前:デフォルトの名無しさん :02/04/24 01:20
>>298
fffに代入した後はどうやって使う気だ?
もしかして引数の型で呼ぶ関数を変えたいとか?

301 名前:298 :02/04/24 01:33
う〜ん、やはり不可能みたいですね(よく考えたら当たり前という気がしてきた)
全メンバ関数アドレスを単一の配列に格納して使用したかったんですが、
無理となると、さてどうしようか

302 名前:デフォルトの名無しさん :02/04/24 01:43
全部void*で格納しといて使うときまたキャストするとか

303 名前:デフォルトの名無しさん :02/04/24 01:47
ああ、いや、使うときにキャストを意識したくないんです。
だからMultiにキャスト出来る方法ないかな〜〜と考えてたわけ。
fff=(Multi)foo;(Multi)foo(3);
fff=(Multi)func;(Multi)func(3);
としたかったのよ。でも無理だねぇ。

304 名前:デフォルトの名無しさん :02/04/24 01:49
>302
メンバ関数へのポインタのサイズはsizeof(void*)以上になることがあるよ。



305 名前:デフォルトの名無しさん :02/04/24 02:01
>>303
typedef void (*FUNC)(...);
FUNC fff[3];
void foo(...);
void hoge(...);
見たいなのか?

306 名前:デフォルトの名無しさん :02/04/24 02:04
( ´∀`) エッ?

307 名前:デフォルトの名無しさん :02/04/24 02:47
>>305
だから、まぁ、そうなんだけどさ・・・・

308 名前:デフォルトの名無しさん :02/04/24 03:42
( ゚Д ゚) エッ?

309 名前:デフォルトの名無しさん :02/04/24 11:55
0から1の間の数をランダムに10個表示させたいのですが。
実行するとx=0ばっかり出てしまいます・・・


#include <iostream>
#include <math.h>
using namespace std;
void main()
{
for(int i=0; i<=10; i++)
{
double x=rand()/RAND_MAX; //0〜1のランダムな数
cout << "xは" << x <<"\n" ;
}
}

310 名前:309 :02/04/24 12:08
double x=(double)rand()/RAND_MAX;
これで出来たような気がします。

311 名前:デフォルトの名無しさん :02/04/24 18:50
>>258
C言語ではそうだね。


312 名前:デフォルトの名無しさん :02/04/24 23:12
>>296
template<typename R_Type,typename Seed>void caster(R_Type& lhs,Seed& rhs){
lhs=reinterpret_cast<R_Type>(rhs);
}
こんなのどうよ?

313 名前:デフォルトの名無しさん :02/04/24 23:25
>>312
reinterpret_cast使った時点であぼーん決定。

314 名前:デフォルトの名無しさん :02/04/24 23:34
>>312
代入時のキャストはそれでもいいけど、関数を呼ぶ時はどうすんの?

315 名前:デフォルトの名無しさん :02/04/24 23:59
a=27などと表示させたい場合
printf("a=%d",a);←これであってますかね。
これを
std::cout<< <<std::endl;
を使うとどういうふうに書けばいいんですか?

316 名前:デフォルトの名無しさん :02/04/25 00:02
std::cout<<"a="<<a<<std::endl;

317 名前:デフォルトの名無しさん :02/04/25 00:04
ありがとうございました!!!!!!>>316

318 名前:デフォルトの名無しさん :02/04/25 00:05
endl使ってる時点ですでに互換性無し。

std::cout<<"a="<<a;if(0)std::cout<<std::endl;
が正解だろ。


319 名前:デフォルトの名無しさん :02/04/25 00:12
>>313
Seedがキャストされる前の型なんだから、それをどっかに確保して
関数呼ぶときにそれを使ってキャストしる。


320 名前:デフォルトの名無しさん :02/04/25 01:01
ねー、endlって処理系(OS?)依存なのっ?

321 名前:デフォルトの名無しさん :02/04/25 01:05
はつみみです。

322 名前:デフォルトの名無しさん :02/04/25 01:07
てゆーか、>>318 が何言ってるのかぜんぜんわかんにゃ。

323 名前:デフォルトの名無しさん :02/04/25 01:12
>>322
318じゃないけど、
endl突っ込んだら改行しちゃうよ。
でもやっぱりif(0)以降はわかんにゃ。

324 名前:323 :02/04/25 01:14
あー、315が「endl使うと」って書いてるから無理やり入れてあんのか。

325 名前:デフォルトの名無しさん :02/04/25 01:20
if(0)は//の代わりに入れてあるのか。

326 名前:322 :02/04/25 01:31
わかった。
よーするに、>>318 はヒネクレモンというわけだ。

327 名前:デフォルトの名無しさん :02/04/25 01:33
>323
あー、そういうことか。
もとのprintfのほうには、"\n"で終端してないってことか。
しかし、それを「互換性無し」という318もなんだかなー。

328 名前:デフォルトの名無しさん :02/04/25 05:10
ひねくれもんage

329 名前:デフォルトの名無しさん :02/04/25 10:24
ヘソ曲がりなコード

int main()
{
int i = i;         // (`へ´)
return 0;
}


330 名前:デフォルトの名無しさん :02/04/25 20:53
例外指定ってありますよね
void func() throw(); <- これです。
これを指定しておくと、どういう効果があるんですか?

throw()は例外を投げないという指定だと思いますが、
この内部で例外を投げると
1 無かったことになる
2 捕捉することが出来ない
どっちなんでしょうか?

VC++6.0しか持ってないので、確認できないんです。

331 名前:デフォルトの名無しさん :02/04/25 21:07
>>330
3.異常終了します。

332 名前:デフォルトの名無しさん :02/04/25 21:11
unexpected()が呼ばれる
set_unexpected()で変更出来る

だったと思うけど

333 名前:デフォルトの名無しさん :02/04/25 21:14
で、デフォルトのunexpected()がabort()を呼ぶと思う

334 名前:デフォルトの名無しさん :02/04/25 22:26
set_unexpected でハンドラ変更したりしたところで呼び出し元には戻れないから、要するに結局のところ abort するっつぅことやね。

335 名前:デフォルトの名無しさん :02/04/25 23:02
ダイアログ出したり、変更をファイルに書き出したりする
チャンスが与えられてる、ってのは大きな違いかも。

336 名前:デフォルトの名無しさん :02/04/25 23:10
ふと思ったこと。set_unexpectedのハンドラから呼び出し元に戻る事は出来なくても、
unexpectedハンドラの中から、メッセージループを実行したりして
そのままずーっと実行を続けてもいいんだろうか。

337 名前:デフォルトの名無しさん :02/04/25 23:14
>>336
ワラタ
やってみ。

338 名前:デフォルトの名無しさん :02/04/26 07:39
ファイルがオープンできなから例外を投げるのはOKでしょうか?

339 名前:デフォルトの名無しさん :02/04/26 07:40
>>338
謎な文章書かないでください。

340 名前:338 :02/04/26 07:43
ごめんなさい
こっちが正しいでありんす

ファイルがオープンできなかったら例外を投げるのはOKでしょうか?


341 名前:デフォルトの名無しさん :02/04/26 07:56
当然オープンできなきゃ困るファイルが開けない…なら
例外を投げて処理するべきだろう。そうでもないなら
エラー処理の仕方の方針の問題な気がするのでてけとーにせよ。

342 名前:デフォルトの名無しさん :02/04/26 08:00
>>340
いいんでないの?
MFCのCFileクラスもコンストラクタがそういうことしてるし。

343 名前:お願いします :02/04/26 11:25
feet=floor(totalInches/12.0);
いま、LABをやっているんですけどこのheader file
を教えて下さい

344 名前:デフォルトの名無しさん :02/04/26 11:43
>>343
LABって何よ?

345 名前:デフォルトの名無しさん :02/04/26 11:45
343 desu

homework dedu



346 名前:デフォルトの名無しさん :02/04/26 11:48
宿題なら自分でやれや。

347 名前:デフォルトの名無しさん :02/04/26 11:54
>>343
マニュアル調べるなり検索するなりすれよ。
人をマニュアル代わりにすんなよ。

348 名前:デフォルトの名無しさん :02/04/26 14:26
そもそもスレ違いだしな。

349 名前:338 :02/04/26 17:09
おいお前ら(>>341-342さん)!

・・・・・


m(^▽^)mありがとうございま〜した。また次もおながいしまーっす

350 名前:l :02/04/26 17:44
>>343
マスかけや
わかるかな?わかんねーだろな

351 名前:デフォルトの名無しさん :02/04/26 18:31
例外で気になったんだが、コンストラクタから積極的に例外を送出するコードってどう思う?
俺はコンストラクタ以外に構築メソッドを用意せずに、どんどん例外を投げてるんだが。

たとえば、ファイルクラスでも、open/closeで一つのクラスを使い回すのは
あまり好きじゃないんで、construct/destructで一連の作業を終了させ、
再利用できないような設計してるんだけど。

352 名前:デフォルトの名無しさん :02/04/26 19:33
>>350
ワロタ

353 名前:デフォルトの名無しさん :02/04/26 20:51
>>351
良いんではないかね。Javaもそうだし、リークに気を付けさえすれば、特に問題ないかと。
むしろ iostream とかがそういう風になってないのが嫌な感じ。

354 名前:HHH :02/04/27 01:50
平方採中法で乱数作るプログラムを書きたいんですが、
例えば「1234567890」という数値から「34567」という真中の桁だけ抜き出す
にはどうしたらいいんでしょうか?

355 名前:デフォルトの名無しさん :02/04/27 01:55
正数だけなら
long n = 1234567890;
long x = (n / 1000) % 100000;


356 名前:デフォルトの名無しさん :02/04/27 09:37
あ〜やっとC++のキーワードをソートできた〜

357 名前:デフォルトの名無しさん :02/04/27 10:33
>>351
俺もそうしてるよ。いちいち「もしopenをやってないなら」とかチェックしなくてすむのがいいよな。
>>353はリークの心配をしてるみたいだけど、全部のクラスをそういう風に自己責任で
構築させるようにしていくと、必然的に、どんなタイミングで例外が出てもリークが
起きないようになっていくよ。

358 名前:デフォルトの名無しさん :02/04/27 11:13
>>357
ほんとのところ、例外のリークとかは実装時に考えることにして、
あんまり深く考えてなかったんだけど、たまたまMSDNの例外安全の文章を読んでたら、
出来る限りコンストラクタから例外を投げるなという記述があったんで、気になってた。

コンストラクタ内部で例外を捕まえなかったということは、
その例外からの復帰が不能だということだから、内部で無理に捕まえなくて、
呼び出し側に例外をスルーしちゃってもいいと思ってた。

もちろん、例外指定を行えずに未知の例外が飛んでくるわけだから、
あんまり関心出来た事じゃないとは思うんだけど、catch (...)で捕捉して、
オブジェクトの作成に失敗したと扱うのは、汚いコーディングなのかな、とか。

359 名前:357 :02/04/27 12:59
>>358
このページのことかな?
http://www.microsoft.com/JAPAN/developer/library/vccore/_core_exceptions.3a_.exceptions_in_constructors.htm
このページに限らず、MSDNの例外に対する記述って、やり方が古いんだよね…。
More Effective C++ 、Exceptional C++ に記述してあるやり方なら、なにも問題は
起きないはずだけど。

>呼び出し側に例外をスルーしちゃってもいいと思ってた。
いいと思う。俺はやってるよ。
ところで、「スルー」は「through」の意味で言ってるよね?「throw」は「スロー」…。
(いや、俺は例外を初めて見たときは読み間違えてたからね)

>catch (...)で捕捉して、 オブジェクトの作成に失敗したと扱うのは、汚いコーディングなのかな、
これもやってる。汚いとは思ってない。ただまあ、CFileの例外はEFile,CRegの例外はERegって
風にクラス分けはしているけど。

360 名前:デフォルトの名無しさん :02/04/27 16:27
VC6で Effective C++ のシングルトンをやろうとして下のように記述したら、
コンパイルエラーが出ます。

class Hoge{
public:
  static Hoge& GetInstance(void);
private:
  Hoge(void);
  ~Hoge(void);
};

Hoge& Hoge::GetInstance(void){
  static Hoge obj;
  return obj;
}
Hoge::Hoge(void){
}
Hoge::~Hoge(void){
}

error C2248: 'Hoge::~Hoge' : private メンバ (クラス 'Hoge' で宣言されている)にアクセスできません。

C++の仕様としては、このエラーはおかしくないですか?
ほかのコンパイラではどうなるのか、知ってる方は教えてください。
もしVC6だけのバグなら、.NETでは直ってるかどうかって情報も欲しいっす。

361 名前:デフォルトの名無しさん :02/04/27 16:40
>>360
staticメンバobjの宣言がHogeの中にない。

362 名前:デフォルトの名無しさん :02/04/27 16:43
>>360
コンストラクタとデストラクタはpublicに置いて下さい。

363 名前:デフォルトの名無しさん :02/04/27 16:47
>>360
あんたの言うC++の仕様って何?
おかしいと思う根拠は?
>C++の仕様としては、このエラーはおかしくないですか?
仕様と照らし合わせたんだよね?

・誰がHogeクラスのインスタンスを破棄するか考える
・破棄者はHogeのメンバであるか、お友達であるかよく考えてみる

364 名前:デフォルトの名無しさん :02/04/27 16:49
>>362
コンストラクタがpublicだとどこからでもインスタンスが作れるので、
Singletonクラスとしてはダメな設計だろ

365 名前:デフォルトの名無しさん :02/04/27 16:52
age

366 名前:デフォルトの名無しさん :02/04/27 17:02
>>360
おかしくない。obj のコンストラクタは、Hoge::GetInstance() が最初に実行
された時に呼ばれるが、デストラクタは、プログラム終了の一部 (= Hoge の外側)
で呼ばれるため。

367 名前:デフォルトの名無しさん :02/04/27 17:03
僕は>>360が嫌いです。

「Effective C++の」とか言ってるくせに、実書のページすら書いてないところが嫌いです。
「仕様としては」とか言ってちょっと知ったかを気取ってみたりするところも嫌いです。
「他のコンパイラではどうなるのか、教えてください」とか言って自分で試さないのも嫌いです。
そして何より、「VC6のバグなら」「.NETでは直っている」とか言ってバグと決めつけているのが大嫌いです。

だから、僕はこのレスをつけてみようと思いました。


368 名前:デフォルトの名無しさん :02/04/27 17:04
>>366
答えを書いちゃうなよ。
この場合、>>363を見て本人に考えさせるべきだったんだ。

369 名前:デフォルトの名無しさん :02/04/27 17:12
>>367
なんだ、なんだ。なんか嫌なことでもあったのか ?

370 名前:デフォルトの名無しさん :02/04/27 17:14
>>366
この場合Hogeはstaticで定義されているから、GetInstanceを何度呼ぼうと
実体は一つしかないんだよね。

371 名前:デフォルトの名無しさん :02/04/27 17:15
>>367
なんで >>360 が「バグと決めつけている」と決め付けているのか
小一時間...。さらしあげとこ。

372 名前:デフォルトの名無しさん :02/04/27 17:20
>>370
そうだけど、今問題にしている箇所はそこではないよ。

373 名前:366 :02/04/27 17:25
>>370
細かい突っ込みで申し訳ないけど、意図してんのは obj のことだよね。
で、実体が一つしかないのは C と同じなんだけど、C++ はコンストラク
タと、デストラクタがあるからそのタイミングが問題と言うだよね。

個人的な意見としては、static で定義されているオブジェクトは、
main() 呼ぶ前に構築して、main() 終了後に破棄すると言う仕様の方が
わかりやすいと思う。もちろん、実際に使うオブジェクトだけ構築する
今の仕様の方が効率はいいと思うけど、ちょっとやりすぎな気がする。

374 名前:デフォルトの名無しさん :02/04/27 17:31
標準化団体のメンバーになって提案してくれば〜?

375 名前:366 :02/04/27 17:35
>>374
はは、流石に今からやっても余計混乱するだけだし、まああんまり困って
るわけじゃないからねぇ...。たわごとと思って聞き流してくれろ。

376 名前:360 :02/04/27 18:31
>ページ
改訂2版のEffective C++ では、241ページ以降に書いてあります。
項目47、「非ローカルスタティックオブジェクトは、使用前に必ず
初期化されるようにしよう」です。

>C++の仕様
俺が調べたのはARMの記述です。これに関しては手元に本がないのでちと記憶が
曖昧ですが、「デストラクタもほかのメンバ関数と同様に、明示的に呼び出すことも、
アクセス制限を加えることもできる」ってな感じのことが書かれてました。
ARMは仕様書じゃないって? そのとおりですな。すみません。「仕様」は
言いすぎでした。回線切って首をつるほどじゃないけど、反省します。

>誰がHogeクラスのインスタンスを破棄するか考える
>破棄者はHogeのメンバであるか、お友達であるかよく考えてみる
>>366でも答えは書いてありますけど、Modern C++ Design(和書のほう)の
143ページにも答えは書いてあります。詳細な擬似コードまで示して。
でも、そのModern C++ Design の141ページで、コンストラクタも
デストラクタもprivateで宣言されて、シングルトンを実装されてるんです。
で、この記述に沿って実装しようとしてエラーが出たから、なんでじゃー、
と思ったわけです。

……最初からModern C++ Design のことを書いときゃよかったっすね。

377 名前:デフォルトの名無しさん :02/04/27 18:38
>>376
>>366がおかしくないと言ったのは、あんたのコードがおかしくないじゃなくて、
エラーがおかしく無いという意味だろ。

Effective C++だとデストラクタはprivateで宣言されていない。

Modern C++ Designは持ってないから確認できないが、
そのSingletonはローカルstaticオブジェクトを返しているか?
newしてそのインスタンスを返してるんじゃないのか?

その場合は、破棄をしないか専用のdeleterを用意しているはず。

378 名前:デフォルトの名無しさん :02/04/27 18:40
推測でしかないんだが、おそらく、
Hoge& Hoge::GetInstance()
{
 static Hoge* pHoge = NULL;
 if (pHoge == NULL) {
  lock();
  if (pHoge == NULL) {
   pHoge = new Hoge;
  }
  unlock();
 }
 return *Hoge;
}

こんな感じじゃないのか?

379 名前:デフォルトの名無しさん :02/04/27 18:58
char *p,s[][256] = {"abc","bc","c","","abcde","**abc","\na bcl+","@ab","abc","cba"};
int i;
for(i = 1;i < 10;i++)
cout<<((p = strstr(s[i],s[0]))?p:'@')<<endl;


これ、どこかマズイでしょうか?
まずそうな個所を指摘してください。お願いしますね

380 名前:デフォルトの名無しさん :02/04/27 18:58
Modern C++ Design見てみた。
単純なstatic objectだし、確かにデストラクタをprivateにしてるし、
しかも利用者に勝手に開放させないためと本文にわざわざ明記してるので
コードの誤植とも考えにくいな。


381 名前:デフォルトの名無しさん :02/04/27 19:06
>>379
その質問は何のためにしているんだ?
エラーが出て解決できずに困っているのならそのエラーを書くこと。
動作が意図と違うのならどんな意図をしているのかを書くこと。
単にスタイルの問題を指摘ほしいのなら、そう書くこと。
宿題ならスレ違い。


382 名前:デフォルトの名無しさん :02/04/27 19:08
vc++ 6.0 NG
bcc 5.5.1 NG
gcc 2.95.3-4 OK
digital mars 8.26n OK

383 名前:デフォルトの名無しさん :02/04/27 19:08
'@'じゃないだろ。'@'じゃ。

10という決め打ちもいくない。


384 名前:デフォルトの名無しさん :02/04/27 19:09
こいつにModern C++は早すぎるんじゃねえか?

VC++はあまりMOdernじゃないから、そのままやってもうまくいかない場合があるぞ。


385 名前:379 :02/04/27 19:14
あ、すんませんです。
本当は自作のstrstrがstrings名前空間に入ってるんで
そのテストとしてやってたんですが
三項演算子の偽部分が「'char' 型は 'char *' 型に変換できない」
ていわれるんです。
何故でしょうか?

386 名前:デフォルトの名無しさん :02/04/27 19:16
charがchar*に変換できないから。

具体的には、3項演算子で (省略)p:'@'で、
pがchar*
'@'がchar
です。

"@"とかにしましょう

387 名前:デフォルトの名無しさん :02/04/27 19:17
エラーメッセージのままだよ。'@' の型を知ってるかい ?

388 名前:デフォルトの名無しさん :02/04/27 19:18
>>385
>>383ってことだな
三項演算子の真と偽は同じ型でなきゃいかんだけの話

389 名前:379 :02/04/27 19:19
三項演算子のオペランドって異なる型じゃだめだったのですか?
うーん知らなかった(._.;)

390 名前:デフォルトの名無しさん :02/04/27 19:21
みなさんありがとうございました
本を読み返してみます(._.;)

391 名前:デフォルトの名無しさん :02/04/27 19:22
何かに代入しなければコンパイルを通しちゃってもいいと思うが、決まりならしかたないよな。

392 名前:デフォルトの名無しさん :02/04/27 19:29
>>391
つーか、代入しないなら if() 使えよ。

>>388
ウソ書くなよ。double = xxx ? double : int; とかでも大丈夫だよ。
あくまでも、代入先の型と合わないと言っているだけで、真と偽の型が違
うから怒っている訳じゃねーぞ。

393 名前:360 :02/04/27 19:57
>>377
あ、>>366の意味はわかってます。けど、俺の書き方がまずかったですね。
誤解を招くような書き方でした。

>>382
ありがとうございます! やっぱりコンパイラ次第では通るんですね。
ところで、これを全部ひとりで確認されたってことは
全部インストールされてるってことですよね……。
俺も複数のコンパイラをインストールして、今度からは自分で確認
するようにします。

394 名前:デフォルトの名無しさん :02/04/27 20:28
>>393
いや、通っちまうのは変でしょ。そっちのほうがバグだと思うけど。
つか、Modern… の 6.3 と 6.4 は切り離して読んだほうがよい。
6.4 はあくまでも Meyers' Singleton に対するコメントでしょ。
6.3 (つまり筆者がやろうとしている方法) とは関係ない。

395 名前:360 :02/04/27 21:06
>>394
たしかにそう解釈もできますけど……。
けど、6.5のソース(145ページ)はどうします?
privateデストラクタと、Meyers' Singletonの両方を組み込んだ
ソースがばっちり載っちゃってるんですが。

396 名前:360 :02/04/27 21:22
>>394
たしかにそう解釈もできますけど……。
けど、6.5のソース(145ページ)はどうします?
privateデストラクタと、Meyers' Singletonの両方を組み込んだ
ソースがばっちり載っちゃってるんですが。

……というか、この問題に決着をつけるのは、『プログラミング言語C++』で
どう記述されているか、しかないと思います。
俺、持ってないんですよね。お金に余裕が出来たら買って読みますけど、
その前に、持ってる人おられましたら教えていただけませんか?
(なるべく、該当部分の記述をそのまま引用していただけたら嬉しいです)

397 名前:360 :02/04/27 21:32
うわちゃ、すみません。変な二重投稿になってしまいました。

398 名前:デフォルトの名無しさん :02/04/27 22:05
>>396
買わなくてもwebに資料あるぞ
http://joda.cis.temple.edu/~ingargio/refman.pdf


399 名前:デフォルトの名無しさん :02/04/28 00:35
>>392
if-elseを一行にすっきりとかけてなんかいい感じじゃん。

400 名前:デフォルトの名無しさん :02/04/28 00:55
確率のシミュレーションをC++でやっているのですが、演算結果をExcel等で処理したいんです。
ところがDos窓だと25行しかでないので、データのコピーができません。
ここで、スクロールバーが出せれば上のほうにさかのぼってコピーできるのですが・・・

CSV形式でファイルに出力という方法も考えたんですが、こっちは難しそうなので・・・

キーワードだけでもいいのでご存知の方教えてください。

401 名前:デフォルトの名無しさん :02/04/28 00:57
>>400
なんだかよくわからんが、>や>>をつかってファイルにリダイレクトする方法じゃだめなの?

402 名前:デフォルトの名無しさん :02/04/28 00:57
>>400
一番簡単なのはリダイレクト


403 名前:デフォルトの名無しさん :02/04/28 00:58
それでは、
ほげほげ(EXE名) >ほげほげ.csv[リターン]
と入力すればよろし


404 名前:400 :02/04/28 01:05
ちょっと初心者すぎてよく分からないです。

特に指定しない限り、出力はすべて画面に表示されます。
-o オプションを使うと、画面出力をページ単位で停止し、キー入力を待つことができます。
これはコマンド ラインを手入力する場合に便利です。
また、同じ -o オプションを使って、出力を無効化またはリダイレクトできます。

ってのがヘルプで出てきたんですが、どこにコマンドを入れるのかさっぱりです。
ちなみにC++と書きましたが、Visual C++ 6.0です。

405 名前:デフォルトの名無しさん :02/04/28 01:09
>>404
開発環境は関係ない。
コマンドの最後に >file.txt と打てば、file.txtという名前のファイルに(標準出力が)出力される。
追加書き込みの場合は>>で。

406 名前:405 :02/04/28 01:11
試しにdir >flist.txtと打ってみな。
現在のディレクトリの中にflist.txtというファイルができて、dirの出力結果が書き出されているはずだから。

407 名前:デフォルトの名無しさん :02/04/28 01:11
>>404
むきゃー!!
...みんなに内緒でおしえてあげる。
スタートメニューからDOSプロンプトを立ち上げて、
あなたのプロジェクトのDebugもしくはReleaseフォルダに移動します。
それであなたの
[プログラム名] > [出力ファイル名][ENTER]
だってばサ。


408 名前:デフォルトの名無しさん :02/04/28 01:13
>>405
>file.txtという名前のファイルに(標準出力が)出力される
標準出力が端末画面からファイルに切り替えられて、
file.txtという名前のファイルに出力される

409 名前:デフォルトの名無しさん :02/04/28 01:13
集団けこーん式場はここですか?

410 名前:デフォルトの名無しさん :02/04/28 01:15
>>408
むきゃー!!

411 名前:400 :02/04/28 01:21
なるほど、できました。
ありがとうございます。

追加になりますが、スクロールバーを出す方法とかはないんですか?

412 名前:デフォルトの名無しさん :02/04/28 01:24
Win2K使う。

413 名前:デフォルトの名無しさん :02/04/28 01:32
>>411
consize + cmd-reactos を使え。
http://www.neuro.gatech.edu/users/cwilson/cygutils/consize/
http://www.neuro.gatech.edu/users/cwilson/cygutils/cmd-reactos/

414 名前:デフォルトの名無しさん :02/04/28 01:34
lessを入れる

415 名前:400 :02/04/28 01:37
Win9x系だと面倒なんですね。
学校はWin2kだったから普通に出たのか。

この板ははじめて来たのですが、いい人がいっぱいいるようですね。
色々お世話になりました。

416 名前:デフォルトの名無しさん :02/04/28 01:43
いいひとだってサ。気持ちがよいね。

417 名前:デフォルトの名無しさん :02/04/28 01:43
(*´д`) てれるぜ

418 名前:デフォルトの名無しさん :02/04/28 02:00
おだてれば何でも応えてくれるスレってここですか?

419 名前:デフォルトの名無しさん :02/04/28 02:02
そうですよ。

420 名前:デフォルトの名無しさん :02/04/28 02:04
>>418
違う。答えられればなんでも答えるスレ。

421 名前:デフォルトの名無しさん :02/04/28 02:05
よし、今度はなんの質問だぁ〜?

422 名前:デフォルトの名無しさん :02/04/28 02:09
VCでboostのtokenizerを使いたいんですけど、
TCHARベースでうまく動かす方法はないですか?

char_traitsがMBCS対応してないので今は自分で作っちゃってますけど、
なんか納得行かないんです。


423 名前:デフォルトの名無しさん :02/04/28 02:28
正式対応していないようだが。
それよりboostをVCで使う意味がわからんのだが。
それなりのスキルを持ってるんだったら、
なっとくいく自作ライブラリを作ったほうがよいとおもうのだが。


424 名前:デフォルトの名無しさん :02/04/28 02:36
>>423
> それなりのスキルを持ってるんだったら、
> なっとくいく自作ライブラリを作ったほうがよいとおもうのだが。
Boost 並のクオリティのライブラリを書くのは「それなり」のスキルでは厳しいと
思う。あるモノは素直に利用しようよ。(ライセンスも緩いことだし)

425 名前:デフォルトの名無しさん :02/04/28 06:59
>>426-999
v(^・^)v

426 名前:デフォルトの名無しさん :02/04/28 10:08
>>425
v(^・^)v

427 名前:392 :02/04/28 11:19
>>399
書きやすいかも知れんが、読みにくくなるからヤダ。

428 名前:デフォルトの名無しさん :02/04/28 12:08
>>427
Lispに比べれば・・・比べちゃいかんのかもしんないけど。

429 名前:デフォルトの名無しさん :02/04/28 14:04
>>428
LISP も、慣れれば特に読みにくくないぞ。まあ、括弧が多くてウザイから、
きちんとインデントしてないとつらいけどね。

でも、C/C++ でも
if(x == 0){ int y; y = x + 1; if(y == 0){ int z; x = y + 1; printf...
なんて書いてあったら、萎えるよ。要は、きちんとインデントして普通に書けって
ことだよ。

430 名前:デフォルトの名無しさん :02/04/28 14:08
)))))))))))))))))))))))))) <- これ、ダサい(LISP)

431 名前:デフォルトの名無しさん :02/04/28 16:01
>>430
}}}}}}}} <-これ、ダサい(C++)

いや、マジでいたんだよ、びびった。

432 名前:デフォルトの名無しさん :02/04/28 16:21
>>431
見てみたいYO!

433 名前:デフォルトの名無しさん :02/04/28 20:44
C++標準ライブラリ チュートリアル&リファレンスってのを読んでいるんですが、
4章に出てくる auto_ptr_ref ってどう役立っているのですか?
動きが(゚д゚)サパーリです。。。

434 名前:デフォルトの名無しさん :02/04/29 03:40
例えば何ですが、

int a[][][]....[];

のような配列の次元数をダイナミックに扱う
方法ってあります?

435 名前:デフォルトの名無しさん :02/04/29 03:43
int***....* a;

436 名前:435 :02/04/29 03:47
    (゚д゚)  カンチガイダッタ!
   ~(  )−
    / >

437 名前:デフォルトの名無しさん :02/04/29 03:49
漏れは434じゃないけど、便乗。
二次元以上の配列の動的確保ってどうやんの?

438 名前:デフォルトの名無しさん :02/04/29 03:52
二次元ができてそれ以上ができない理由はなんでしょう。

439 名前:438 :02/04/29 03:54
    (゚д゚)  二次元「以上」か・・・ゴミン。
   ~(  )−
    / >

440 名前:デフォルトの名無しさん :02/04/29 03:55
ごめん
一次元以上

441 名前:デフォルトの名無しさん :02/04/29 04:03
int (*p)[10] = new int[10][10];
こういうのとかではなく?

442 名前:434 :02/04/29 04:14
言葉が足りませんでした

int a[][];→int a[][][];

と実行時に、配列の次元数を変えたいのです
やっぱ無理かな?

443 名前:デフォルトの名無しさん :02/04/29 06:15
そういうクラスを作ってあげるのがいいと思うYO!

444 名前:デフォルトの名無しさん :02/04/29 07:02
>>437
このスレの >>175 ぐらいから嫁。

445 名前:デフォルトの名無しさん :02/04/29 07:09
>>443
そうね。正道。

>>442
個人的には、operator[]に拘らなくていいなら
class Dims {
public:
int iSize;
vector<Dims *> Next;
Dims(int size) { iSize = size; Next.resize(iSize); }
};
で配列の実体確保は、Dims.iSizeの積で求めて、new int[]する
のようなのは思い付くけど、それじゃあだめなんだよね...


446 名前:515 :02/04/29 07:30
>>445
operator[] に拘るのはちょっと難しいかと...。次元が可変なんだから
コードの書きようがないと思う。

>>442
つーか、どういう使い方するんだ ? 単にできるかどうかが問題なの ?

447 名前:デフォルトの名無しさん :02/04/29 08:59
可能かといえば可能だけど、クラスを作るしかないです。
そういう基本的な文法では対応してないです。

でもこういう場合、「設計直せ」の方がいいと思う。

448 名前:初心者 :02/04/29 09:18
初めまして。初心者なのですが分からないことがあるのですが、
教えてもらえますか?スピンコントロール2個を連動させるという
設定をしようと思っているのですが、どうもうまくいきません。
合計の最大値が決まっていて最大値から片方のスピンの値をマイナスした
値がもう一方のスピンの最大値になる、という形を作りたいんです。
今のところ下記のようなコードを書いたのですが、なぜかエラーが・・・
どこか間違っている所などあったら教えてください。
BOOL CDialog2::OnInitDialog()
{
CSpinButtonCtrl* pSB1 = (CSpinButtonCtrl*) GetDlgItem(IDC_SPIN1);
CSpinButtonCtrl* pSB2 = (CSpinButtonCtrl*) GetDlgItem(IDC_SPIN2);
pSB1->SetRange(0,40);
pSB2->SetRange(0,40);
return FALSE;
}

void CDialog2::OnKillfocusEdit1()
{
max1 = GetDlgItemInt(IDC_EDIT1,NULL,FALSE);
mm_max2 = 40-max1;
pSB2 -> SetRange(0,mm_max2);//ここで問題が起きてるみたい・・
}
void CDialog2::OnKillfocusEdit2()
{
max2 = GetDlgItemInt(IDC_EDIT2,NULL,FALSE);
mm_max1 = 40-max2;
pSB1 -> SetRange(0,mm_max1);
}
長くなってしまってすいません・・・よろしくお願いします。

449 名前:デフォルトの名無しさん :02/04/29 09:22
すれ違い

450 名前:デフォルトの名無しさん :02/04/29 09:27
>>449
なんですか、あなたは
答える気がないなら黙っていてください。

451 名前:デフォルトの名無しさん :02/04/29 10:19
エージ

452 名前:デフォルトの名無しさん :02/04/29 10:42
>>450
なんですか、あなたは
マナーを守れないなら黙っていてください。

453 名前:初心者 :02/04/29 10:45
すいません・・・書く場所間違えたのかな?ごめんなさい。

454 名前:デフォルトの名無しさん :02/04/29 10:48
>>453
■ VisualC++(MFC限定)相談室 3■
http://pc.2ch.net/test/read.cgi/tech/1014057520/


455 名前:初心者 :02/04/29 10:55
おお!ありがとうございます。早速!!
皆さん失礼しました。

456 名前:初心な人 :02/04/29 15:37
関数が別のファイルに定義されていたらextern func();ですよね。
クラスが別のファイルに定義されているときはどう書くんでしょ
う?extern class aa;と書いたらおこられちゃった。


457 名前:デフォルトの名無しさん :02/04/29 15:41
externて書かなきゃいい

458 名前:デフォルトの名無しさん :02/04/29 15:42
http://www2.airnet.ne.jp/pak04955/ramble-199912.htm

>ポインタ変数の大きさはintの大きさと同じではない。現状sizeof(int) = 4, sizeof(void*) = 4の環境が多いが,64bit環境ではsizeof(int) = 4, sizeof(void*) = 8となる場合がある。

459 名前:デフォルトの名無しさん :02/04/29 15:43
うぁっ、誤爆

460 名前:デフォルトの名無しさん :02/04/29 16:28
Go back!!!


461 名前:デフォルトの名無しさん :02/04/29 17:03
>>456
普通、クラスの定義はヘッダーファイルに書いて、使う側とインプリメン
トする側で同じヘッダーファイルを読み込む。

--- aa.h ---
class aa {
private:
...
public:
aa();
~aa();
};

-- aa.cpp --
#include "aa.h"
aa::aa()
{
...
}

aa::~aa()
{
...
}

-- file.cpp --
#include "aa.h"

void foo()
{
a aa;
...
}

と言う感じ。(ANSI-C なら、関数プロトタイプでも同じようにやると思う
けど...。)

462 名前:初心な人 :02/04/29 17:37
ありがとう>461
必ずヘッダーファイルを別にしておくのね。


463 名前:デフォルトの名無しさん :02/04/29 21:43
ほのぼの

464 名前:A子 :02/04/30 00:24
ageてもいい?ねえageてもいいの?

465 名前:デフォルトの名無しさん :02/04/30 00:29
C++なのかCなのか分からないけど、
関数のdefineの方法が本読んでもよく分からないんです。
誰かおせーてください。

466 名前:デフォルトの名無しさん :02/04/30 00:30
C/C++のプリプロセッサのdefinedですか?
Perlにはdefineっていう関数だか演算子ががあったけど

467 名前:デフォルトの名無しさん :02/04/30 00:31
>>465
define?
#defineのこと?

468 名前:デフォルトの名無しさん :02/04/30 00:32
だとしたら関数も何も違いは無い気がする。

469 名前:465 :02/04/30 00:33
>>466,467
#defineのことです。

470 名前:デフォルトの名無しさん :02/04/30 00:34
>>469
関数に#defineは使わないと思うけど…
何したいの?

471 名前:デフォルトの名無しさん :02/04/30 00:42
引数付きのマクロと見た

472 名前:デフォルトの名無しさん :02/04/30 00:42
>>465
漢ならdefineの代わりにinlineとconstをできるだけ使え。

473 名前:デフォルトの名無しさん :02/04/30 00:49
templateも使用すると吉

474 名前:465 :02/04/30 00:54
間違えちゃった。
#defineじゃなくてtypedefでした。
スマソ

475 名前:デフォルトの名無しさん :02/04/30 00:56
inlineはDebugとReleaseでは速度が10倍とか20倍とか違うんで困
る場合も結構あるんだよなぁ。普段はReleaseでビルドしてとめた
い時だけDebugってやってるけどちょっと面倒。

476 名前:デフォルトの名無しさん :02/04/30 00:56
>>474
typedef 新しい型名 既存の型名

typedef UINT unsigned int;
これでUINTはunsigned intと同じものに。

477 名前:デフォルトの名無しさん :02/04/30 00:57
>>476 関数の話らしい

478 名前:デフォルトの名無しさん :02/04/30 00:58
typedef 戻り値 (*名前)(引数)
だっけ。
忘れた。

479 名前:476 :02/04/30 00:58
関数のtypedef?(-_-;)
関数へのポインタをtypedefするのだろうか・・・・

480 名前:デフォルトの名無しさん :02/04/30 00:59
typedefはテンプレートに使えなくて困る場合も結構あるんだよなぁ。
template <typename T>
struct my_vector {
std::vector<T, my_allocator<T> > t;
};
とかやってるけど、やっぱ面倒だよ。
# と、愚痴ってみる。

481 名前:デフォルトの名無しさん :02/04/30 01:00
>>476
逆だろ
typedef unsigned int Uint;

482 名前:デフォルトの名無しさん :02/04/30 01:01
>>481
Oops!
そうだった・・

483 名前:デフォルトの名無しさん :02/04/30 01:02
間違えるかそんなこと・・・。
# ちょっと482には仕事たのめないな。(藁

484 名前:デフォルトの名無しさん :02/04/30 01:04
>>483
typedefなんて使わないし・・・
分かりにくくなるから。
typedef struct{}←これ嫌い。

485 名前:デフォルトの名無しさん :02/04/30 01:06
>>465
単に関数の宣言書いて、前にtypedefつければよろし。
ポインタとして宣言するなら>>478

486 名前:デフォルトの名無しさん :02/04/30 01:07
>分かりにくくなるから。

そんなことは無いだろ。
分かりやすくする為にあるんだぞ。

487 名前:デフォルトの名無しさん :02/04/30 01:09
>>486
型が増えると分かりにくくなる。漏れ馬鹿だから。
せめて構造体はtypedefしないでほしいな。

488 名前:465 :02/04/30 01:10
int KANSU( char* a ){
}

の場合、typedef int* BETSUMEI( char* a )ってこと?

489 名前:デフォルトの名無しさん :02/04/30 01:11
>>488
お前もういっぺん478嫁

490 名前:デフォルトの名無しさん :02/04/30 01:12
>>488
それだとint型へのポインターを返す関数になってしまう。
int (* BETSUMEI)(char *a)とやらないと。

491 名前:デフォルトの名無しさん :02/04/30 01:13
慌てないーで お嫁サンバ〜

492 名前:デフォルトの名無しさん :02/04/30 01:15
>>486
ライブラリ内で規約を設ければ解かり易くもなるが、
アプリ側ではタイプ数減らすために使うほうが多いだろうな。


493 名前:デフォルトの名無しさん :02/04/30 01:16
スマートポインタなんかのテンプレートクラスはtypedef使わないとちょっとやってらんないな。

494 名前:デフォルトの名無しさん :02/04/30 01:18
漏れは>>488のおかげで、
括弧を付ける理由が今わかった。

495 名前:デフォルトの名無しさん :02/04/30 01:19
494にも仕事はやれん。(藁

496 名前:デフォルトの名無しさん :02/04/30 01:23
>>495
演算子の優先順位表を頭に焼き付けてきました。
仕事ください。

497 名前:494 :02/04/30 01:25
>>495
>>496
漏れは無職だよ。

498 名前:デフォルトの名無しさん :02/04/30 01:27
おまいら、仕事欲しいならJavaスレに行った方がよいぞ。

499 名前:デフォルトの名無しさん :02/04/30 01:28
>>498
現在就職活動真っ最中でして・・・・
内定ください。

500 名前:デフォルトの名無しさん :02/04/30 01:33
今日は朝6時ごろからずっと起きてるから
なんか神が降りてきた・・・・


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