Как получить доступ к агрегату в производном классе

Я знаю, что некоторые скажут, что это проблема нарезки объектов, но я не думаю, что это так. Я видел много похожих постов на этом сайте, но не совсем так. Давайте начнем с кода:

#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, чем мне нужно две функции по одной для каждого списка. Мне интересно, смогу ли я лучше справиться с моделью посетителей !?

0

Решение

Похоже, что (если я правильно понимаю ваш вопрос) нет причин беспокоиться о сращивании объектов. Похоже, все, что вы хотите сделать, это просмотреть список из класса «агрегат», в этом случае: 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;
}

Примечание: код не был скомпилирован или запущен, это всего лишь руководство.

РЕДАКТИРОВАТЬ

Если ОП хочет использовать свой список в другом месте, верните постоянную ссылку на набор:

const std::list<MY_STRUCT> & getSet() const {
return my_list;
}
1

Другие решения

Просто предоставьте хотя бы добытчик для вашего my_list член для безопасного доступа извне класса (который не будет нарушать никаких правил инкапсуляции!):

class ExcelFile
{
public:
// ...
const std::list<MY_STRUCT>& getMyList() const { return my_list; }
// ...
}
0

По вопросам рекламы [email protected]