저는 Kerrek의 대답을 좋아합니다. 그런 식으로 클래스를 인스턴스화 할 수 없으므로 추상 클래스입니다.
그러나 클래스의 전체 선언을 검사하고 소멸자가 가상이라는 사실을 알기 전에는 클래스가 추상이라는 것이 분명하지는 않습니다.
내가 가진 또 다른 아이디어는 #define
을 사용하여 "추상"이라는 단어에 대한 사전 처리기 정의를 만들 수 있다는 것입니다.
struct Foo {};
나는이 함께 볼 수있는 문제는이 추상적으로 클래스를 강요하지 않는 것보다 더 다르지 않을 것이다
abstract struct Foo {};
: 그래서, 당신은 다음과 같은 일을 할 수있는이 방법 매크로를 사용하여 가상 소멸자를 선언 할 수도 있습니다. 같은 뭔가 : 다음
#define ABSTRACT_CLASS(class_name) \
class class_name { \
virtual ~class_name() = 0; //
그리고 지금처럼 사용
class foo {
virtual ~class_name() = 0; // {
// class declaration
};
면책 조항 :로 전환 될
ABSTRACT_CLASS(Foo) {
// class declaration
};
내 매크로는 약간 떨어져있을 수 있습니다. 그것은 실제로 변수 이름을 만지는 ~ 및() 함께 class_name 붙여 넣을 경우 확실하지 않습니다.또한, 내가 직접 할 수 있을지 확신 할 수 없다. 가장 아름다운 해결책은 아니며, 특히 중괄호를 주석 처리하면 다음 줄에 넣으면 작동하지 않을 것이다. 하지만 당신은 추상적 인 것으로 표시 할 수있는 방법을 물었고 나는 그것을 당신에게주었습니다!
와우, 그게 효과가 있니? 'Foo' 디시 컨스터는'Bar'가 해체 될 때 여전히 호출됩니다. – Xymostech
@Xymostech : 당연히 :-) (* 모든 * 순수 가상 함수에 대한 정의를 제공 할 수 있습니다.) –
흥미 롭습니다. Clang이'Foo '를 만들려고 시도 할 때'Foo'에'Foo '라는 미완성 순수 가상 메소드'경고 : Clon이 경고를주었습니다. – Xymostech