ページ 11

仮想関数の宣言

Posted: 2010年7月24日(土) 10:35
by よつどもえ
(この記事は管理人が復元しました)

#include<iostream>
using namespace std;

class Musician{
public:
virtual void play(); //仮想関数
int experience(); //非仮想関数
virtual int practice(int how_long); //仮想関数
};

class BrassMusician:public Musician{
public:
//play()は宣言されない、Musicianバージョンを継承する
};
class Trumpeter:public BrassMusician{
public:
virtual void play(); //play()は再宣言される、そのため上書き使用をしなければならない
}; //再宣言のvirtualは任意

void Trumpeter::play() {/*・・・*/} //これを宣言したため、定義しなければならない

class Musician{
public:
virtual void setVolume(int value);
};
class Trumpeter:public Musician{
public:
void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
};

int main(){
Musician *pm=new Trumpeter;
pm->setVolume(5); //問題:pmはTrumpeterインスタンスを指しているが、Musician::setVolume()を起動
delete pm;
}

プログラミングの授業でこのプログラムを通そうとしたのですが、
次のようなコンパイルエラーが出ました。
Musician : class 型の再定義
Musician の宣言を確認してください。
Trumpeter : class 型の再定義
Trumpeter の宣言を確認してください。
認識できない型 Trumpeter が使われています。
直前のエラーを修復できません。コンパイルを中止します。

ある程度できているソースコードに手を加えてプログラムを完成させるという
授業なのですが、これらのコンパイルエラーがわかりません。
どなたか解答お願いします。

Re:仮想関数の宣言

Posted: 2010年7月24日(土) 10:43
by Poco
Musicianというクラスが2つ定義されてますよ。
一つにまとめることはできないのですか?

Re:仮想関数の宣言

Posted: 2010年7月24日(土) 15:56
by よつどもえ
ありがとうございます。
自分でも少しいじってエラーはほとんどなくなりましたが、

#include<iostream>
using namespace std;

class Musician{
public:
virtual void play(); //仮想関数
int experience(); //非仮想関数
virtual int practice(int how_long); //仮想関数
virtual void setVolume(int value);
};

class BrassMusician:public Musician{
public:
//play()は宣言されない、Musicianバージョンを継承する
};
class Trumpeter:public BrassMusician{
public:
virtual void play(); //play()は再宣言される、そのため上書き使用をしなければならない
}; //再宣言の"virtual"は任意

void Trumpeter::play() {/*・・・*/} //これを宣言したため、定義しなければならない

public:
void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている

/*class Trumpeter:public Musician{
public:
void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
};*/

int main(){
Musician *pm=new Trumpeter;
pm->setVolume(5); //問題:pmはTrumpeterインスタンスを指しているが、Musician::setVolume()を起動
delete pm;
}

こう直した時に下のpublicの構文エラーが出ます。
public:
void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
どうすれば直るでしょうか?
教えてください。

Re:仮想関数の宣言

Posted: 2010年7月24日(土) 16:05
by Poco
> こう直した時に下のpublicの構文エラーが出ます。
> public:
> void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
> どうすれば直るでしょうか?

仮引数名にlongは使用できません(C++のキーワードなので)。
Musicianクラスと同じvalueにしてはどうですか?

Re:仮想関数の宣言

Posted: 2010年7月24日(土) 16:42
by よつどもえ
中をvalueに変えてもpublic:の構文エラーが出てしまいます。

Re:仮想関数の宣言

Posted: 2010年7月24日(土) 16:57
by Poco
> こう直した時に下のpublicの構文エラーが出ます。
> public:
> void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
> どうすれば直るでしょうか?

クラスTrumpeterの定義の中に入れてください。

class Trumpeter:public BrassMusician{
/*ここに入れる*/
};

Re:仮想関数の宣言

Posted: 2010年7月24日(土) 20:12
by よつどもえ
すいません、返事が遅れました。

ありがとうございました。
Trumpererのクラス定義に入れたらエラーがなくなりました。

Re:仮想関数の宣言

Posted: 2010年7月24日(土) 21:39
by よつどもえ
。。