2010-03-18 7 views
1

다른 클래스의 개체에 대한 포인터를 두 개 포함하는 클래스 A가 있습니다. 다른 매개 변수를 사용하는 init()으로 전달되는 포인터에 따라 하나의 포인터 또는 다른 포인터를 초기화하려고합니다.C에서 포인터 복사

이제
class A { 

public: 
    A(); 
    init(int parameter, int otherParameter, B* toBeInitialized); 

protected: 
    B* myB; 
    B* myOtherB; 

}; 

내 포인트 나뿐만 init()를 호출 할 것입니다 : 내 상황은 다음과 이렇게이다

:

init(640, 480, this->myB); 

또는 지금

init(640, 480, this->myOtherB); 

, 내 초기화는 다음과 같이 구현됩니다
void init(int parameter, int otherParameter, B* toBeInitialized) { 

    toBeInitialized = someConstructorFunction(parameter, otherParameter); 

} 

문제점은 두 포인터가 초기화되지 않았으므로 toBeInitialized가 겹쳐 쓰여졌지만 원래 매개 변수가 수정되지 않았다고 의심됩니다.

내가 잘못하고있는 것이 있습니까? 포인터에 대한 참조를 사용해야합니까?


마소

+8

될 것이다. –

답변

6

예, 변경 원래 코드 toBeInitialized에서

void init(int parameter, int otherParameter, B*& toBeInitialized) { 

    toBeInitialized = someConstructorFunction(parameter, otherParameter); 

} 

에이 값에 의해 전달되며 해당 변수의 로컬 복사본이 수정됩니다 감사합니다.

2

을 값으로 전달하므로 init()에서 수정 된 값은 외부에 반영되지 않습니다. toBeInitialized 포인터 또는 이중 포인터에 대한 참조를 전달해야합니다. 즉, 변경 초기화 서명 init(int, int, B*&) 또는

3

init(int,int,B**); 분명히 잘라 다운 문제이지만, 이런 식으로 뭔가를하는 것이하지 좋을 것이다 명시된 바와 같이 :

class A { 

public: 
    A(); 
    B* buildB(int parameter, int otherParameter); 

protected: 
    B* myB; 
    B* myOtherB; 

}; 

그런 다음

로 함수를 호출
this->myB = buildB(640, 480); 

멤버에 대한 참조 또는 포인터로 세 번째 매개 변수를 변환해도 작동하지만 디자인이 잘못되었을 수도 있습니다.

+0

나도 안다.하지만 실제로이 방법은 두 가지 이상을 초기화하므로 모두 반환 할 수는 없다. – tunnuz

+0

@ tunnuz : 그러면 디자인에 더 많은 작업이 필요할 것입니다. 독립적으로 초기화 할 수있는 여러 멤버 집합이 있다면 별도의 클래스로 분할하는 것을 고려하십시오. –

1

회원에 대한 포인터 사용을 고려하십시오.

void A::init(int p1, int p2, B * A::* memberToInit) 
{ 
    this->*memberToInit = SomeConstructorFunc(p1, p2); 
} 

을 (가. 당신에게 좀 더 안전을 줄 것이다) 그리고 사용은 매우 끔찍한 디자인입니다

myObject.init(480, 620, &A::myB);