我正在尝试访问我的嵌套类,因此我可以在此函数中返回该对象:
Graph::Edge Graph::get_adj(int i)
{
Graph::Edge v;
int count = 0;
for(list<Edge>::iterator iterator = adjList[i].begin(); count <= i ;++iterator)
{
v.m_vertex = iterator->m_vertex;
v.m_weight = iterator->m_weight;
}
return v;
}
不要担心for循环(它应该在理论上有效)我的主要问题是声明对象Graph::Edge v;
它不起作用!这是我得到的错误:
$ make -f makefile.txt
g++ -Wall -W -pedantic -g -c Graph.cpp
Graph.cpp: In member function `Graph::Edge Graph::get_adj(int)':
Graph.cpp:124: error: no matching function for call to `Graph::Edge::Edge()'
Graph.cpp:43: note: candidates are: Graph::Edge::Edge(const Graph::Edge&)
Graph.h:27: note: Graph::Edge::Edge(std::string, int)
makefile.txt:9: recipe for target `Graph.o' failed
make: *** [Graph.o] Error 1
我想访问
Graph.h:27: note: Graph::Edge::Edge(std::string, int)
以下是我的类Graph的声明:(为了简单起见,我拿出了函数和一些东西,使其更容易阅读) *
class Graph
{
private:
vector< list<Edge> > adjList;
public:
Graph();
~Graph();
class Edge
{
public:
Edge(string vertex, int weight)
{
m_vertex = vertex;
m_weight = weight;
}
~Edge(){}
string m_vertex;
int m_weight;
};
vector < list < Edge > > get_adjList(){return adjList;}
//Other functions....
};
基本上,我需要知道的是在此函数中声明Edge对象的正确方法。我真的很困惑,不知道除了Graph :: Edge v之外还有什么可做的;
答案 0 :(得分:4)
Graph::Edge
没有默认构造函数(不带参数的构造函数) - 它只有一个构造函数,它带有string
和int
。您需要提供如下默认构造函数:
Edge()
{
// ...
}
或在构造对象时传递string
和int
:
Graph::Edge v("foo", 1);
答案 1 :(得分:3)
您的问题是您已在Edge类(Edge(string vertex, int weight)
)中声明了构造函数,因此您没有默认构造函数。当您尝试创建Edge类的实例(使用Graph::Edge v
时),它会尝试调用此默认构造函数。
您需要显式声明Edge()
默认构造函数或使用您创建的构造函数声明变量。
答案 2 :(得分:0)
您可以看到inner
位于outer
类中,因此可以创建inner
对象或实例,并且可以像下面的代码段一样调用方法。
#include<iostream>
using namespace std;
class outer
{
int x;
public:
class inner
{
public:
void f(){
outer obj;
obj.x=10;
obj.display();
}
};
void display()
{
cout<<x;
}
};
int main(){
outer::inner p;
p.f();
return 0;
}
//output=10