2010-08-07 5 views
2

void* 포인터를 초기화하기 위해 this을 사용하는 클래스가 있습니다. 하지만 문제는 그 클래스 값을으로 전달하면 포인터가 스택의 새 주소로 변경되지 않는다는 것입니다. 그래서 복사 생성자를 오버라이드하여 this의 새 주소로 포인터를 재 할당하려고 생각했습니다. 하지만 ... 내가 잘 설명 바랍니다C++ : 복사 생성자에 대한 질문

... 나는 일반적으로 생성자 매개 변수에 의해 얻을 슈퍼 클래스 생성자를 호출하는 변수가 필요합니다,하지만 난 내 복사 생성자에서 그들을없는

그래서 질문입니다 : 포인터를 재 할당하는 부분을 추가하는 기본 복사 생성자의 프로 시저를 유지할 수 있습니까? 아니면 더 나은 대안이 있습니까? 다른

class GetsCopiedByValue : public SuperClass 
{ 
    GetsCopiedByValue(Type1 *t1, Type2 *t2, float var1, /* A lot of other things I need */) : 
     SuperClass(t1, t2), var1(var1) 
    { 
     t1->set_GetsCopiedByValue_Address(this); // *** 
    } 
} 

어딘가에 :

덕분에 여기

는 일부 코드

{ 
    GetsCopiedByValue instance (t1, t2, 4.64, /* All the other things */); 
    SomeType *t = new SomeType(instance); // <-- here, it gets copied by value, 
} // but the original "instance" goes (here) out of scope and the address 
    // I assigned (***) is not longer valid, so I have to 
    // reassign the address to the new address, after copying it. 
+1

코드 예제를 게시 할 수 있습니까? 코드가 지금 어떤 모습입니까? – jalf

+3

일부 코드를 게시하십시오. 그리고 무효 *를 사용하는 경우, 아마 잘못했을 가능성이 큽니다. –

+1

"void * 포인터를 초기화 할 때 클래스를 사용합니다." 코드를 제공하면 좋을 것입니다. 어쨌든 왜 왜 무효 *가 필요합니까? – SigTerm

답변

2

확실하지 :

GetsCopiedByValue(GetsCopiedByValue const& other) : 
    SuperClass(other), var1(other.var1) 
{ 
    t1->set_GetsCopiedByValue_Address(this); 
} 

그러나 나는 생각이베이스 클래스 생성자 호출을 생략하더라도, C++ 것 그 그것을 넣으십시오.

+0

+1 : 어, 네, 물론 다른 해결책입니다 :) 호출을 생략하면 기본 클래스의 기본 생성자가 호출되므로 명시 적으로 지정해야합니다. – Troubadour

+0

기본 생성자에 대한 명시 적 호출을 생략하면 필수 기본 생성자가 아닌 기본 기본 생성자에 대한 암시 적 호출이 삽입됩니다. –

0

당신은 당신이 먼저 개체를 생성 할 때 아마 (매개 변수를 저장해야합니다 그래서 그것들을 사용하는 것이기 때문에 수퍼 클래스가된다.) 그리고 복사본 구성에 다시 사용한다. 즉, 복사하고있는 객체로부터 다시 읽는다. 더 나은 여전히 ​​@Konrad Rudoplh suggests으로 수행하고 정의 너무 기본 클래스의 복사 생성자를 사용

편집

. 이 도움이,하지만 당신은 실제로 슈퍼 클래스가 복사 생성자에서 생성자를 복사 호출 할 경우