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