オブジェクトのスライスの問題だと言う人もいますが、そうではないと思います。このサイトで多くの関連記事を見てきましたが、まったく同じではありません。コードから始めましょう:
#include "stdafx.h"
#include <list>
struct MY_STRUCT
{
int a;
int b;
};
class File
{
public:
virtual void Load(char * fileName) = 0;
};
class ExcelFile : public File
{
protected:
std::list<MY_STRUCT> my_list;
public:
ExcelFile(){};
~ExcelFile(){};
virtual void Load(char * fileName)
{
// load the file into my_list
}
};
int _tmain(int argc, _TCHAR* argv[])
{
char fileName[] = "test.txt";
File * file = new ExcelFile;
file->Load( fileName );
// Now I need to fill a Windows List or CListView from my_list data but how?
// I can't access or iterate my_list here and I am not too sure if
// should pass a windows object to the class to fill it up?
// Even if I iterate by adding a member function to return the list object, wouldn't not
// it violate the data encapsulation rule thereby defeating the purpose of having
// interface class?
return 0;
}
したがって、基本的には、派生クラスが集約 (コレクション) にデータを持つインターフェイス クラスがあります。今度はデータを表示したいと思います。それを行う正しい方法は何ですか?コードのコメントで問題について言及しました...この投稿を書いているときに答えを見つけたと思います。リストを埋める関数をクラスに追加させる必要があります。また、ListBox または ListView を入力する必要がある場合は、リストごとに 1 つの 2 つの関数を使用する必要があると思います。ビジターパターンでもっとうまくやれるかな!?