让我们假设我们有一个名为Node的类,该类具有一个称为sequence和id的成员。我们想以许多不同的方式打印节点的顺序。我们没有将打印功能直接添加到Node类中,而是将它们放在一个单独的类NodePrinter中。无论如何,每个节点都需要有一个“工作”的NodePrinter。
这暗示着:
节点有一个NodePrinter * printer
成员
Node的每个构造函数都需要创建一个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)
并分配资源。
这是否合理,还是从一开始就已经扭曲了整个方法?有更好的方法吗?
答案 0 :(得分:0)
对我而言,一件奇怪的事是打印机依赖于Node
的实例,一台打印机是否可以打印多个节点?而且我也不会Node
依赖NodePrinter
,因为那样一来,您就无法使用多台打印机来打印同一节点。
无论如何,如果您确实需要保持1对1的对应关系,最简单的方法就是直接在NodePrinter
中声明成员变量的地方直接初始化Node
:
#include <iostream>
#include <memory>
#include <string>
class Node;
class NodePrinter
{
private:
Node * node;
public:
NodePrinter() = delete;
NodePrinter(Node * node): node(node){}
void print_node();
};
class Node
{
public:
Node(std::string sequence) : sequence(std::move(sequence)){}
Node(int id, std::string sequence) : id(id), sequence(std::move(sequence)) {}
int id;
std::string sequence;
std::unique_ptr<NodePrinter> printer = std::make_unique<NodePrinter>(this);
};
void NodePrinter::print_node()
{
std::cout<< node->sequence << '\n';
}
int main()
{
Node node("abc");
node.printer->print_node();
return 0;
}
wandbox上的实时演示。