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;
}