2013-12-08 1 views
0

У меня есть класс, который имеет элемент с типом vector<CCPoint>. Я хочу инициализировать этот член в вызове конструктора, как его можно достичь?Инициализировать вектор-член в конструкторе C++

Я сделал это так:

.h

class A{ 
    public: 
     A(vector<CCPoint> *p); 
    private: 
     vector<CCPoint> *p; 
} 

.cpp

A:A(){ 
    this->p = p; 
} 

вызов

Vector<CCPoint> *p = new Vector<CCPoint>; 
A a = new A(p); 
+0

Так что же (помимо очевидных опечаток) не так? Если вам что-то особенное вам не нравится в этом подходе, вы должны сказать нам это. –

+0

damn, у меня есть исключения с нулевым указателем, но теперь я вижу, что я использовал вектор, прежде чем инициализировать его. это происходит, если вы не спите в течение нескольких дней. @polka, честно говоря, я не использовал C++, поэтому я использовал это правило: «добавьте * перед каждой не примитивной переменной, и она будет работать как Java» по крайней мере, насколько я ее пережил. Я знаю, что это грубо ... спасибо за ваши ответы в любом случае –

+1

_ «добавьте * перед каждой не примитивной переменной, и она будет работать как Java». Это ужасное правило. Он не будет работать как Java, потому что C++ не имеет сборщика мусора. – Chad

ответ

4

Это утечка памяти, потому что никто не удаляет вектор, который вы «новый».

Кроме того, почему есть указатель на вектор вообще? Вы беспокоитесь о том, что копировать его в конструктор дорого?

Изменить элемент, чтобы быть вектором:

class A{ 
    public: 
     A(vector<CCPoint> p); 
    private: 
     vector<CCPoint> p; 
} 

Изменить конструктор использовать список Инициализатора:

A:A(vector<CCPoint> newP) : p(newP){ 
    // Empty 
} 

И не называйте, как это:

Vector<CCPoint> p; 
A a(p); 

Никогда, создайте объект с «новым», если вы точно не знаете, почему вы это делаете, и даже тогда пересматриваете.

Замечание об исполнении: Да, это может привести к возникновению векторной копии, в зависимости от копирования экземпляра компилятором. Альтернативным решением для модных брюк C++ 11 было бы использовать перемещение:

class A{ 
    public: 
     A(vector<CCPoint> p); 
    private: 
     vector<CCPoint> p; 
} 

A:A(vector<CCPoint> newP) : p(std::move(newP)){ 
    // Empty 
} 

Vector<CCPoint> p; 
A a(std::move(p)); // After this completes, 'p' will no longer be valid. 
+0

Зачем кому-то удалять его, если мне это нужно позже? ANd, когда я больше не использую класс A, GC удалит его, не так ли? –

+1

Нет GC. – polkadotcadaver

0

Там есть ошибка в файле CPP, вы» повторно отсутствует вторая толстая кишка:

A::A() { 

Кроме того, вы можете напрямую инициализировать р с помощью списка инициализации, как так:

A::A(vector<CCPoint>* _p) : 
p(_p) 
{} 

Не то, что есть какое-либо реальное преимущество в использовании этого для примитивных типов, таких как указатели, но это хорошо конвенция. Отвечает ли это на ваш вопрос? Я не совсем понимаю, в чем проблема, именно на основе вашего сообщения.