2013-12-08 2 views
0

멤버가 vector<CCPoint> 인 클래스가 있습니다. 생성자 호출에서이 멤버를 초기화하려면 어떻게 할 수 있습니까?구성자 C++의 멤버 벡터 초기화

.H

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

통화 당

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

전화

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

그래서 무엇이 (명백한 오타 외에) 잘못 되었습니까? 이 접근 방식에 대해별로 마음에 들지 않는 특정 사항이 있으면 알려주십시오. –

+0

젠장, 널 포인터 예외가있어,하지만 지금은 초기화하기 전에 벡터를 사용하는 것을 볼 수 있습니다. 며칠 동안 잠을 못 자면 그 일이 일어납니다. 솔직히 말해서 @polka 솔직히 말해서 나는 C++을 많이 사용하지 않았기 때문에이 규칙을 사용했다 : "모든 프리미티브가 아닌 변수 앞에 *를 추가하면 Java와 비슷하게 작동한다"는 것을 적어도 경험했다. 나는 그것이 무례하다는 것을 안다 ... 어쨌든 당신의 답변을 주셔서 감사합니다. –

+1

_ "모든 프리미티브가 아닌 변수 앞에 a *를 추가하면 자바처럼 작동 할 것입니다"_ 끔찍한 규칙입니다. C++에는 네이티브 가비지 컬렉터가 없으므로 Java처럼 작동하지 않습니다. – Chad

답변

4

"새로 만든"벡터를 삭제하는 사람이 없어서 메모리가 누출됩니다.

왜 벡터에 대한 포인터가 있습니까? 값 비싼 생성자에 복사하는 것에 대해 걱정하십니까? 지금까지,

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

을 안 :

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

변경 initialiser 목록을 사용하는 생성자 :

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

을 그리고 다음과 같이 호출하지

변경 회원은 벡터가 될 수 있습니다 왜 당신이 그렇게하고 있는지 정확히 알지 못한다면, 심지어는 다시 생각해 보지 않는 한, "새로운"객체를 생성하십시오.

성능 참고 : 예 은 컴파일러의 복사 제거에 따라 벡터 복사를 발생시킵니다. 대안 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

나중에 필요할 경우 누구가 삭제해야합니까? 내가 더 이상 클래스 A를 사용하지 않으면 GC가 삭제하지 않을 것입니까? –

+1

GC가 없습니다. – polkadotcadaver

0

오류가 CPP 파일에있다, 당신이 '

나는 이런 식으로했다 두 번째 콜론 누락 :

A::A() { 

또한, 직접과 같이 이니셜 라이저 목록을 사용하여 페이지 초기화 할 수 있습니다 :

가 실제 장점은 포인터와 같은 기본 유형이를 사용하여, 그러나 그것은 좋은 협약하지 않는 것이
A::A(vector<CCPoint>* _p) : 
p(_p) 
{} 

. 이 질문에 대한 대답이 있습니까? 귀하의 게시물을 기반으로 정확하게 문제가 무엇인지 명확하지 않습니다.