Jak se vám deklarovat pole v záhlaví C ++?

hlasů
21

S tím souvisí i některé další otázky, jako: to , a některé z mých dalších otázek.

V této otázce , a jiní, vidíme, můžeme deklarovat a inicializovat řetězec polí v jednom pěkném kroku, například:

const char* const list[] = {zip, zam, bam}; //from other question

To lze provést při provádění funkce s nevadí, nebo v těle souboru cpp, mimo jakýkoli rámec.

To, co chci udělat, je mít celou řadu takhle as člen skupiny I am using, něco takového:

class DataProvider : public SomethingElse
{
    const char* const mStringData[] = {Name1, Name2, Name3, ... NameX};

public:
    DataProvider();
    ~DataProvider();

    char* GetData()
    {
        int index = GetCurrentIndex(); //work out the index based on some other data
        return mStringData[index]; //error checking and what have you omitted
    }

};

Ale kompilátor stěžuje, a já nedokážu pochopit, proč. Je možné deklarovat a inicializovat matici takhle v jednom kroku v definici třídy? Existují alternativy, které jsou lepší?

Jsem si jist, že se jedná o velmi amatérský chyba, ale jako vždy, vaše pomoc a poradenství je velmi ceněn.

Na zdraví,

Xan

Položena 12/11/2008 v 19:22
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
18

Použijte klíčová slova statické a externí inicializace, aby se pole statický člen třídy:

V záhlaví souboru:

class DataProvider : public SomethingElse
{
    static const char* const mStringData[];

public:
    DataProvider();
    ~DataProvider();

    const char* const GetData()
    {
        int index = GetCurrentIndex(); //work out the index based on some other data
        return mStringData[index]; //error checking and what have you omitted
    }

};

V souboru cpp:

const char* const DataProvider::mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"};
Odpovězeno 12/11/2008 v 19:29
zdroj uživatelem

hlasů
3

Důvod, proč nemůžete deklarovat své pole jako že (const char * []), je to, že:

  • nemůžete mít inicializátory v deklaraci třídy, a tak
  • syntaxe const char* []neuvádí, kolik prostoru kompilátor potřebuje přidělit pro každou instanci (vaše pole je deklarován jako proměnnou instance).

Kromě toho, budete pravděpodobně chtít, aby se toto pole statická, protože to je v podstatě konstantní hodnota.

Odpovězeno 12/11/2008 v 19:25
zdroj uživatelem

hlasů
3

To není možné v jazyce C ++. Nemůžete přímo inicializaci pole. Místo toho budete muset dát mu velikost bude mít (4 ve vašem případě), a máte k inicializaci pole v konstruktoru DataProvider:

class DataProvider {
    enum { SIZEOF_VALUES = 4 };
    const char * values[SIZEOF_VALUES];

    public:
    DataProvider() {
        const char * const v[SIZEOF_VALUES] = { 
            "one", "two", "three", "four" 
        };
        std::copy(v, v + SIZEOF_VALUES, values);
    }
};

Všimněte si, že budete muset vzdát const-nost těchto ukazatelů v poli, protože nemůžete přímo inicializaci pole. Ale je třeba, aby později nastavit ukazatele na správné hodnoty, a tím i ukazatele musí být modifikovatelné.

Pokud vaše hodnoty v poli jsou const však jediný způsob, jak je použít statické pole:

/* in the header file */
class DataProvider {
    enum { SIZEOF_VALUES = 4 };
    static const char * const values[SIZEOF_VALUES];
};

/* in cpp file: */

const char * const DataProvider::values[SIZEOF_VALUES] = 
    { "one", "two", "three", "four" };

Mít statické pole znamená, že všechny objekty budou sdílet toto pole. Tak budete mít uloženy paměť moc.

Odpovězeno 12/11/2008 v 19:25
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more