現在C++を勉強しているのですが、教えてください。
サブクラス作成時のエラーなのです。
長いですがソース見てください。
勝手にインデントが無くなるので見にくいですが…。
#include <iostream>
#include <string>
using namespace std;
class Hito{
private:
string Name;
public:
Hito(string); //コンストラクタ
void SelfIntro(); //自己紹介する
};
//Hitoのコンストラクタ
Hito::Hito(string str){
Name = str;
}
//自己紹介するメソッド
void Hito::SelfIntro(){
cout << "私は、" << Name << " です。" << endl;
}
class Syusyo: public Hito{
private:
int Ninki;
public:
Syusyo(string,int);
void SayNinki();
};
//Syusyoのコンストラクタ
Syusyo::Syusyo(string str, int year){
Hito(str);
Ninki = year;
}
void Syusyo::SayNinki(){
cout << "私の任期は" << Ninki << "年です。" << endl;
}
int main(){
string str = "小泉アホの助";
int year = 5;
Syusyo hito1(str,year);
hito1.SelfIntro();
hito1.SayNinki();
return 0;
}
HitoクラスからSyusyoクラスを作っています。
そのSyusyoクラスのコンストラクタでエラーが出るのです。
内容は、
「デフォルトコンストラクタがありません。」
と言うものです。
参考書通りに
Syusyo::Syusyo(string str, int year):Hito(str),Ninki(year){}
とすればエラーにはなりません。
なぜ前出の文だとエラーになり、後出の文は大丈夫なのでしょうか?
文の表現が違うだけだと思うのですが…。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
コンストラクタを関数として呼び出したのでは駄目です。
> Syusyo::Syusyo(string str, int year){
> Hito(str);
> Ninki = year;
> }
は
< Syusyo::Syusyo(string str, int year):Hito(),Ninki(){
< Hito(str);
< Ninki = year;
< }
と同じです。
なるほど、確かにコンストラクタを関数として呼び出している文と同じですね。
こういう形にすればダメって事ですね。
回答ありがとうございます。
No.4
- 回答日時:
> 文の表現が違うだけだと思うのですが…。
処理内容の表現ではなく、文法上の構文が違います。
> 参考書通りに書けばエラーにならないのは分かっていますが、
> 「…:Hito(str)…」のように ":" を使いたくないのです。
":"を使うのが、C++の初期化の文法です。
プログラミング言語の場合、文法に違反したソースはエラーになるのが普通です。
言語の文法に従いたくない理由は、なぜですか。
コンパイルを成功させたくないということですか。
> ":"を使わないで基底クラスのコンストラクタを実行させることは出来ないのでしょうか?
無理でしょう。
"自分のインスタンスの"基底クラスのコンストラクタを呼ぶのは、":"を使った文法になります。
それ以外の手順は…ハックですね。(むりやりdefineから別の手段まで
基底クラスのprivate以外のメンバ関数を呼び出すことはできますので、
setterを基底クラスに用意すればstrの代入はできますが、
初期化での自分のインスタンスに対する基底クラスのコンストラクタ呼び出しはできません。(初期化と代入は別のものです)
# 十中八九意図と違うでしょうが、他のインスタンスであれば、
# コンストラクタの中で、基底クラスの変数を作るだけで
# "基底クラスのコンストラクタが実行"されます。ただの言葉遊びですが。
No.5
- 回答日時:
C++では、断りがない限り、派生クラスのコンストラクタは、自分自身を実行する*前*に、基底クラスの、デフォルトコンストラクタを呼び出します。
これは、「引数のない」コンストラクタのことです。
ですから、この場合は、
Hito::Hito() というコンストラクタが必要です。
たとえば、
Hito::Hito() { name = ""; }
があれば、
//Syusyoのコンストラクタ
Syusyo::Syusyo(string str, int year){
name = str;
Ninki = year;
}
は可能です。
※つまり、名前無しで生成したインスタンスは無名にする。というのあれば、後で名前をつけることができる。
さらに、
Syusyo::Syusyo()
の中で、
Hito(str);
というのは、やめた方がいいでしょう。
これは、この場所で、(既に Hito クラスとしては構築が終わっているので)Hito() を構築できないためです。
今回の場合、Hito() クラスには、string を引数とするコンストラクタしかないために、基底クラスの構築のために、Hito() クラスに string を(Syusho クラスの構築に入る前に)渡す必要があるのです。
あと、メンバ変数に対しても、
Ninki(year) とするのと、コンストラクタの中で、
Niki = year; とするのは、少し違います。
前者は、初期化 後者は、代入です。調べてみるとおもしろいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++,ある関数のクラスから別の...
-
クラス間でのデータ参照
-
内部クラスのインスタンスを外...
-
Java リフレクションについて
-
リフレクション
-
Java
-
java-別クラスの変数の使い方を...
-
関数内の変数に<summary>コメン...
-
整数値を任意のオブジェクトを...
-
リレーションエンティティクラ...
-
RPGの主人公、町人、敵キャラの...
-
Javaアプリケーションについて
-
違うクラスからの変数の共有化
-
二つの変数の値を入れ替えるメ...
-
C# log4netの使い方
-
エクセルVBAで、条件に一致する...
-
3年間同じクラスになる確率
-
インスタンス参照でアクセスで...
-
ワイルドカード<?>と型パラメー...
-
「天声人語」をインターネット...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
SwingでgetContentPaneのエラー...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報