gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:40:18 27 4
gpt4 key购买 nike

让我们假设我们有一个名为 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) 并分配资源。

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

最佳答案

对我来说似乎很奇怪的一件事是打印机依赖于 Node 的一个实例,单台​​打印机不应该可以打印多个节点吗?而且我也不会让 Node 依赖于 NodePrinter,因为那样你就不能用多台打印机打印同一个节点。

无论如何,如果你真的需要保持一一对应,最简单的方法就是直接在 Node 中声明成员变量的地方初始化 NodePrinter >:

#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 .

关于c++ - 确保所有构造函数调用相同的函数 c++,设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52439684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com