Я новичок в C++, я пытаюсь сделать очень простую программу CRUD.Как я могу поддерживать хорошую инкапсуляцию данных в этой ситуации?
В этом примере клиент купил много вещей в магазине, и этот магазин содержит информацию о том, что купил этот клиент. Я назвал его Inventory
.
Магазин, хочет распечатать Report
для каждого клиента. В приведенном ниже коде основной только один Инвентарь, только для образца.
Проблема: когда я хочу распечатать отчет, мне нужно получить данные от клиента, но без потери инкапсуляции. Я хочу сказать, что я не хочу, чтобы ни один класс не мог изменять содержимое инвентаря.
То, что я пытаюсь сделать, это преобразовать карту в вектор (мне нужно что-то сортировать данные) и передать этот вектор (динамически выделен). Я выделяю этот вектор в классе Inventory
, но который удаляет - это класс Report
, это неправильный способ сделать что-то, но я не знаю, как передать эту информацию, не делая этого.
В любом случае класс отчета может получить указатель на книгу и использовать его функцию set
или указать другую книгу. Опять же, я не знаю, как это сделать правильно.
Может кто-нибудь дать мне совет, что я должен сделать в этом случае?
Спасибо.
Извините за длинный код.
Главная:
int main(void)
{
Inventory i;
Report r(i);
i.addBook("Foo Bar I");
i.addBook("Foo Bar II");
r.generateReport();
return 0;
}
класса Отчет в .h:
class Report
{
private:
Inventory* i;
public:
Report(Inventory& i);
void generateReport();
};
класса Отчет в CPP:
Report::Report(Inventory& i)
{
this->i = &i;
}
void Report::generateReport()
{
ofstream out ("Report.txt");
out << "Books: " << endl;
vector<pair<int, Book *>> * b = i->getBooks();
for(pair<int, Book *> p : *b)
{
out << p.first << ": " << p.second.getName() << endl;
}
out << endl;
delete b;
out.close();
}
класса Inventory в .h:
class Inventory
{
private:
map<int, Book *> books;
public:
void addBook(int code, const string& name);
vector<pair<int, Book *>> * getBooks();
};
класса Inventory в .cpp:
void Inventory::addBook(int code, const string& name)
{
books.insert(pair<int, Book *>(code, new Book(name)));
}
vector<pair<int, Book *>> * Inventory::getBooks()
{
return new vector<pair<int, Book *>>(books.begin(), books.end());
}
Пожалуйста, напишите [минимальный, полный и проверяемый пример] (https://stackoverflow.com/help/mcve) –
Вы слышали о методах setter/getter? – user463035818
Да, но я сделаю геттер для карты? – ViniciusArruda