如何为重载的运算符提供必要的信息>>

时间:2016-08-25 17:21:34

标签: c++

目的:

阅读各自类别的输入以保持关注点分离。示例场景:

  • Graph知道如何阅读图表数据格式的输入数据。
  • Edge知道如何读取边数据格式的输入数据。
  • Vertex知道如何读取顶点数据格式的输入。

输入格式:

4
3
0 1
1 2
3 2
  1. 第一行是V顶点的数量
  2. 第二行是E
  3. 的#
  4. 下一个E行是带有两个整数u的边数据,v是它连接的索引。
  5. 精心制作的示例代码

    #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>>
    • 如果不可能采用相同的目标,我怎样才能达到同样的目标?

2 个答案:

答案 0 :(得分:0)

  
      
  • 到目前为止我做得好吗?关于在不同类别上分离其输入阅读
  •   

设计对我来说似乎没问题。

  
      
  • 我们如何将Graph.vertices告知Edge :: operator&gt;&gt;什么时候打电话?
  •   

没有额外的论据是不可能的。

  
      
  • 如果不可能采用相同的目标,我怎样才能达到同样的目标?
  •   

你应该替换Edge :: operator&gt;&gt;通过另一个参数read(std::istream&, EdgeReadParameters& params)的方法,该参数包含位于Vertex*的int到Graph的映射以及Graph::vertices的引用。如果没有readVertex读取相关,则可以通过int方法逐步构建此地图 - 对Graph::vertices的引用将拥有新创建的{{} 1}}。 Vertex对象应该是EdgeReadParameters方法的本地对象。

答案 1 :(得分:0)

您可以使用iword()的{​​{1}}或pword()成员(std::ios_basestd::istream的公共基类)设置其他信息:给定这些索引提供对std::ostreamint&)和iword()void*&)的访问权限。这些函数的使用可能如下所示:

pword()