C ++ 크로스 파일 상수를 정의하는 가장 좋은 방법
문제
나는 게임을하고 있으며 흥미로운 질문이 있습니다. 하나의 파일로 구현하고 싶은 게임 전체의 상수 값이 있습니다. 지금은 다음과 같은 것이 있습니다.
상수 .cpp
extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;
상수 .hpp
extern const int BEGINNING_HEALTH;
extern const int BEGINNING_MANA;
그런 다음 #include "constants.hpp"만 파일을 파일화하면 상수 중 하나를 템플릿 매개 변수로 사용해야 할 때까지 외부 연결 상수가 유효한 템플릿 매개 변수가 아니기 때문에 이것은 잘 작동했습니다. 제 질문은 이러한 상수를 구현하는 가장 좋은 방법은 무엇입니까? 단순히 상수를 헤더 파일에 넣으면 각 번역 장치에 정의 될 것입니다. 그리고 나는 매크로를 사용하고 싶지 않습니다.
감사
해결책
제거하십시오 extern
그리고 당신은 설정됩니다.
이 코드는 모든 것이 "진정한 일정"이므로 내부 연결이 있기 때문에 헤더에서 완벽하게 잘 작동합니다.
const int BEGINNING_HEALTH = 10;
const int BEGINNING_MANA = 5;
const char BEGINNING_NAME[] = "Fred";
const char *const BEGINNING_NAME2 = "Barney";
이 코드는 각 줄에 외부 연결이 있기 때문에 헤더 파일에 안전하게 넣을 수 없습니다 (명시 적으로 또는 진정으로 일정하지 않기 때문에).
extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;
const char *BEGINNING_NAME = "Wilma"; // the characters are const, but the pointer isn't
다른 팁
열거는 어떻습니까?
상수 .hpp
enum {
BEGINNING_HEALTH = 10,
BEGINNING_MANA = 5
}
.hpp 파일에 "static const int"를 사용하고 .cpp 파일에 아무것도 넣지 않습니다 (물론 다른 코드를 제외하고).
네임 스페이스 사용 :
namespace GameBeginning {
const int HEALTH = 10;
const int MANA = 5;
};
그런 다음 u는 player.health = gamebeginning :: Health로 사용할 수 있습니다.
대부분의 컴파일러는 단순히 Const POD 값에 대한 공간을 할당하지 않습니다. 그들은 그들을 최적화하고 마치 마치 마치 마치 #define
D, 그렇지 않습니까?
간단한 일 :
#define BEGINNING_HEALTH 10
남자, 그 날이었다.
오 잠깐만 요 여전히 그렇습니다 날!
아마도 정적 클래스의 선을 따라 뭔가?
class CONSTANTS {
public:
static inline int getMana() { return 10;};
};
제목 질문에 대한 빠른 답변으로, 싱글 톤 패턴은 크로스 파일 상수를 정의하고 객체의 하나의 인스턴스 만 보장하는 최상의 C ++ 방법입니다.
템플릿 매개 변수 문제까지 값이 아닌 유형을 전달해야합니다. 귀하의 유형은 "int"입니다.