Gli array raw in C++ sono fastidiosi e pieni di pericoli. Questo è il motivo per cui, a meno che tu non abbia una buona ragione, dovresti usare std::vector
o std::array
.
Prima di tutto, come altri hanno già detto, char[2]
non è lo stesso di char*
, o almeno non di solito. char[2]
è una matrice di dimensione 2 di char
e char*
è un puntatore a char
. Spesso si confondono perché gli array decadono da un puntatore al primo elemento ogni volta che ne hanno bisogno. Quindi, questo funziona:
char foo[2];
char* bar = foo;
Ma il contrario non lo fa:
const char* bar = "hello";
const char foo[6] = bar; // ERROR
Aggiungendo alla confusione, quando si dichiara parametri di funzione, char[]
è equivalente a char*
. Quindi nel tuo costruttore il parametro char short_name[2]
è davvero char* short_name
.
Un'altra stranezza degli array è che non possono essere copiati come altri tipi (questa è una spiegazione del motivo per cui gli array nei parametri di funzione sono trattati come puntatori).Così, per esempio posso non fare qualcosa del genere:
char foo[2] = {'a', 'b'};
char bar[2] = foo;
Invece devo iterare sugli elementi di foo
e copiarli in bar
, o usare qualche funzione che lo fa per me, come std::copy
:
char foo[2] = {'a', 'b'};
char bar[2];
// std::begin and std::end are only available in C++11
std::copy(std::begin(foo), std::end(foo), std::begin(bar));
Così nel costruttore è necessario copiare manualmente gli elementi di short_name
in short_name_
:
Territory::Territory(std::string name, char* short_name, Player* owner,
char units) : name_(name), owner_(owner), units_(units)
{
// Note that std::begin and std::end can *not* be used on pointers.
std::copy(short_name, short_name + 2, std::begin(short_name));
}
Come potete vedere, tutto questo è molto fastidioso, quindi, a meno che non si abbia una buona ragione, è sufficiente utilizzare std::vector
invece di matrici non elaborate (o in questo caso probabilmente std::string
).
'Ho già capito che char [2] <=> char *' non proprio. – Rapptz
ma ho pensato che il compilatore C++ fosse char [2] equivalente a char *?! Non ho davvero idea di come avviare questo costruttore e i getter correttamente ... – vicR
Gli array e i puntatori sono * molto * cose diverse. Leggi la sezione 6 delle [domande frequenti su comp.lang.c (http://www.c-faq.com/); le regole in quest'area sono essenzialmente le stesse per C e C++. –