2012-04-02 9 views
0

Ich versuche, ein dynamisches String-Array in der folgenden Art und Weise zu verteilen und ich erhalte eine Fehlermeldung:Dynamische String-Array Zuordnungsfehler

struct Test 
{ 
    std::string producer[]; 
    std::string golden[]; 
}; 

Test test1 = 
{ 
     {"producer1", "producer2"} , 
     {"golden1" , "golden2"} 
}; 

Der Fehler i bekommen, dass es zu viele Initialisierer für std::string[0], aber wenn ich aus dem Array-Teil aussteige funktioniert es:

struct Test 
{ 
    std::string producer; 
    std::string golden; 
}; 

Test test1 = 
{ 
     "producer1" , 
     "golden1" 
}; 

Vielen Dank im Voraus!

+0

'std :: string Hersteller [];' Sie können nicht Deklarieren Sie ein Array, ohne zu sagen, wie viele Elemente enthalten sein sollen. –

+0

@Bo Sie können, aber Sie können es nicht definieren, Sie müssen es dynamisch tun. – littleadv

+0

@littleadv Ja, aber eine nicht statische Elementdeklaration ist eine Definition und erfordert die Größe. Und Sie können kein Ding, das deklariert wurde, dynamisch zuweisen. Um eine 'string []' dynamisch zuzuweisen, müssten Sie das Objekt als 'string *', nicht als 'string []' definieren. Die einzigen Stellen, an denen und tatsächlich 'string []' zulässig wäre, ist ein 'extern'- oder ein Referenzparameter für eine Funktion (aber das ist ein bisschen schwierig, da man die Funktion dann nicht an ein Array übergeben kann, dessen Größe bekannt ist). . –

Antwort

3

Sie können Arrays der Größe Null nicht auf diese Weise initialisieren, da Sie den Speicher dynamisch zuweisen müssen. Sie können nur das tun, was Sie tun, wenn Sie die Dimensionen in der Typdefinition angeben.

Siehe meine Antwort auf eine ähnliche Frage here.

1

Sie können mit C++ 11 einheitliche Initialisierung:

struct Test 
{ 
    vector<string> producer; 
    vector<string> golden; 
}; 

Test test1 = 
{ 
    {"producer1", "producer2"}, 
    {"golden1", "golden2"} 
}; 

Der folgende Beispielcode kompiliert mit g ++ fein:

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

struct Test 
{ 
    vector<string> producer; 
    vector<string> golden; 
}; 


ostream & operator<<(ostream & os, const Test & test) 
{ 
    os << "------------------------" << endl; 
    os << "producer={" << endl; 
    for (auto& p : test.producer) 
    { 
     os << '\t' << p << endl; 
    } 
    os << "}" << endl; 

    os << "golden={" << endl; 
    for (auto& p : test.golden) 
    { 
     os << '\t' << p << endl; 
    } 
    os << "}"; 
    os << "------------------------" << endl; 

    return os; 
} 



int main() 
{ 
    Test test1 = 
    { 
     {"producer1", "producer2"}, 
     {"golden1", "golden2"} 
    }; 

    cout << test1 << endl; 


    return 0; 
}