오류: 추상 클래스를 인스턴스화할 수 없습니다.

Olyu Chusang Keullaeseuleul Inseuteonseuhwahal Su Eobs Seubnida



이 문서는 코드에서 추상 클래스로 작업할 때 자주 발생하는 또 다른 오류에 관한 것입니다. 객체 지향 프로그래밍에서 추상 클래스의 개념을 공부해 봅시다. 자신으로부터 객체를 생성할 수 없는 클래스를 추상 클래스라고 합니다. C++ 언어에서는 인터페이스라고도 합니다. 순수 가상 함수를 선언함으로써 모든 클래스를 C++ 언어로 추상화할 수 있습니다. 가상 함수를 선언하려면 함수 뒤에 '=0'을 붙여야 합니다. 추상 클래스는 다른 모든 자식 클래스가 파생되는 부모 또는 기본 클래스 역할을 합니다. 따라서 추상 클래스에 액세스하려면 기본 클래스에서 상속해야 합니다. 추상 클래스를 인스턴스화하려고 하면 컴파일 오류가 발생합니다.

통사론

오류의 오류 메시지는 다음과 같습니다.

오류 : 변수 ' '을(를) 추상 유형 ''으로 선언할 수 없습니다.

빈 괄호 안에는 변수 및 추상 클래스 이름이 있습니다.







오류 C2259 : '상태' : 추상 클래스를 인스턴스화할 수 없습니다.

이것은 이러한 오류가 발생했을 때 컴파일러에서 얻는 또 다른 메시지입니다.



예 # 01:

이 오류를 이해할 수 있도록 오류가 발생하는 방식으로 코드를 작성하는 예제를 수행합니다. 이를 위해 'ShapeClass'라는 이름으로 클래스를 초기화했습니다. 이 클래스를 추상화하기 위해 'getArea'라는 이름으로 가상 함수를 선언했습니다. 우리는 각각 'setWidth'와 'setHeight'라는 이름으로 두 개의 다른 함수도 선언했습니다. 여기서 우리가 하려는 것은 높이를 매개변수로, 너비를 입력 매개변수로 얻고자 한다는 것입니다. 입력 매개변수를 사용하여 면적을 계산할 것입니다. 기본 메서드에서 클래스의 인스턴스를 만들었습니다. 해당 개체의 도움으로 메서드를 호출했으며 해당 메서드를 통해 입력 매개 변수를 전달합니다. 그런 다음 결과를 확인하기 위해 출력을 인쇄했습니다.



#include

네임스페이스 표준 사용 ;
클래스 ShapeClass
{
공공의 :
가상 정수 게타리아 ( ) = 0 ;
무효의 setWidth ( 정수 안에 )
{
너비 = 안에 ;
}
무효의 setHeight ( 정수 시간 )
{
= 시간 ;
}
보호 :
정수 너비 ;
정수 ;
} ;
정수 기본 ( 무효의 )
{
ShapeClasssh ;
쉿. setWidth ( 1 ) ;
쉿. setHeight ( ) ;
쿠우트 << '총 사각형 영역: ' << 쉿. 게타리아 ( ) << ;
반품 0 ;
}

코드 실행 후 시스템에서 오류가 발생했습니다. 오류 메시지는 변수 'sh'를 추상 유형 'shapeclass'로 선언할 수 없다고 말합니다. 이제 컴파일러는 'ShapeClass'가 추상 유형이며 해당 변수를 선언할 수 없음을 전달하려고 합니다. 따라서 메시지를 통해 우리는 컴파일러가 우리가 추상 클래스를 인스턴스화하도록 허용하지 않는다는 것을 명확하게 이해할 수 있습니다. 이것이 시스템이 우리에게 오류를 제공하는 이유입니다.





오류를 해결하기 위해 다른 클래스 'Rectangle'을 선언했습니다. 이 클래스는 추상 클래스의 자식 클래스가 될 것이며 이 클래스에서 가상 함수의 본문을 선언할 것입니다. 그런 다음 기본 메서드에서 개체를 만들고 해당 개체의 도움을 받아 함수를 호출합니다.



수정 후 우리는 코드를 만들었고 이제 성공적으로 코드를 실행했습니다. 시스템이 오류 없이 코드를 실행했습니다. 출력에서 시스템이 직사각형의 면적을 계산하고 출력을 인쇄한 것을 볼 수 있습니다. 우리는 잘못된 접근법인 추상 클래스의 객체를 직접 호출한 것이 우리의 실수라는 것을 배웠습니다. 자식 클래스의 개체를 호출했을 때 코드가 제대로 작동하기 시작했습니다.

예 # 02:

이 예에서는 수학적 계산을 수행하지 않습니다. 이 예제는 추상 클래스를 이해하고 코드를 실행하는 동안 컴파일러가 메서드와 클래스 간에 실행되는 방식을 이해하는 데 도움이 되는 일반적인 예제입니다. 이 클래스에서는 추상 클래스를 만들고 이름을 'AbsClass'로 지정했습니다. 다른 클래스 'ChildClass'를 선언했지만 이 클래스는 추상 클래스가 아닙니다. 이 클래스는 추상 클래스에서 파생됩니다.

추상 클래스에 선언된 메서드에 '객체를 사용하여 전달된 값'을 인쇄했습니다. 함수 이름은 'valueFunc'입니다. 논의한 것처럼 가상 함수의 본문은 자식 클래스에서 선언됩니다. 자식 클래스에서는 가상 함수 본문에 'In virtual function'을 인쇄했습니다. 이제 가치 함수에 값을 전달하고 도달한 값이 올바른지 확인합니다. 기본 메서드에서 추상 클래스의 인스턴스를 만들었고 인스턴스의 도움으로 가상 및 기타 함수를 호출합니다. 이제 코드를 실행할 것입니다.

#include

네임스페이스 표준 사용 ;
클래스 AbsClass
{
공공의 :
가상 정수 VirtFunc ( ) = 0 ;
무효의 valueFunc ( 정수 안에 )
{
너비 = 안에 ;
쿠우트 << '객체를 사용하여 전달된 값' << 안에 << ;
}
보호 :
정수 너비 ;
} ;
클래스 차일드 클래스 :
공개 AbsClass
{
공공의 :
정수 VirtFunc ( ) {
쿠우트 << '가상 기능에서' << ;
}
} ;
정수 기본 ( 무효의 )
{
차일드 클래스 cc ;
참조 valueFunc ( 5 ) ;
쿠우트 << 참조 VirtFunc ( ) << ;
반품 0 ;
}

코드 실행 후 오류가 발생합니다. 이 오류는 기본적으로 여기에서 주 메서드에서 수행하려는 추상 클래스를 인스턴스화할 수 없기 때문입니다. 여기서 주목해야 할 한 가지는 메시지의 변수 및 추상 유형이 변경되었다는 것입니다.

이제 오류를 제거하고 코드를 실행해 보겠습니다. 이를 위해 자식 클래스의 개체를 만들고 인스턴스를 만듭니다. 해당 인스턴스의 도움으로 추상 클래스에서 가상 메서드와 다른 메서드를 모두 호출합니다. 또한 자식 클래스를 사용하여 가상 함수에 액세스할 수 있는지 여부도 관찰됩니다. 그렇게 하는 데 성공하면 파생 클래스를 사용하여 추상 클래스에 액세스했다고 말할 수 있습니다.

우리 코드를 실행할 때 컴파일러는 이번에는 어떤 오류도 발생시키지 않았습니다. 대신 시스템이 코드를 성공적으로 컴파일하고 출력을 제공했습니다. 이제 출력을 살펴보겠습니다. 시스템은 '객체를 사용하여 전달된 값'과 이에 대해 '5'를 인쇄했습니다. 기본 메서드에서 인스턴스를 사용하여 5를 전달했기 때문입니다. 그런 다음 가상 함수에서 요청한 줄을 인쇄했습니다.

결론

이 가이드에서는 객체 지향 개념을 코딩하고 연습하는 동안 프로그래머가 직면하는 중요한 오류에 대해 논의했습니다. 이러한 유형의 오류는 프로그래머가 추상 클래스를 처리할 때 자주 발생합니다. 전체 기사는 추상 클래스를 인스턴스화할 수 없으며 해당 개체에서 메서드를 호출하도록 만들 수 없다고 요약합니다. 또한 다양한 예제를 시도하여 오류를 생성한 다음 코드의 오류를 해결했습니다.