Я пытаюсь получить доступ к моему вложенному классу, чтобы я мог вернуть объект в этой функции:
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;
Graph::Edge
не имеет конструктора по умолчанию (тот, который не принимает аргументов) - он имеет только конструктор, который принимает string
и int
. Вам нужно либо создать конструктор по умолчанию:
Edge()
{
// ...
}
или передать string
и int
при построении объекта:
Graph::Edge v("foo", 1);
Ваша проблема в том, что вы объявили конструктор в классе Edge (Edge(string vertex, int weight)
) и, следовательно, у вас нет конструктора по умолчанию. Когда вы пытаетесь создать экземпляр класса Edge (который вы используете с Graph::Edge v
), он пытается вызвать этот конструктор по умолчанию.
Вам нужно либо явно объявить конструктор по умолчанию Edge()
либо объявить переменную с помощью созданного вами конструктора.
Вы можете видеть, что, поскольку 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
get_adj(i)
, должен ли он возвращать весь список смежности вершиныi
илиi
ую запись смежности списка смежности какой- то неуказанной вершины? Я предполагаю, что вашadjList
является списком смежности для каждой вершины, то естьadjList[i]
содержит смежность вершиныi
.