从外部类 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<T>
类中,我有一个名为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<int>::LocalInfo::connect(const HashGraph<int>&)
。
我的教授设置它的方式是 this->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<int>*' to 'ics::HashGraph<int>*' [-fpermissive] temp.connect(&rhs); ^ ../src/hash_graph.hpp:71:14: error: initializing argument 1 of 'void ics::HashGraph<T>::LocalInfo::connect(ics::HashGraph<T>*) [with T = int]' [-fpermissive] void connect(HashGraph<T>* g) from_graph = g;
@Alex:哦,是的,我没有注意到它是 const
函数参数。如果您需要一些东西来存储指向它的非const
指针,则必须使其不是const
。或者您可能想连接this
而不是*rhs
。很难猜测代码应该做什么。
啊..是的temp.connect(this);
工作。我不知道为什么要说实话,因为我认为我应该将右侧连接到左侧。【参考方案2】:
您确定要连接到rhs
而不是this
? rhs 是const HashGraph<int> &
,这使您无权修改结构。
【讨论】:
我很确定我需要在连接中包含 rhs。然后将其存储在 lhs 中。由于传递给 connect (g) 的图被分配给from_graph
这适用于 this
以上是关于从外部类 C++ 正确调用嵌套类中的函数的主要内容,如果未能解决你的问题,请参考以下文章