Как создать объект вложенного класса?

0

Я пытаюсь получить доступ к моему вложенному классу, чтобы я мог вернуть объект в этой функции:

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
    Я не понимаю смысла get_adj(i) , должен ли он возвращать весь список смежности вершины i или i ую запись смежности списка смежности какой- то неуказанной вершины? Я предполагаю, что ваш adjList является списком смежности для каждой вершины, то есть adjList[i] содержит смежность вершины i .
Теги:
object
oop
return

3 ответа

4

Graph::Edge не имеет конструктора по умолчанию (тот, который не принимает аргументов) - он имеет только конструктор, который принимает string и int. Вам нужно либо создать конструктор по умолчанию:

Edge()
{
  // ...
}

или передать string и int при построении объекта:

Graph::Edge v("foo", 1);
3

Ваша проблема в том, что вы объявили конструктор в классе Edge (Edge(string vertex, int weight)) и, следовательно, у вас нет конструктора по умолчанию. Когда вы пытаетесь создать экземпляр класса Edge (который вы используете с Graph::Edge v), он пытается вызвать этот конструктор по умолчанию.

Вам нужно либо явно объявить конструктор по умолчанию Edge() либо объявить переменную с помощью созданного вами конструктора.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню