从外部类 C++ 正确调用嵌套类中的函数

Posted

技术标签:

【中文标题】从外部类 C++ 正确调用嵌套类中的函数【英文标题】:Correctly call a function in a nested class from an outer class C++ 【发布时间】:2015-05-12 22:53:10 【问题描述】:

对于作业的一部分,我应该为我的教授创建的名为 HashGraph 的类创建一个赋值运算符。

这是函数原型的样子:

HashGraph<T>& operator = (const HashGraph<T>& rhs);

在这个HashGraph&lt;T&gt; 类中,我有一个名为LocalInfo 的嵌套私有类,它存储四个集合(由我的教授定义)和一个对HashGraph 的引用。这是嵌套的私有类:

  private:
    //All methods and operators relating to LocalInfo are defined below, followed by
    //  friend functions for insertion onto output streams of HashGrah and LocalInfo
    class LocalInfo 
      public:
        LocalInfo()                : from_graph(nullptr), out_nodes(hash_str), in_nodes(hash_str), out_edges(hash_pair_str), in_edges(hash_pair_str) 
        LocalInfo(HashGraph<T>* g) : from_graph(g),       out_nodes(hash_str), in_nodes(hash_str), out_edges(hash_pair_str), in_edges(hash_pair_str) 
        void connect(HashGraph<T>* g) from_graph = g;

        bool operator == (const LocalInfo& rhs) const 
          return this->in_nodes == rhs.in_nodes && this->out_nodes == rhs.out_nodes &&
                 this->in_edges == rhs.in_edges && this->out_edges == rhs.out_edges;
        
        bool operator != (const LocalInfo& rhs) const 
          return !(*this == rhs);
        

        //from_graph should point to the HashGraph LocalInfo is in, so LocalInfo
        //  methods (see <<)
        HashGraph<T>* from_graph;
        ics::HashSet<std::string>                        out_nodes;
        ics::HashSet<std::string>                        in_nodes;
        ics::HashSet<ics::pair<std::string,std::string>> out_edges;
        ics::HashSet<ics::pair<std::string,std::string>> in_edges;
   ;//LocalInfo

在我的赋值运算符中,我应该将 rhs 图形复制到 this 并返回新复制的图形。我的教授说我必须使用LocalInfo 类中的connect,这样每个复制的LocalInfo 对象都会将from_graph 重置为新图形(this)。

这是我的函数现在的样子:

template<class T>
HashGraph<T>& HashGraph<T>::operator = (const HashGraph<T>& rhs)
    this->clear();
    for(auto i : rhs.node_values) 
        HashGraph<T>::LocalInfo temp;
        temp.connect(rhs);
        node_values[i.first] = temp; 
    
    edge_values = rhs.edge_values;
    return *this;

但是,由于 temp.connect(rhs) 行,它没有编译,它说有 no matching function call to HashGraph&lt;int&gt;::LocalInfo::connect(const HashGraph&lt;int&gt;&amp;)

我的教授设置它的方式是 this-&gt;clear() 确实清空了 this HashGraph。为了复制 node_values 映射,我使用他的迭代器遍历 rhs.node_values 映射。

作为说明,他已经设置好调用node_values[i.first] = temp 将在node_values 中创建一个键,这是右侧的键,然后将分配值temp(这是一个LocalInfo object) 到那个键中。

但就像我说的,这不会编译。那么如何正确使用connect()

【问题讨论】:

【参考方案1】:

函数需要一个指针,而不是对象或引用。

temp.connect(&rhs);

【讨论】:

它给了我这个错误:error: invalid conversion from 'const ics::HashGraph&lt;int&gt;*' to 'ics::HashGraph&lt;int&gt;*' [-fpermissive] temp.connect(&amp;rhs); ^ ../src/hash_graph.hpp:71:14: error: initializing argument 1 of 'void ics::HashGraph&lt;T&gt;::LocalInfo::connect(ics::HashGraph&lt;T&gt;*) [with T = int]' [-fpermissive] void connect(HashGraph&lt;T&gt;* g) from_graph = g; @Alex:哦,是的,我没有注意到它是 const 函数参数。如果您需要一些东西来存储指向它的非const 指针,则必须使其不是const。或者您可能想连接this 而不是*rhs。很难猜测代码应该做什么。 啊..是的temp.connect(this);工作。我不知道为什么要说实话,因为我认为我应该将右侧连接到左侧。【参考方案2】:

您确定要连接到rhs 而不是this? rhs 是const HashGraph&lt;int&gt; &amp;,这使您无权修改结构。

【讨论】:

我很确定我需要在连接中包含 rhs。然后将其存储在 lhs 中。由于传递给 connect (g) 的图被分配给 from_graph 这适用于 this

以上是关于从外部类 C++ 正确调用嵌套类中的函数的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中从外部访问嵌套类

如何在 C++ 的外部类构造函数中初始化嵌套类成员

Core java for impatient 笔记

java内部类的静态嵌套类

Hibernate 从外部事务类中的 getCurrentPrice 返回 null

如何调用内部类中的静态方法