2014-09-10 5 views
1

다음과 같은 문제가 있습니다 : 내 생성자에서 매개 변수로 얻은 개체로 작업하는 가장 좋은 방법은 무엇입니까? 초기 개체가 변경되지 않으므로 복사본을 사용하고 싶지 않습니다.생성자의 매개 변수로 작업하기

Obj obj; 

myclass::myclass(Obj& obj) 
{ 
    this->obj = obj; //copy 
} 

void myclass::doSometh() 
{ 
obj.add(....); //working with the copy 
} 

내 솔루션은 포인터를 사용하는 것입니다 :

Obj* obj; 

void myclass::myclass(Obj& obj) 
{ 
    this->obj = &obj; 
} 

void myclass::doSometh() 
{ 
obj->add(....); 
} 

또는

Obj* obj; 

    myclass::myclass(Obj* obj) 
    { 
     this->obj = obj; 
    } 

    void myclass::doSometh() 
    { 
    obj->add(....); 
    } 

어떻게 내 솔루션에 대해 당신이 일을? 또는 더 나은 해결책이 있습니까?

+0

귀하의 솔루션이 작동하지 않을 수의 수명에 따라 달라집니다 'Obj' 객체입니다.이 객체는 세 번째 객체와 비슷합니다. Java, Python, C# 등의 자동 메모리 관리 언어를 사용하는 경우 C++ 객체 수명 및 동적 메모리 관리에 대해 읽어야합니다. – mostruash

+0

초기 객체가 더 이상 존재하지 않으면 내 포인터에 문제가 있지만 whats 이, 스마트 포인터를 사용하여 최고의 솔루션? 잘 그것에 대해 많이 읽었지만이 여전히 최상의 솔루션을 찾을 수 없습니다 – jeromintus

+1

당신이 내부 클래스를 사용할 필요가 없습니다 – 4pie0

답변

1

그냥 참조를 사용

사본을 피하기 위해 포인터 멤버 변수를 사용하여 아무 문제가 없습니다
Obj& obj; 

myclass::myclass(Obj& obj) : obj(obj) {} 
+0

제 생각에는 이것도 사본을 만들 것입니다. 매개 변수로 전달 된 객체는 변경되지 않습니다. – jeromintus

+2

@Sleicreider, 아니요, 복사본을 만들지 않습니다. 매개 변수를 사용하여 참조를 초기화하고 있습니다. 그것은'int & ref = someInt; '와 같다. – chris

+0

오, 나는 Obj obj로 생각했다. & ._ 제외하고. 그리고 평생 동안 문제가 없을까요? – jeromintus

3

. 그러나 포인터가 들어있는 MyClass보다 포인터가 가리키는 포인터가 Obj 인 것으로 확신 할 필요가 있습니다. 당신은 또한 멤버 변수에 대한 참조를 가질 수 비슷한 방법으로

class MyClass { 
private: 
    Obj* obj_; 
public: 
    MyClass(Obj* obj) : obj_(obj) { } 
}; 

를하지만 당신이 클래스로 수행 할 수있는 제한 :

또한, 나는 직접 포인터를 초기화하는 생성자 초기화리스트를 사용하는 것이 좋습니다. 예를 들어이 할당되지 않습니다 :

class MyClass { 
private: 
    Obj& obj_; 
public: 
    MyClass(Obj& obj) : obj_(obj) { } 
}; 

당신이 std::weak_ptr 또는 std::shared_ptr 고려 지적되는 개체의 수명의 자신이없는 경우 :

이 가
#include <memory> 

struct Obj { }; 

class MyClass { 
private: 
    std::weak_ptr<Obj> obj_; 
public: 
    MyClass(std::weak_ptr<Obj> obj) : obj_(std::move(obj)) { } 
    void doSomething() { 
    std::shared_ptr<Obj> obj = obj_.lock(); 
    if (obj) { 
     // do something with obj... 
    } 
    } 
}; 

int main() { 
    std::shared_ptr<Obj> obj = std::make_shared<Obj>(); 
    MyClass mc(obj); 
} 
+0

생성자에 대한 이니셜 라이저 목록을 사용하는 것은 좋은 생각이지만 함수와 매개 변수는 사용할 수 없다. 물체의 생애에 확신을 가지고 무엇을 의미합니까? 오랫동안 충분히 오래 살아 있는지 확인합니다. 이 경우 포인터를 사용하여 들었을 때 주요 소유권 문제가 발생할 수 있습니다 – jeromintus

+0

@Sleicreider 미안하지만 생성자 이니셜 라이저 목록을 사용할 수없는 이유를 모르겠습니다. –

+0

@Sleicreider 개체의 수명과 관련해서는 적어도 Obcl이 MyClass만큼 오래 지속될 것이라는 확신을 가질 수 있습니다. 나는 그것을 더 분명하게하려고 노력할 것이다. –

관련 문제