(この記事は管理人が復元しました)
#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:仮想関数の宣言
ありがとうございます。
自分でも少しいじってエラーはほとんどなくなりましたが、
#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()を上書きしたいが、パラメータの型が違っている
どうすれば直るでしょうか?
教えてください。
自分でも少しいじってエラーはほとんどなくなりましたが、
#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:仮想関数の宣言
> こう直した時に下のpublicの構文エラーが出ます。
> public:
> void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
> どうすれば直るでしょうか?
仮引数名にlongは使用できません(C++のキーワードなので)。
Musicianクラスと同じvalueにしてはどうですか?
> public:
> void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
> どうすれば直るでしょうか?
仮引数名にlongは使用できません(C++のキーワードなので)。
Musicianクラスと同じvalueにしてはどうですか?
Re:仮想関数の宣言
> こう直した時に下のpublicの構文エラーが出ます。
> public:
> void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
> どうすれば直るでしょうか?
クラスTrumpeterの定義の中に入れてください。
class Trumpeter:public BrassMusician{
/*ここに入れる*/
};
> public:
> void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
> どうすれば直るでしょうか?
クラスTrumpeterの定義の中に入れてください。
class Trumpeter:public BrassMusician{
/*ここに入れる*/
};