确保所有构造函数都调用相同的函数c ++,设计模式

时间:2018-09-21 08:30:53

标签: c++ design-patterns

让我们假设我们有一个名为Node的类,该类具有一个称为sequence和id的成员。我们想以许多不同的方式打印节点的顺序。我们没有将打印功能直接添加到Node类中,而是将它们放在一个单独的类NodePrinter中。无论如何,每个节点都需要有一个“工作”的NodePrinter。

这暗示着:

  1. 节点有一个NodePrinter * printer成员

  2. 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)并分配资源。

这是否合理,还是从一开始就已经扭曲了整个方法?有更好的方法吗?

1 个答案:

答案 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上的实时演示。