Предположим, что у нас есть класс с именем Node, в котором есть член с именем sequence и id.Мы хотим напечатать последовательность узла различными способами.Вместо того, чтобы добавлять функции печати непосредственно в класс Node, мы помещаем их в отдельный класс с именем NodePrinter.Каждый узел должен иметь «работающий» NodePrinter в любом случае.
Это означает, что:
Узел имеет NodePrinter * printer
член
Каждый конструктор узла должен создать new NodePrinter
Моя идея заключалась в том, чтобы создать BaseNode
и переместить NodePrinter
в него.Он имеет только один конструктор, который принимает Node
в качестве входных данных и присваивает его NodePrinter
:
#include <iostream>
#include <string>
using namespace std;
class NodePrinter;
class Node;
class BaseNode
{
public:
BaseNode() = delete;
BaseNode(Node * node);
~BaseNode();
NodePrinter * printer;
};
class Node: public BaseNode
{
public:
Node(string sequence): BaseNode(this), sequence(sequence){}
Node(int id, string sequence): BaseNode(this), sequence(sequence), id(id){}
int id;
string sequence;
};
class NodePrinter
{
private:
Node * node;
public:
NodePrinter() = delete;
NodePrinter(Node * node): node(node){}
void print_node()
{
std::cout<<node->sequence<<endl;
}
};
BaseNode::BaseNode(Node * node)
{
node->printer = new NodePrinter(node);
}
BaseNode::~BaseNode()
{
delete printer;
printer = nullptr;
}
int main()
{
Node node("abc");
node.printer->print_node();
return 0;
}
. Таким образом, каждый узел вынужден вызывать BaseNode(this)
, и ресурсы распределяются.
Это разумно, или весь этот подход уже искажен с самого начала?Есть ли лучший способ сделать это?