>  기사  >  백엔드 개발  >  C++ 구문 오류: 클래스 멤버는 완전한 유형이어야 합니다. 어떻게 처리해야 합니까?

C++ 구문 오류: 클래스 멤버는 완전한 유형이어야 합니다. 어떻게 처리해야 합니까?

WBOY
WBOY원래의
2023-08-22 12:09:291163검색

C++ 구문 오류: 클래스 멤버는 완전한 유형이어야 합니다. 어떻게 처리해야 합니까?

C++ 프로그래밍에서는 몇 가지 간단한 오류로 인해 프로그램이 올바르게 컴파일되지 않는 경우가 많습니다. 가장 일반적인 실수 중 하나는 클래스 멤버가 완전한 유형이어야 한다는 것입니다. 이 오류 메시지는 클래스 멤버 변수나 멤버 함수를 정의할 때 사용된 데이터 유형이 완전한 유형이 아니어서 컴파일러가 클래스 멤버의 데이터 유형을 인식할 수 없음을 나타냅니다.

이러한 오류는 클래스 간 상호 참조의 경우 발생할 수 있습니다. 예를 들어, 클래스 A는 클래스 B를 참조해야 하는데, 클래스 A가 선언되기 전에 클래스 B가 정의되지 않았습니다. 이때, 클래스 A에 정의된 멤버 변수나 멤버 함수가 클래스 B를 포함하는 경우 이러한 오류가 발생할 수 있습니다.

그렇다면 이 오류는 어떻게 처리해야 할까요? 아래에서는 두 가지 가능한 솔루션을 제공합니다.

방법 1: 사전 선언된 클래스

이 방법은 비교적 간단하고 효과적인 솔루션입니다. 클래스 A를 정의할 때 클래스 B를 클래스 외부에 미리 선언할 수 있습니다. 이런 식으로 클래스 A에서 클래스 B를 사용할 때 컴파일러는 이 유형을 인식할 수 있습니다. 코드 구현은 다음과 같습니다.

class B; //提前声明类B

class A {
    private:
        B* b_ptr;
    public:
        void foo();
};

class B {
    private:
        int b_var;
    public:
        void bar();
};

void A::foo() {
    b_ptr = new B;
}

void B::bar() {
    b_var = 10;
}

int main() {
    A a_obj;
    a_obj.foo();
    return 0;
}

위 코드에서는 클래스 B가 클래스 A보다 먼저 미리 선언되어 있습니다. 이렇게 하면 A클래스를 정의할 때 B클래스를 정상적으로 사용할 수 있다. 클래스 A에는 클래스 B를 가리키는 포인터 b_ptr이 정의되어 있으며 포인터에는 foo() 멤버 함수를 통해 값이 할당됩니다. 동시에 B 클래스도 정상적으로 자신의 멤버 변수와 멤버 함수를 정의하고, bar() 멤버 함수를 통해 멤버 변수 b_var에 값을 할당한다. 마지막으로 A 클래스의 인스턴스 a_obj가 메인 함수에 생성되고 foo() 멤버 함수가 호출됩니다. 프로그램이 올바르게 컴파일되고 실행될 수 있으며 "클래스 멤버는 완전한 유형이어야 합니다"라는 오류 메시지가 더 이상 나타나지 않습니다.

방법 2: 객체 대신 포인터나 참조를 사용하세요

클래스 내 다른 클래스의 멤버 변수나 멤버 함수에 접근해야 하는데 클래스 정의를 처음에 넣을 수 없는 경우 이 방법을 사용할 수 있습니다. 이 경우 개체 자체 대신 개체에 대한 포인터나 참조를 전달할 수 있습니다. 이는 또한 "클래스 멤버가 완전한 유형이어야 합니다"라는 오류를 방지합니다. 코드는 다음과 같이 구현됩니다.

class B; //提前声明类B

class A {
    private:
        B* b_ptr;
    public:
        void foo();
};

class B {
    private:
        int b_var;
    public:
        void bar();
};

void A::foo() {
    b_ptr = new B;
    b_ptr -> bar();
}

void B::bar() {
    b_var = 10;
}

int main() {
    A a_obj;
    a_obj.foo();
    return 0;
}

여기서 클래스 A와 클래스 B의 정의는 여전히 변경되지 않았지만 foo 함수에서는 클래스의 포인터 b_ptr을 연산하여 클래스 B의 멤버 함수 bar()를 호출합니다. 비. 동시에 클래스 B에서는 멤버 변수 b_var에 액세스하는 데 동일한 체계가 사용됩니다.

두 가지 방법은 서로 다르며, 귀하의 필요와 상황에 따라 구체적인 계획을 선택할 수 있습니다. 그러나 일반적으로 이러한 솔루션은 "클래스 멤버가 완전한 유형이어야 합니다"로 인해 발생하는 컴파일 오류를 방지할 수 있습니다. 이 기사가 도움이 되기를 바랍니다.

위 내용은 C++ 구문 오류: 클래스 멤버는 완전한 유형이어야 합니다. 어떻게 처리해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.