Сохранение в двоичных файлах - PullRequest
0 голосов
/ 06 мая 2020

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

Вот пример заголовка с узлами и самих списков:

class nodeA
{
   int data1;
   double data2;


    nodeA* next;

}
class listA
{
    nodeA* headA;
    ...
}
class nodeB
{
   int data3;
   double data4;


    nodeB* nextB;

}
class listB
{
    nodeB* headB;
    ...
}
class nodeC
{
   int data5;
   double data6;


    nodeC* nextC;

}
class listC
{
    nodeC* headC;
    ...
}

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

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Итак, lista_vendas::novaVenda должен вызвать lista_produto::escolheProduto.

Чтобы вызвать lista_produto::escolheProduto, вам нужен объект lista_produto. Откуда вы собираетесь взять этот lista_produto объект?

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

1) Имейте lista_produto глобальную переменную , глобальный список продуктов. Затем lista_vendas::novaVenda может использовать глобальный lista_produto для вызова lista_produto::escolheProduto. Это простое решение, но глобальные переменные по праву считаются плохим стилем. Это также означает, что ваша программа может иметь только один список продуктов, это проблема? Подумайте внимательно, прежде чем пробовать это решение.

2) Используйте lista_produto как переменную-член из lista_vendas или no_vendas. Я предполагаю здесь, но, возможно, что-то вроде этого

class no_vendas
{
public:
    unsigned int codigoVenda, dia, mes, ano, numeroItens;
    double precoTotal;
    lista_produto productList; // list of products
    no_vendas* proxi; //referencia para o proximo no
};

Теперь у каждого поставщика есть список продуктов, что имеет смысл. Итак, lista_vendas::novaVenda теперь имеет доступ к lista_produto в каждом no_vendas и может использовать это для вызова lista_produto::escolheProduto. Если это имеет смысл, то это, вероятно, лучшее решение.

3) Передайте lista_produto в качестве параметра от до lista_vendas::novaVenda. Вот так

void novaVenda(unsigned int codigoVenda, lista_produto* productList);

Итак, какой бы код не вызвал lista_vendas::novaVenda, он должен также предоставить lista_produto, который ему нужен.

Как я уже сказал, я не знаю, какая из этих возможностей верна, потому что я не знаю, что вы пытаетесь сделать (и я не говорю по-испански sh). Но это проблема отношений между вашими разными объектами. Вам решать разработать свои классы, чтобы они могли получить доступ к различным объектам, которые им нужны для работы.

Вы упомянули наследование в своем заголовке, но это не похоже на то, что нужно что делать в этом случае.

0 голосов
/ 06 мая 2020

Это не поможет вам с вашей конкретной проблемой, но я думаю, вам следует использовать стандартные контейнеры, такие как std::vector<>. Создание собственного связанного списка - хорошее упражнение для пальцев, но оно редко бывает действительно необходимым. Тем не менее, вы должны использовать std::vector<no_produto> вместо lista_produto:

#include <vector>

std::vector<no_produto> my_lista_produto;

// fill the vector:
my_lista_produto.push_back(my_no_produto_1);
my_lista_produto.push_back(my_no_produto_2);
// ...

// retrieve one item:
const no_produto &p = my_lista_produto[1];

// clear all items:
my_lista_produto.clear();

Полный список всех доступных методов можно найти здесь .

Относительно вашего вопроса: В заголовке вопроса упоминается наследование, но в вашем примере оно не используется. Чтобы получить класс B от класса A, вы должны написать

class A {
public:
    void func();
};

class B : public A {
public:
    void gunc();
};

Это означает, что, по сути, B можно рассматривать как A. B содержит содержимое A и самостоятельно предоставляет интерфейс publi c A. Таким образом, мы можем написать:

void B::gunc() {
    func();
}

хотя B никогда не определяет метод func(), он унаследовал метод от A. Я подозреваю, что вы неправильно унаследовали свои классы друг от друга.

В дополнение к моим первоначальным мыслям о написании собственных связанных списков, пожалуйста, подумайте также о композиции вместо наследования. Вы можете найти дополнительную информацию о topi c в Wikipedia или Stack Overflow .

...