0

オブジェクトのスライスの問題だと言う人もいますが、そうではないと思います。このサイトで多くの関連記事を見てきましたが、まったく同じではありません。コードから始めましょう:

#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 つの関数を使用する必要があると思います。ビジターパターンでもっとうまくやれるかな!?

4

2 に答える 2

1

オブジェクトのスプライシングについて心配する必要はないようです (あなたの質問を正しく理解していれば)。この場合、「集約」クラスからリストを表示するだけです。ExcelFile()

にメソッドを追加しますExcelFile()。おそらく のようなものprint()です。

std::ostream & operator<<(std::ostream &os) {
    std::list<MY_STRUCT>::iterator it;
    for (it = my_list.begin(); it != my_list.end(); ++it) {
        os << "A: " << it.a << ", B: " << it.b << std::endl;
    }

    return os;
}

注: コードはコンパイルまたは実行されていません。これは単なるガイドラインです。

編集

OP が自分のリストを別の場所で使用したい場合は、セットへの定数参照を返します。

const std::list<MY_STRUCT> & getSet() const {
   return my_list;
}
于 2013-10-28T21:53:44.703 に答える
0

クラスの外部から安全にアクセスできるように、メンバーに少なくとも getter を提供するだけですmy_list(カプセル化の規則に違反することはありません!)。

class ExcelFile
{
public:
    // ...
    const std::list<MY_STRUCT>& getMyList() const { return my_list; }
    // ...
}
于 2013-10-28T21:53:29.807 に答える