Убедитесь, что все конструкторы вызывают одну и ту же функцию c ++, шаблон проектирования - PullRequest
0 голосов
/ 21 сентября 2018

Предположим, что у нас есть класс с именем Node, в котором есть член с именем sequence и id.Мы хотим напечатать последовательность узла различными способами.Вместо того, чтобы добавлять функции печати непосредственно в класс Node, мы помещаем их в отдельный класс с именем NodePrinter.Каждый узел должен иметь «работающий» NodePrinter в любом случае.

Это означает, что:

  1. Узел имеет NodePrinter * printer член

  2. Каждый конструктор узла должен создать 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 голосов
/ 21 сентября 2018

Одна вещь, которая кажется мне странной, состоит в том, что принтер зависит от экземпляра Node, не может ли один принтер печатать несколько узлов?И у меня также не будет зависеть Node от NodePrinter, потому что тогда вы не сможете напечатать один и тот же узел несколькими принтерами.

В любом случае, если вам действительно нужно оставить 1-to-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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...