2016-11-02 2 views
3

문제는 비 동적 할당으로 인해 컴파일러 오류가 발생하는 클래스를 만드는 것입니다. 예를 들어개체를 동적으로 할당 할 수있는 C++ 클래스를 만드는 방법은 무엇입니까?

:

Employee e1; // compiler error 
Employee *e3 = new Employee; // works fine 
+1

할 수 없습니다. 당신이 할 수있는 유일한 일은 생성자를 private으로 만들고 클래스의'new' 인스턴스를 생성하는'static' 팩토리를 만드는 것입니다. –

+3

그런 클래스 만들기 *는 분명히 문제입니다. 해결책은 단지 그것을하지 않는 것입니다. 진지하게, 이것은 XY 문제처럼 들리지만, 의미있는 대답을 얻으려면이 작업을 통해 무엇을 성취하려고하는지 알려 주어야합니다. 그러면 아마 우리는 당신이 최종 목표를 달성하는 더 좋은 방법을 찾도록 도울 수 있습니다. –

+0

매우 이상한 요구 사항입니다. 그런 제한을 왜 부과하겠습니까? 프로그래머가 평소에 설명하지 않은 일을하지 못하게하려는 것은 정말 실망 스럽습니다. – tadman

답변

0

클래스에서 개인 소멸자를 만듭니다. 개인 소멸자를 만들 때 컴파일러는 일단 사용되지 않으면 스택 세그먼트에서 제거해야하기 때문에 컴파일러에서 동적으로 할당되지 않은 객체를 생성합니다.

+0

그리고 어떻게 그 객체들을'삭제 '할 것을 제안합니까? –

+0

우리는 클래스의 사용자가 객체를 파괴하기 위해 호출 할 수있는 friend 함수 destruct()를 생성합니다. –

+0

그건 거꾸로 보인다. 새로운 게재 위치를 사용하여이를 피할 수 없었습니까? – melpomene

2

생성자를 비공개로 만들고 개체에 공유 포인터를 반환하는 팩터 리를 만들어야합니다.

5

당신은 같은 것을 할 수 있습니다 : 예상대로 다음을 사용하여 작동하지 않습니다

#include <memory> 

struct S { 
    static std::unique_ptr<S> create() { 
     return std::unique_ptr<S>(new S); 
    } 

private: 
    S() {} 
}; 

int main() { 
    auto ptr = S::create(); 
} 

참고 :

S() = default; 

나는 클래스가 처리되기 때문입니다 추측 따라서 집합은 다음과 같이 여전히 작동합니다.

S s{}; 

또한 다음과 같은make_unique이 작업을 할 수있는 생성자에 액세스 할 수 있어야하기 때문에

static std::unique_ptr<S> create() { 
    return std::make_unique<S>(); 
} 

있다고하지만,이 생성자는 개인이기 수 없습니다 :기능은 위의 예에서 작동하지 않습니다.

+0

'S() = delete'을 원하셨습니까? – 0x499602D2

+0

@ 0x499602D2 아니오,'S() = default; '를 의미했습니다. 예제에서 이것을 사용하고'main' 함수에 다음 라인을 추가하십시오 :'S s {};'. 그러면 _unexpected_ (?) 결과가 표시됩니다. 나는 당신을 위해 그렇게 하겠지만, godbolt는 모바일에서 사용할 수 없습니다. :-( – skypjack

관련 문제