Surowe tablice w C++ są dość denerwujące i najeżone niebezpieczeństwem. Dlatego też, chyba że masz bardzo dobry powód, powinieneś użyć std::vector
lub std::array
.
Po pierwsze, jak powiedzieli inni, char[2]
to nie to samo co char*
, a przynajmniej nie zwykle. char[2]
jest tablicą o rozmiarze 2 z char
i char*
jest wskaźnikiem do char
. Często stają się zdezorientowani, ponieważ tablice ulegają rozpadowi do wskaźnika do pierwszego elementu, gdy tylko zajdzie taka potrzeba. Tak to działa:
char foo[2];
char* bar = foo;
Ale odwrotna nie:
const char* bar = "hello";
const char foo[6] = bar; // ERROR
Dodanie do zamieszania, podczas deklarowania parametrów funkcji, char[]
jest równoważna char*
. Tak więc w konstruktorze parametr char short_name[2]
jest naprawdę char* short_name
.
Innym dziwactwem tablic jest to, że nie mogą być kopiowane tak jak inne typy (to wyjaśnienie, dlaczego tablice w parametrach funkcji są traktowane jako wskaźniki).Tak na przykład mogę nie zrobić coś takiego:
char foo[2] = {'a', 'b'};
char bar[2] = foo;
Zamiast muszę iteracyjne nad elementami foo
i skopiować je do bar
, lub korzystać z niektórych funkcji, która robi to dla mnie taki jak 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));
Więc w konstruktora trzeba ręcznie skopiować elementy short_name
do 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));
}
Jak widać, wszystko to jest bardzo denerwujące, więc jeśli nie masz bardzo dobrego powodu, powinieneś użyć std::vector
zamiast surowych tablic (lub w tym przypadku prawdopodobnie std::string
).
'Już wymyśliłem, że char [2] <=> char *' not really. – Rapptz
ale myślałem, że kompilator C++ jest char [2] równoważne char *?! Naprawdę nie mam pojęcia, jak zainicjować tego konstruktora i getters corretly ... – vicR
Tablice i wskaźniki są * bardzo * różne rzeczy. Przeczytaj sekcję 6 w [comp.lang.c FAQ] (http://www.c-faq.com/); zasady w tej dziedzinie są zasadniczo takie same dla C i C++. –