データメンバの初期化に引数なしコンストラクタと引数付きコンストラクタを多重定義 したプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
norisuke825
記事: 2
登録日時: 5年前

データメンバの初期化に引数なしコンストラクタと引数付きコンストラクタを多重定義 したプログラム

#1

投稿記事 by norisuke825 » 5年前

データメンバの初期化に引数なしコンストラクタと引数付きコンストラクタを多重定義
したプログラムを作りたい
ソースコードは

コード:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

using namespace std;

class Friend {
	const char *name[30];
	int age;
	const char *taste[256];

	public:
		Friend();
		Friend(const char *,int a,const char *);
		~Friend()
		{

		}
		void show();

};

Friend::Friend() {
	name[30] = "0";
	age = -1;
	taste[256] = "no taste\0";
}

Friend::Friend(const char *n, int a,const  char *b) {

	name[30] = n;
	age = a;
	taste[256] = b;
}

void Friend::show() {
	
	cout << "名前は" <<  name << "年齢は" << age << "趣味は" << taste << endl;
}

int main() {

	Friend fr1;
	
	fr1.show();
	Friend fr2("yamada\0",20,"pc\0");
	fr2.show();

	system("pause");
	return 0;

}
で実行するとcoutの部分のname,tasteがアドレスで表示されてしまうのでそれを文字列で出力するにはどうすればよいのでしょうか?*name,*tasteも試しましたが"0x0F5BD6F0 (ucrtbased.dll) で例外がスローされました "とエラーが出てしまいます

maru
記事: 150
登録日時: 13年前

Re: データメンバの初期化に引数なしコンストラクタと引数付きコンストラクタを多重定義 したプログラム

#2

投稿記事 by maru » 5年前

name tasteの定義を間違えているのではないでしょうか?
const char* xxx[n]は定数文字列(定数文字へのポインタ)の配列です。
必要なのは定数文字列なのではないでしょうか?
それならば、
const char xxx[];// 定数文字配列
または
const char* pxxx;// 定数文字へのポインタ
とすべきです。

xxxは「定数」文字配列なので書き換えを行うことはできません。つまり、コンストラクタで変更できません。定義を行うときに初期化できるだけです。コンストラクタで変更するにはconstをつけてはいけません。
pxxxはポインタなので書き換えができますが、ポインタが示す先は「定数」なので、*pxxxが変更されることは許されません。コンストラクタでpxxxを引数の値を使用して変更できますが、ポインタが示す先は「定数」と仮定しているのでクラスオブジェクト(およびそのオブジェクトのコピー)が存在している間はそのオブジェクトを構築時に使用した変数を保持する必要があります。


maru
記事: 150
登録日時: 13年前

Re: データメンバの初期化に引数なしコンストラクタと引数付きコンストラクタを多重定義 したプログラム

#4

投稿記事 by maru » 5年前

norisuke825 さんが書きました:
5年前
解決しました。ありがとうございます。
とのことですが、どのように解決したか出せませんか?
単にコンパイルが通っただけ、または実行できた、としても問題が表面に出ていないだけで、プログラムとして正しくない(バグが残っている)場合もあります。

返信

“C言語何でも質問掲示板” へ戻る