문제는 비 동적 할당으로 인해 컴파일러 오류가 발생하는 클래스를 만드는 것입니다. 예를 들어개체를 동적으로 할당 할 수있는 C++ 클래스를 만드는 방법은 무엇입니까?
:
Employee e1; // compiler error
Employee *e3 = new Employee; // works fine
문제는 비 동적 할당으로 인해 컴파일러 오류가 발생하는 클래스를 만드는 것입니다. 예를 들어개체를 동적으로 할당 할 수있는 C++ 클래스를 만드는 방법은 무엇입니까?
:
Employee e1; // compiler error
Employee *e3 = new Employee; // works fine
클래스에서 개인 소멸자를 만듭니다. 개인 소멸자를 만들 때 컴파일러는 일단 사용되지 않으면 스택 세그먼트에서 제거해야하기 때문에 컴파일러에서 동적으로 할당되지 않은 객체를 생성합니다.
그리고 어떻게 그 객체들을'삭제 '할 것을 제안합니까? –
우리는 클래스의 사용자가 객체를 파괴하기 위해 호출 할 수있는 friend 함수 destruct()를 생성합니다. –
그건 거꾸로 보인다. 새로운 게재 위치를 사용하여이를 피할 수 없었습니까? – melpomene
생성자를 비공개로 만들고 개체에 공유 포인터를 반환하는 팩터 리를 만들어야합니다.
당신은 같은 것을 할 수 있습니다 : 예상대로 다음을 사용하여 작동하지 않습니다
#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>();
}
있다고하지만,이 생성자는 개인이기 수 없습니다 :기능은 위의 예에서 작동하지 않습니다.
'S() = delete'을 원하셨습니까? – 0x499602D2
@ 0x499602D2 아니오,'S() = default; '를 의미했습니다. 예제에서 이것을 사용하고'main' 함수에 다음 라인을 추가하십시오 :'S s {};'. 그러면 _unexpected_ (?) 결과가 표시됩니다. 나는 당신을 위해 그렇게 하겠지만, godbolt는 모바일에서 사용할 수 없습니다. :-( – skypjack
할 수 없습니다. 당신이 할 수있는 유일한 일은 생성자를 private으로 만들고 클래스의'new' 인스턴스를 생성하는'static' 팩토리를 만드는 것입니다. –
그런 클래스 만들기 *는 분명히 문제입니다. 해결책은 단지 그것을하지 않는 것입니다. 진지하게, 이것은 XY 문제처럼 들리지만, 의미있는 대답을 얻으려면이 작업을 통해 무엇을 성취하려고하는지 알려 주어야합니다. 그러면 아마 우리는 당신이 최종 목표를 달성하는 더 좋은 방법을 찾도록 도울 수 있습니다. –
매우 이상한 요구 사항입니다. 그런 제한을 왜 부과하겠습니까? 프로그래머가 평소에 설명하지 않은 일을하지 못하게하려는 것은 정말 실망 스럽습니다. – tadman