Подскажите что исправить в коде чтобы он корректно запускался? На данный момент сразу выскакивает исключение о переполнении стека. Никак не могу понять в чем проблема и как ее исправить.
Ссылка на код
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;
}