09/01/09 20:13:56
>>1 乙です
前スレが終わってしまったのでもう一度貼ります
997 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/09(金) 19:53:52
失礼します
コンストラクタについての質問なのですが
C → B → A の順で自身のコンストラクタを呼び出すことは可能でしょうか?
可能であればどのように書けばよいか教えてください
下の例は簡略化しているので全パターン書いても大したことはないですが
実際のものはもう少し引数が増えます
class hoge
{
int m_foo, m_bar;
public:
hoge(int foo, int bar) : m_foo(foo), m_bar(bar){} // A
hoge(int foo) : hoge(foo, 100-foo){} // B
hoge(void) : hoge(rand()){} // C
};
※これはコンパイルエラーになります
3:デフォルトの名無しさん
09/01/09 20:21:17
C++0x ではできるようになるんだった気がするが、今は無理。
初期化用の関数を作るといいよ。
4:デフォルトの名無しさん
09/01/09 20:49:00
そのパターンだけだったらこれで行ける
hoge(int foo = rand(), int bar = 100 - foo) : m_foo(foo), m_bar(bar){}
5:デフォルトの名無しさん
09/01/09 20:54:17
>>3
無理なのですね
分かりました。ありがとうございます
ということは、代替手段としては
次のようにするしかないということですね
class hoge
{
int m_foo, m_bar;
void init(int foo, int bar) { m_foo=foo; m_bar=bar; }
void init(int foo) { init(foo, 100-foo); }
void init(void) { init(rand()%101); }
public:
hoge(int foo, int bar) { init(foo, bar); } // A
hoge(int foo) { init(foo); } // B
hoge(void) { init(); } // C
};
6:デフォルトの名無しさん
09/01/09 20:58:21
まあ大体そうだな
わざわざinitをオーバーロードする必要はないと思うけど
7:デフォルトの名無しさん
09/01/09 20:58:46
>>4
コンパイルエラーになりました
g++ -c -o hoge.o hoge.cpp
hoge.cpp:7: error: `foo' was not declared in this scope
make: *** [hoge.o] Error 1
コンパイラのバージョンはこれです
g++ (GCC) 3.4.5 (mingw special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8:7
09/01/09 21:00:29
ソースファイル忘れてました
#include<cstdlib>
class hoge
{
int m_foo, m_bar;
public:
hoge(int foo = rand(), int bar = 100 - foo) : m_foo(foo), m_bar(bar){}
};
9:デフォルトの名無しさん
09/01/09 21:04:32
あれ?本当だそこでfoo見えてないのか
知らんかった
10:デフォルトの名無しさん
09/01/09 21:10:54
引数はデフォルト引数にはできんぞ
11:デフォルトの名無しさん
09/01/09 21:20:11
もうひとつ質問です
下側のクラス hoge の三番目のコンストラクタを実現する方法はありますか?
あるとすれば、どのように書けばいいのでしょうか?
#include<cstdlib>
class base // このクラスは変更できないものとする
{
int m_foo, m_bar;
public:
base(int foo, int bar) : m_foo(foo), m_bar(bar) {}
};
class hoge : public base
{
public:
hoge(int foo, int bar) : base(foo, bar) {}
hoge(int foo) : base(foo, 100-foo) {}
hoge() : base(int tmp=rand()%101, 100-tmp) {} // このコンストラクタはどのように書けばよいですか?
};
12:デフォルトの名無しさん
09/01/09 21:24:16
この場合は
hoge(int foo = rand() % 101) : base(foo, 100 - foo) { }
でいいと思う。
13:デフォルトの名無しさん
09/01/09 21:28:20
>>12
できました
ありがとうございます
14:デフォルトの名無しさん
09/01/09 22:20:08
私にc++の極意を教えてください
15:デフォルトの名無しさん
09/01/09 22:29:11
__stdcall
16:デフォルトの名無しさん
09/01/09 22:32:26
おぉ
17:デフォルトの名無しさん
09/01/09 22:54:18
(int*)p->num;
(int*)(p->num);
((int*)p)->num);
これは全部同じですか?
if( a==b && a==c)
if( (a==b) && (a==c) )
これも同じですか?
18:デフォルトの名無しさん
09/01/09 22:56:29
>>17
はい全部同じです
優先順位ぐらい自分で調べましょう
19:デフォルトの名無しさん
09/01/09 22:57:44
>>18
おいw
違うじゃねぇかw
20:デフォルトの名無しさん
09/01/09 22:59:26
>>18
ちげぇwwwwwwwwwwwwww w
21:デフォルトの名無しさん
09/01/09 23:06:22
>>18
違うwwwww
3行目は明らかにエラーだろwwwwww
22:デフォルトの名無しさん
09/01/09 23:41:18
>>18
>>18
>>18
23:デフォルトの名無しさん
09/01/10 00:26:00
18の2行目と3行目が逆だったら理解できるのだが……。
24:デフォルトの名無しさん
09/01/10 00:33:24
そもそも括弧のネスト壊れてるし
25:デフォルトの名無しさん
09/01/10 01:01:57
strcmpの文字列比較の結果が0,1,-1以外の時ってありますか??
26:デフォルトの名無しさん
09/01/10 01:05:04
新スレ早々ワロタw
27:デフォルトの名無しさん
09/01/10 01:06:42
>>25
strcmp の戻り値は 正数 か ゼロ か 負数 かのいずれかなので
1 とか -1 であることは保証されてないです
28:デフォルトの名無しさん
09/01/10 01:06:54
そもそもに、0,1,-1ではなく、0,正,負を返すとしか定義されてない?
29:デフォルトの名無しさん
09/01/10 01:07:16
かぶった
30:デフォルトの名無しさん
09/01/10 01:09:21
>>25
規格では無いよ。
31:デフォルトの名無しさん
09/01/10 01:35:15
>>30 0,1,-1 しか無いとは書いて無いよ。
32:デフォルトの名無しさん
09/01/10 02:04:23
最近新しい出会いがありません。
もっと勉強しなくてはと思わせるようなアルゴリズムを紹介してください。
33:デフォルトの名無しさん
09/01/10 02:05:27
エラー訂正符号とか勉強すると面白いよ
34:デフォルトの名無しさん
09/01/10 02:08:26
>>32
動画圧縮とか
35:デフォルトの名無しさん
09/01/10 02:19:24
complex<double> x[num];
これどうやって宣言するんですか?
numを変数にしたいんです
36:デフォルトの名無しさん
09/01/10 02:21:30
>>35
そのままでおk
37:デフォルトの名無しさん
09/01/10 02:32:12
>>36
寝言は寝て言え。
>>35
std::vector< std::complex<double> > x(num);
38:36
09/01/10 02:43:37
num を変数にするっていうのは
後でサイズを変えたいと言う意味か!
39:デフォルトの名無しさん
09/01/10 03:21:28
>>38
寝言は寝て言え。
40:デフォルトの名無しさん
09/01/10 03:30:50
>>39
コンパイルできるでしょ?
#include<complex>
int main(void){
int num=5;
std::complex<double> x[num];
x[0].real()=0.0;
x[0].imag()=1.0;
return 0;
}
41:デフォルトの名無しさん
09/01/10 09:12:02
fgetsは処理ごとにメモリが動くので、一様な使い方ができません。
どのように切り抜けるか知っていますか。下記例。
#include<stdio.h>
int main(){
FILE *fp;
char a[256];
char *b[4];
char *c,*d;
int i;
if((fp=fopen("address.dat","r"))==NULL)exit(1);
c=fgets(a,256,fp);
printf("%s",c);
d=fgets(a,256,fp);
printf("%s",d);
fclose(fp);
}
これを
c=fgets(a,256,fp);
d=fgets(a,256,fp);
printf("%s",d);
printf("%s",c);
のような順序にすると同じ値が出てしまいます。(1行目が消えて、ファイルの2行目の出力になる)
42:デフォルトの名無しさん
09/01/10 10:10:45
釣られないぞ
43:デフォルトの名無しさん
09/01/10 10:20:14
>>40
C99に対応したコンパイラならできるかもね
44:デフォルトの名無しさん
09/01/10 10:23:57
>>43
C99 ならテンプレートが使える?!
45:デフォルトの名無しさん
09/01/10 10:27:06
いやC99の仕様も取り込んだC++コンパイラ
46:デフォルトの名無しさん
09/01/10 11:24:56
g++ならできるよ