c++ 상호 참조 오류 관련하여 질문드립니다(초보)


  • 2017년 11월 27일에 작성됨

조회수 87


1 답변


좋아요
1
싫어요
채택취소하기

상호 참조와 헤더 가드에 대한 문제네요.

헤더 가드

올려 주신 헤더 파일을 보면 헤더 가드가 없습니다. 헤더 가드는 여러곳에서 include 되는 헤더의 내용이 중복되지 않게 하는 역할을 합니다. 헤더 가드가 없다면 전처리기는 헤더가 include 될 때 마다 해당 위치에 붙여 넣게 됩니다.

올려 주신 MainMenu.hSubMenu.h는 서로를 include 하고 있습니다. 그렇다는 것은 MainMenu.h 가 include 되면 SubMenu.h 가 include 되고, SubMenu.h 가 include 되어 MainMenu.h 를 include 하고, MainMenu.h 가 되기 때문에 SubMenu.h 하는 작업을 무한히 진행하게 됩니다.

때문에 말씀하신 C1014 error 발생(포함 파일이 너무 많습니다. 수준 = 1024) 오류가 발생하는 것이지요.

이를 해결하기 위해서는 앞서 말씀드린 헤더 가드를 추가할 필요가 있습니다. 헤더 가드를 추가하는 방법은 여러가지가 있으나 가장 간단한 방법은 #pragma once 를 헤더의 첫 번째 줄에 입력하는 것입니다. 이 방법은 표준은 아니나 사실상 표준이여서 거의 대부분의 컴파일러에서 사용 가능합니다.

그러니 아래 처럼 헤더 가드를 추가해주세요.

#pragam once
// ...

상호 참조

C++ 에서는 정의가 완료되지 않는 클래스를 바로 사용할 수 없습니다.

MainMenu 클래스가 정의되기 위해서 SubMenu1 클래스가 정의되어야합니다. SubMenu1 클래스가 정의되기 위해서는 MainMenu 클래스가 정의되어야합니다. 하지만 C++ 는 정의가 완료되지 않는 클래스는 바로 사용할 수 없기에 오류가 발생할 것입니다.

이 문제를 해결하는 방법으로 전방 선언, 헤더 추가의 순서를 지정, cpp 분리를 통한 의존성 숨기기 등 여러가지 방법이 있습니다.

다행히도 작성하신 두 클래스는 멤버 변수로 서로를 참조하고 있지는 않아 쉽게 해결 가능한 단계입니다.

일단 MainMenu.cppSubMenu.cpp 를 생성합니다. 그 후 두 클래스의 멤버 함수들의 정의를 각각의 cpp 파일에 이동시키세요. 그리고 MainMenu.hSubMenu.h 에서 서로를 include 하는 코드 또한 각각의 cpp 로 이동 시키시면됩니다.

간략하게 작성해보면 아래와 같습니다.

// MainMenu.h
#pragma once

#include <iostream> 
// ...
class MainMenu {
// ...
};
// MainMeny.cpp
#include "MainMenu.h"
#include "SubMenu.h"

Mainmenu::Mainmenu(string m1, string m2, string m3) {
// ...
}
// ...
// SubMenu.h
#pragma once

#include <iostream> 
// ...
class SubMenu1 {
// ...
};
// SubMeny.cpp
#include "SubMenu.h"
#include "MainMenu.h"

Submenu1::Submenu1(string s1, string s2, string s3) {
// ...
}
// ...
  • 2017년 11월 27일에 작성됨

  • 이해하기 쉽게 설명해주셔서 감사드립니다~~! 조언해주신대로 수정하여 빌드 오류 없이 실행 되는데!! 생각하고자 했던대로 SubMenu에서 처음화면으로 돌아가기를 하면 MainMenu가 열리지 않고 다시 Submenu가 열려버리는 것 같네요.. 새로운 질문 등록했는데 혹시 답변해주시면 정말 감사드리겠습니다~!    홍승식   2017.11.27 03:48     
  • 새로운글에 답변해주신 내용이 사라져서 그런데 다시 한번 문의드릴 수 있을까요? ㅠㅠ    홍승식   2017.11.28 02:44     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close