阅读各自类别的输入以保持关注点分离。示例场景:
Graph
知道如何阅读图表数据格式的输入数据。Edge
知道如何读取边数据格式的输入数据。Vertex
知道如何读取顶点数据格式的输入。4
3
0 1
1 2
3 2
V
顶点的数量E
边E
行是带有两个整数u
的边数据,v
是它连接的索引。#include <iostream>
#include <string>
using namespace std;
struct Vertex {
int index;
};
struct Edge {
Vertex* adjacencies[2]; // 2 end point.
Edge(Vertex* v1, Vertex* v2){
adjacencies[0] = v1;
adjacencies[1] = v2;
}
Edge(){ }
friend std::istream&
operator>>(std::istream &in, Edge &edge) {
int v1, v2;
in >> v1 >> v2;
// -------------------------------------------------------
// From these integers v1 & v2, we need the vertex pointer.
// The vertex pointer is retrievable from the graph object.
// However graph is not available in this friend function.
// graph object somehow available on the caller. But how??
// -------------------------------------------------------
Vertex* v1_ptr = nullptr; // ????
Vertex* v2_ptr = nullptr; // ????
edge = Edge(v1_ptr, v2_ptr);
return in;
}
};
struct Graph {
Vertex vertices[10];
Edge edges[10];
friend std::istream&
operator>>(std::istream &in, Graph &graph) {
int e;
in >> e; // Number of Edges
for (int i = 0; i < e; ++i){
in >> graph.edges[i];
}
return in;
}
};
int main(){
Graph graph;
cin >> graph;
return 0;
}
注意我是如何使用cin >> graph
读取所有这些输入格式的。在Graph::operator>>
内部,我希望在读取Edge
数据时进一步嵌套输入重定向的重载。但Edge::operator>>
数据需要Vertex
(其来电者)上提供的Graph
信息。
Graph.vertices
时通知Edge::operator>>
?答案 0 :(得分:0)
- 到目前为止我做得好吗?关于在不同类别上分离其输入阅读
设计对我来说似乎没问题。
- 我们如何将Graph.vertices告知Edge :: operator&gt;&gt;什么时候打电话?
没有额外的论据是不可能的。
- 如果不可能采用相同的目标,我怎样才能达到同样的目标?
你应该替换Edge :: operator&gt;&gt;通过另一个参数read(std::istream&, EdgeReadParameters& params)
的方法,该参数包含位于Vertex*
的int到Graph
的映射以及Graph::vertices
的引用。如果没有read
与Vertex
读取相关,则可以通过int
方法逐步构建此地图 - 对Graph::vertices
的引用将拥有新创建的{{} 1}}。 Vertex
对象应该是EdgeReadParameters
方法的本地对象。
答案 1 :(得分:0)
您可以使用iword()
的{{1}}或pword()
成员(std::ios_base
和std::istream
的公共基类)设置其他信息:给定这些索引提供对std::ostream
(int&
)和iword()
(void*&
)的访问权限。这些函数的使用可能如下所示:
pword()