メンバ変数の値が書き換えられてしまう

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

メンバ変数の値が書き換えられてしまう

#1

投稿記事 by Iseuma14 » 9年前

書籍版ロベールのC++でアップキャスト、オーバーライドを使う練習をしていたのですが、
Streamの派生クラスのArrayStreamクラスのメンバ変数m_nが書き換わってしまい、うまく結果が出せません
デバッガを使ってみてみるとどうもStreamクラスから引っ張ってきている純粋仮想関数Set()の挙動がおかしいようで、
ArrayStram::Set()を呼び出して、値が変わった後関数を出ると値がおかしなことになります。
以下コードです ちなみに環境はVC++ 2010です

コード:

//main.cpp
#include "array.h"
#include "input.h"
#include <iostream>
using namespace std;

bool Average(Stream& stream)
{
	int count;
	double avr = 0;
	for(count = 0;stream.Set();count++)
	{
		avr += stream.Get();
	}
	if(count == 0)
		return false;

	avr /= count;
	cout<<"平均値 "<<avr<<endl;
	return true;
}

int main()
{
	InputStream istream;
	Average(istream);
	static const double Array[] = {0.5,1.5,-1};
	ArrayStream Astream(Array);
	Average(Astream);
	return 0;
}

コード:

//stream.h
#ifndef INCLUDE_STREAM
#define INCLUDE_STREAM

class Stream
{
	protected:
		double m_n;

	public:
		double Get() const;
		virtual bool Set() = 0;
		
};

//stream.cpp
#include "stream.h"

double Stream::Get() const
{
	return m_n;
}

#endif

コード:

//input.h
#ifndef INCLUDE_INPUT
#define INCLUDE_INPUT
#include "stream.h"

class InputStream : public Stream
{
public:
	virtual bool Set();
};

#endif

//input.cpp
#include "input.h"
#include <iostream>
using namespace std;

bool InputStream::Set()
{
	cin>>m_n;
	return m_n > -1;
}

コード:

//array.h
#ifndef INCLUDE_ARRAY
#define INCLUDE_ARRAY
#include "stream.h"

class ArrayStream : public Stream
{
private:
	const double* m_array;
	int m_i;
	double m_n;

public:
	ArrayStream(const double* Array);
	double Get() const;
	virtual bool Set();

};

#endif

//array.cpp
#include "array.h"

ArrayStream::ArrayStream(const double* Array)
{
	m_array = Array;
	m_i = 0;
	m_n = 0;
}

bool ArrayStream::Set()
{
	m_n = m_array[m_i];
	if(m_n >= 0)
	{
		++m_i;
		return true;
	}
	else
		return false;
}
何卒よろしくお願いします

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: メンバ変数の値が書き換えられてしまう

#2

投稿記事 by みけCAT » 9年前

その症状は、本当に「書き換えられてしまう」のですか?
子クラスに邪魔なメンバ変数があるので、本来更新したい親クラスのメンバ変数が「書き換えられない」のではないですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: メンバ変数の値が書き換えられてしまう

#3

投稿記事 by みけCAT » 9年前

すいません、よく質問を読んでいませんでした。
Iseuma14 さんが書きました:Streamの派生クラスのArrayStreamクラスのメンバ変数m_nが書き換わってしまい、うまく結果が出せません
確かに意図しない変数が「書き換えられてしまう」ことが問題なのですね。
正しい書き込み先を指定してあげるといいでしょう。
例えばこんな感じで。

コード:

bool ArrayStream::Set()
{
	Stream::m_n = m_array[m_i];
	if(Stream::m_n >= 0)
	{
		++m_i;
		return true;
	}
	else
		return false;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Iseuma14
記事: 54
登録日時: 10年前

Re: メンバ変数の値が書き換えられてしまう

#4

投稿記事 by Iseuma14 » 9年前

みけCAT様、いつも回答ありがとうございます

お書きいただいた内容読んで納得しました。
何を思ったかArrayStreamクラス内でもm_nを実装しているからStreamクラスのm_nを書き換えられていない故、
Stream::Get()内で書き換わっていないm_nをリターンしているため、挙動がおかしいのですね。

ミスをなくせるよう精進します。

閉鎖

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