Pergunta

Eu estou trabalhando em um jogo e tem uma pergunta interessante. Eu tenho alguns valores constantes em todo o jogo que eu quero implementar em um arquivo. Agora eu tenho algo parecido com isto:

constants.cpp

extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;

constants.hpp

extern const int BEGINNING_HEALTH;
extern const int BEGINNING_MANA;

E, em seguida, apenas arquivos #include "constants.hpp" Este foi ótimo trabalhar, até que eu precisava usar uma das constantes como um parâmetro de modelo, porque as constantes externamente ligados não são parâmetros do modelo válidos. Então, minha pergunta é, qual é a melhor forma de implementar essas constantes? Tenho medo de que simplesmente colocar as constantes em um arquivo de cabeçalho irá causar-lhes a ser definido em cada unidade de tradução. E eu não quero macros de uso.

Graças

Foi útil?

Solução

se livrar do extern e você está definido.

Este código funciona perfeitamente bem em um cabeçalho, porque tudo é "verdadeiramente constante" e, portanto, tem ligação interna:

const int BEGINNING_HEALTH = 10;
const int BEGINNING_MANA = 5;
const char BEGINNING_NAME[] = "Fred";
const char *const BEGINNING_NAME2 = "Barney";

Este código não pode ser seguramente colocar em um arquivo de cabeçalho porque cada linha tem ligação externa (explícita ou por causa de não ser verdadeiramente constante):

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

Outras dicas

Como sobre enums?

constants.hpp

  enum {
    BEGINNING_HEALTH = 10,
    BEGINNING_MANA = 5
  }

Use "const int estático" em seu arquivo .hpp, e nada colocar no arquivo .cpp (exceto qualquer outro código que você tem lá, é claro).

Faça uso de namespaces:

namespace GameBeginning {
    const int HEALTH = 10;
    const int MANA   = 5; 
};

então u pode usar como player.health = GameBeginning :: Saúde;

A maioria dos compiladores simplesmente não alocar espaço para valores POD const. Eles otimizar-los e tratá-los como se tivessem sido #defined, não é?

O que aconteceu com um simples:

#define BEGINNING_HEALTH 10

O homem, aqueles eram os dias.
Oh, espere, os ainda estão os dias!

talvez algo ao longo das linhas de uma classe estática?

class CONSTANTS {
public:
static inline int getMana() { return 10;};
};

Como uma resposta rápida à pergunta do título, um padrão Singleton é uma maneira melhor possível, C ++ para definir constantes de arquivo cruzado e garantir apenas uma instância do objeto.

Quanto ao problema de parâmetro do modelo, você precisa passar um tipo não um valor. Seu tipo é "int".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top