ページ 11

抽象クラスでの動作

Posted: 2009年12月04日(金) 16:43
by ジャーニー
どなたか回答をお願いします.

まずは以下のプログラムを見てください.
言語はC++です.
#include <iostream>
#include <string>
#include <list>

class TestObj
{
public:
	virtual void Print()=0;
	virtual ~TestObj(){};
};

class TestObj2 : public TestObj
{
private:
	std::string p;
public:
	void Print()
	{
		std::cout << p << std::endl;
	}

	inline void SetString(std::string st){ p = st;}

};

int main(void)
{
	std::list<TestObj*> to;

	to.push_back(new TestObj2());
	to.push_back(new TestObj2());

	for(std::list<TestObj*>::iterator it = to.begin(); it != to.end(); it++)
	{
		((TestObj2*)to)->SetString("aaa");
		(*to)->Print();
	}

	return 0;
}
※コンパイルエラーが出ます

上のプログラムはまずTestObjクラスで出力する純粋仮想関数Print()を定義
TestObj2ではTestObjを継承し,Print()の中身を実装.
このときTestObj2のprivate変数stringにSetStringで文字列を代入するというものです.
main関数ではTestObj*型のlistを宣言し,文字列をセットしていき,出力するというプログラムです.

ただ,普通にイテレータを使うとTestObj型なのでSetStringが使えず,上のようにキャストしてみましたがうまくいきませんでした.
どのようにすればうまくいくでしょうか.

よろしくお願いします

Re:抽象クラスでの動作

Posted: 2009年12月04日(金) 16:58
by MNS
((TestObj2*)to)->SetString("aaa");
(*to)->Print();
ここの記述がおかしいです。toではなくitではないでしょうか?
#include <iostream>

#include <string>

#include <list>



class TestObj

{

public:

	virtual void Print()=0;

	virtual ~TestObj(){};

};



class TestObj2 : public TestObj

{

private:

	std::string p;

public:

	void Print()

	{

		std::cout << p << std::endl;

	}



	inline void SetString(std::string st){ p = st;}



};



int main(void)

{

	std::list<TestObj*> to;



	to.push_back(new TestObj2());

	to.push_back(new TestObj2());



	for(std::list<TestObj*>::iterator it = to.begin(); it != to.end(); it++)

	{

		((TestObj2*)(*it))->SetString("aaa");

		(*it)->Print();

	}



	return 0;

}

Re:抽象クラスでの動作

Posted: 2009年12月04日(金) 17:02
by ジャーニー
ご返事ありがとうございます.
その部分を直すと正常に動作しました.
ありがとうございました.

Re:抽象クラスでの動作

Posted: 2009年12月04日(金) 17:03
by ジャーニー
解決にするのを忘れていました.