我正試圖為一個現有的庫添加一個訪問者。該訪問者必須能夠訪問不同專案中的一些類。
假設我的解決方案有以下專案。ProjectA, ProjectB,它們分別包含一個類。NodeA, NodeB。由于訪問者只是一個類外成員的實作,我認為它的依賴性不允許它被放在另一個專案中。所以如果我想創建一個可以同時訪問NodeA和NodeB物件的訪問者,我不能使用一個簡單的訪問者。
這個評估是否正確?
我在考慮幾個解決方案來克服這個問題。
我在考慮幾個解決方案。
- 將其中一個類轉移到另一個專案中并在那里實作訪問者(這不是一個可行的解決方案)。
- 添加一個額外的指示。為每個專案創建一個實作訪問者的類。并創建一個 "頭部訪客",它將使用這些實作物件。
我錯過了什么嗎?是否有更好的方法來做到這一點?
請在下面找到我的訪問者實作。請注意,為了簡單起見,我洗掉了頭頂的防護。
//--專案A的Node.h ---
class Visitor。
class Node {
public:
Node() = default;
virtual ~Node() = default;
virtual void accept(Visitor & v)= 0;
};
/// --- 專案A的NodeA.h ---
#include "Visitor.h"
class NodeA : public Node{
public:
void accept(Visitor & v)。
};
/// --- 專案B的NodeB.h ---
#include "Visitor.h"
class NodeB : public Node{
public:
void accept(Visitor & v)。
};
//--Visitor.h ---
#include "Node.h"
class NodeA。
class NodeB;
class Visitor {
public:
Visitor() = default;
virtual ~Visitor() = default;
virtual void visit(const Node & node)。
virtual void visit(const NodeA & node)。
virtual void visit(const NodeB & node)。
};
// --- Visitor.cpp ---.
#include "Visitor.h"
#include "NodeA.h"
void Visitor::visit(const Node & node)
{
//實作
}
void Visitor::visit(const NodeA & node)
{
//實作
}
void Visitor::visit(const NodeB & node)
{
//實作
}
uj5u.com熱心網友回復:
如果 代碼看起來是這樣的: 這樣一來, uj5u.com熱心網友回復: 如果我把訪問者介面類放到與Node相同的專案中,并且只在派生節點頭中使用,我可以把派生的訪問者類放到不同的專案中,這將取決于一切(基節點和派生節點以及基訪問者)。訪問方法將被動態地分配給適當的訪問者實體。
標籤: 上一篇:在c 中重寫std::exception的what函式
下一篇:執行子檔案夾內的代碼NodeA和NodeB之間沒有任何共同點,除了能夠接受一個訪問者并將其存盤在一個,例如,std::vector<std::unique_ptr<Node>>/code>考慮使用std::variant代替。
#include <variant>
#include <iostream>
#include <vector>
class NodeA {};
class NodeB {};
using Node = std::variant<NodeA, NodeB> 。
class Visitor
{
public:
void operator()(NodeA & node)
{
std::cout << "遇到A" << std::endl;
}
void operator()(NodeB & node)
{
std::cout << "遇到B" << std::endl。
}
};
int main()
{
std::vector<Node> nodes;
nodes.emplace_back(NodeA{})。
nodes.emplace_back(NodeA{})。
nodes.emplace_back(NodeB{})。
nodes.emplace_back(NodeA{})。
nodes.emplace_back(NodeB{})。
nodes.emplace_back(NodeB{})。
訪客訪問者。
for (auto & node : nodes)
{
std::visit(visitor, node)。
}
}
NodeA、NodeB和訪問者的實作就基本解耦了。
