2013-04-18 2 views
1

У меня есть вектор указателей объектов.Передача вектора указателей объектов классу (C++)

std::vector<myObject *> listofObjects; 

И я хочу передать их другому объекту, который нуждается в доступе к ним.

Когда я пытаюсь сделать что-то вроде следующего:

class NeedsObjects 
{ 
public: 
    NeedsObjects(std::vector<myObject *> &listofObjects) 
private: 
    std::vector<myObject *> &listofObjects; 
}; 

А затем инициализировать вектор в списке инициализации я получаю следующие ошибки:

'myObject' was not declared in this scope 
template argument 1 is invalid 
template argument 2 is invalid 

Что я делаю неправильно? Все, что я хочу сделать, это передать вектор в класс NeedsObjects.

+0

Вы должны объявить ' myObject' перед 'NeedsObjects'. – juanchopanza

ответ

4

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

class myObject; // pre declaration, no need to know the size of the class 
class NeedsObjects 
{ 
public: 
    NeedsObjects(std::vector<myObject *> &listofObjects) 
private: 
    std::vector<myObject *> &listofObjects; 
}; 
+0

@WernerHenze Это контейнер указателей. Конечно, здесь разрешен неполный тип. – juanchopanza

+0

@juanchopanza Вы правы, извините за это. Я удалю свой комментарий. К сожалению, SO не позволяет мне снять мой downvote :( –

+0

@WernerHenze вправо, вам нужно подождать, пока OP сделает редактирование, тогда вы можете удалить его :) – juanchopanza

3

Вы не сообщаете компилятору, что такое myObject, поэтому он не знает, как создать std::vector. Добавьте ссылку, используя файл .h или определите myObject в этой трансляционной единице.

Либо сделать

#include "myObject.h" 

class NeedsObjects 
{ 
public: 
    NeedsObjects(std::vector<myObject *> &listofObjects) 
private: 
    std::vector<myObject *> &listofObjects; 
}; 

если вы определили myObject в отдельном заголовке

или

class myObject { 
//declaration goes here 
}; 

class NeedsObjects 
{ 
public: 
    NeedsObjects(std::vector<myObject *> &listofObjects) 
private: 
    std::vector<myObject *> &listofObjects; 
}; 
3

Как я вижу, вы не имеете любые заявления типа myOpbject отображаемые в код.

У вас есть в основном 2 варианта:

а) Включать заголовок, который полностью объявляющий MyObject.

#include "myObject.h" // ... or something near to this. 

б) предположим, что мой объект является классом. Код, указанный здесь (хотя бы часть декларации), не нуждается в том, чтобы знать размер myObject, поэтому вы можете просто объявить myObject классом, и он объявлен где-то еще.

class myObject; 
+0

Добавление файла заголовка не сработало, но частичная декларация работала! – raf

+0

В каком заголовке вы объявили класс myObject? –

Смежные вопросы