colorname
@colorname

Как исправить код чтобы не было исключения Stack overflow?

Подскажите что исправить в коде чтобы он корректно запускался? На данный момент сразу выскакивает исключение о переполнении стека. Никак не могу понять в чем проблема и как ее исправить.

Ссылка на код

Exception thrown at 0x00007FF7F259FB4E in Part_3.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x000000C738003FF0).
Unhandled exception at 0x00007FF7F259FB4E in Part_3.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x000000C738003FF0).


#include <iostream>
#include <string>
#include <set>

class Folder;

class Message
{
public:
    explicit Message(std::string message_text = "") : text(message_text) {}
    Message(Message& message) : text(message.text), folders(message.folders)
    {
        add_message_to_folders(*this);
    }
    ~Message()
    {
        remove_message_from_folders();
    }
    Message& operator=(Message& message)
    {
        remove_message_from_folders();
        text = message.text;
        folders = message.folders;
        add_message_to_folders(*this);
        return *this;
    }
    void add_folder(Folder& folder);
    void remove_folder(Folder& folder);
    std::string get_text()
    {
        return text;
    }
private:
    std::string text;
    std::set<Folder*> folders;
    void add_message_to_folders(Message& message);
    void remove_message_from_folders();
};

class Folder
{
public:
    Folder() = default;
    Folder(Folder& folder) : messages(folder.messages)
    {
        add_folder_to_messages(folder);
    }
    ~Folder()
    {
        remove_folder_from_messages();
    }
    Folder& operator=(Folder& folder)
    {
        remove_folder_from_messages();
        messages = folder.messages;
        add_folder_to_messages(*this);
        return *this;
    }
    void add_message(Message& message)
    {
        messages.insert(&message);
        message.add_folder(*this);
    }
    void remove_message(Message& message)
    {
        messages.erase(&message);
        message.remove_folder(*this);
    }
    void print_messages()
    {
        for (auto message : messages)
        {
            std::cout << message->get_text() << std::endl;
        }
    }
private:
    std::set<Message*> messages;
    void add_folder_to_messages(Folder& folder)
    {
        for (auto message : folder.messages)
        {
            message->add_folder(folder);
        }
    }
    void remove_folder_from_messages()
    {
        for (auto message : this->messages)
        {
            message->remove_folder(*this);
        }
    }
};

void Message::add_folder(Folder& folder)
{
    folders.insert(&folder);
    folder.add_message(*this);
}

void Message::remove_folder(Folder& folder)
{
    folders.erase(&folder);
    folder.remove_message(*this);
}

void Message::add_message_to_folders(Message& message)
{
    for (auto folder : message.folders)
    {
        folder->add_message(*this);
    }
}

void Message::remove_message_from_folders()
{
    for (auto folder : folders)
    {
        folder->remove_message(*this);
    }
}

int main()
{
    Folder folder;
    Message message_1("Message_1 Text");
    Message message_2("Message_2 Text");
    Message message_3("Message_3 Text");

    folder.add_message(message_1);
    folder.add_message(message_2);
    folder.add_message(message_3);

    folder.print_messages();

    folder.remove_message(message_3);

    folder.print_messages();

    return 0;
}
  • Вопрос задан
  • 326 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
// class Folder
void add_message(Message& message)
    {
        messages.insert(&message);
        message.add_folder(*this); // !!!!!!
    }

...............

void Message::add_folder(Folder& folder)
{
    folders.insert(&folder);
    folder.add_message(*this); // !!!!!!
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы