С++ вектор внутреннего класса

Итак, у меня есть заголовочный файл Graph.h. В этом заголовочном файле я объявляю вектор.

std::vector<Vertex*> vertexList;

Элементы этого вектора имеют тип указателя на Vertex, который является внутренним классом Graph. Насколько я знаю, это вынуждает меня либо определить класс Vertex в заголовке, либо вообще забыть о том, что он является внутренним классом.

Что я действительно хочу сделать, так это определить только этот класс Vertex внутри файла Graph.cpp. Как я могу это сделать?

Надеюсь, мой вопрос понятен. Я пришел из мира Java, где такие вещи проще.


person flameiguana    schedule 21.04.2013    source источник
comment
Как насчет std::vector<class Vertex*> vertexList;?   -  person user541686    schedule 21.04.2013


Ответы (4)


Если вы говорите о необходимости реализации всех методов Vertex, вы можете сделать это с областью видимости в файле .cpp так же, как и для класса Graph: //graph.h class Graph {

  Graph();

  class Vertex {
    Vertex();
  }

 vector<Vertex*> vertexList;
};

//graph.cpp
Graph::Graph() {

//...
}

Graph::Vertex::Vertex() {
//...

}

Если вы хотите, чтобы все определение Vertex было только в файле .cpp, вы можете использовать предварительное объявление:

//graph.h
class Vertex; //forward declaration
class Graph {

  Graph();

 vector<Vertex*> vertexList;
};

//graph.cpp
class Vertex {
  Vertex();

}

Vertex::Vertex() {...}

Graph::Graph() {...}
person maditya    schedule 21.04.2013

Вы можете предварительно объявить класс Vertex в общедоступном заголовке:

class Vertex;

Это позволит использовать его указатель где угодно.

В вашем классе реализации (частном) вы можете определить тело и методы класса:

class Vertex { ... }; 

Только те части кода, которые фактически используют методы Vertex, должны иметь доступ к определению типа.

person Valeri Atamaniouk    schedule 21.04.2013

Если вы хотите использовать класс только как указатель, достаточно сделать это:

class Graph {

public:
    class Vertex;

};

И вы можете сделать все остальное в другом месте, например:

class Graph::Vertex {
    ...
};
person Detheroc    schedule 21.04.2013

В С++ обычно для каждого класса есть файл .h, содержащий интерфейс класса, и файл С++, содержащий конкретную реализацию. Обычно вы включаете vertex.h в Graph.h. Единственное, что могло бы все испортить, это если бы два файла .h зависели друг от друга. В этом случае вы можете просто использовать одну строку для переадресации объявления class Vertex; в заголовочный файл graph.h перед объявлением класса графа.

person Lefteris E    schedule 21.04.2013