C++ 클래스명 중복 사용 시 runtime 중 크래시 이슈
Cocos2d-x 와 같은 C++ 환경에선 Kotlin/Java와 달리 파라메터 형식이 다른 동일 이름의 클래스 사용을 허용하지 않는다.
(다형성 허용 X)
보통 같은 프로젝트에서 동일 이름의 클래스가 존재하는 경우 #include 를 통해 헤더를 참조하는 과정에서 개발자가 알아차리거나
빌드 과정에서 중복 에러를 확인하여 확인하게된다.
다만, 클래스명을 중복 사용함에도 불구하고 빌드 에러 없이 런타임 과정에서 크래시 발생한 사항이 있어 사례를 아래처럼 기록해두었다.
클래스의 선언된 형태는 아래와 같았다.
// Apple.hpp
#ifndef Apple_hpp
#define Apple_hpp
class FruitColor {
public:
string externalColor = "red";
string getExternalColor() { return externalColor; }
}
// Banana.hpp
#ifndef Banana_hpp
#define Banana_hpp
class FruitColor {
public:
string externalColor = "yellow";
string getExternalColor() { return externalColor; }
}
위와 같은 각기 다른 헤더 파일명에 동일 클래스가 선언되어 있었고,
참조하는 코드에선 Banana 헤더에서 externalColor를 가져오고 싶었다.
// User.cpp
#include "Banana.hpp"
void User::findColor() {
string bananaColor = MySingletonManager::getInstance()->fruitColor->getExternalColor();
// ...(생략)...
// 예상 : bananaColor == "yellow"
// 결과 : fineColor() 메서드 호출되는 부분에서 일시적 프리징 후 크래시
}
위 User.cpp 에서 구현했던것처럼 Banana.hpp를 선언한 상태에서 fruitColor 객체를 통해 FruitColor 클래스의 함수를 접근하였으나
원하는 결과 대신 get 과정에서 크래시가 발생하였다.
프로젝트내에 너무 많은 헤더와 소스코드가 존재하고 있었고 에러로그로는 명확한 원인을 확인하지 못하다 위와 같은 Apple, Banana 간의 구현 상태를 확인하였고, Banana의 FruitColor 클래스를 FruitColorBanana 처럼 네이밍을 변경하고 나서 크래시 없이 동작하였다.
(물론 위와 같은 과일 특징 형태라면 상속 관계를 사용하였겠지만 예시 코드를 만들기위한 부분으로서 구성하였다.)
다른 헤더 파일이더라도 동일 프로젝트 내에서 클래스명이 중복되지 않도록 C++ 환경에선 좀더 세심한 클래스명 정의가 필요해보인다.