Array in class initialisieren



  • Hallo,

    wie lautet die Syntax, wenn ich folgendes erreichen möchte:

    class A {
    public:
        A() {
            arr = {1,2,3};
        }
    
        int arr[3];
    };
    

    Wie geht das richtig und geht das auch über die initialisierungsliste 😕



  • ist evtl std::vector für dich eine Möglichkeit?

    Edit:

    std::initializer_list ist erst ab C++0x verfügbar:

    struct A
    {
    	A(const std::initializer_list<int>& lst = {})
    		: arr(lst.size() ? new int[lst.size()] : nullptr)
    	{
    		size_t i = 0;
    		for (auto it = lst.begin(); it != lst.end(); ++it, ++i)
    			arr[i] = *it;
    	}
    	~A() {delete[] arr;}
    
    	int* arr;
    };
    


  • class A
    {
    	public:
    		A() : arr( {1,2,3} ) {};
    		int arr[3];
    }
    

    das scheint auch zu gehen



  • Dann würde ich aber

    class A
    {
    public:
    	A(int a = 0, int b = 0, int c = 0)
    	{
    		arr[0] = a, arr[1] = b, arr[2] = c;
    	}
    	int arr[3];
    };
    

    benutzen.

    Anm: GCC gibt die Warnungn "list-initializer for non-class type must not be parenthesized" aus bei folgendem Code:

    class A
    {
    public:
    	A(int a = 0, int b = 0, int c = 0) 
    		: arr({a, b, c}) {}
    	int arr[3];
    };
    

    in C++0x ist übrigens auch folgendes möglich:

    class A
    {
    public:
    	int arr[3]{1, 2, 3};
    };
    


  • Cyres schrieb:

    Dann würde ich aber

    class A
    {
    public:
    	A(int a = 0, int b = 0, int c = 0)
    	{
    		arr[0] = a, arr[1] = b, arr[2] = c;
    	}
    	int arr[3];
    };
    

    benutzen.

    ???
    Dann doch lieber gleich einfach einen STL-Container...

    Cyres schrieb:

    Anm: GCC gibt die Warnungn "list-initializer for non-class type must not be parenthesized" aus bei folgendem Code:

    class A
    {
    public:
    	A(int a = 0, int b = 0, int c = 0) 
    		: arr({a, b, c}) {}
    	int arr[3];
    };
    

    Das liegt an der Uniform-Initialization. Vorher ging das gar nich (mit C++98), nur mit statischen Variablen; Jetzt geht es, lass aber die runden Klammern weg.

    Cyres schrieb:

    in C++0x ist übrigens auch folgendes möglich:

    class A
    {
    public:
    	int arr[3]{1, 2, 3};
    };
    

    Non-static data member initializers sind aber recht neu und werden gerade mal von GCC 4.8/7 unterstützt. Das ist auch wieder Uniform Initialization. Genau dasselbe geht auch im Konstruktor (s.o.).,



  • Cyres schrieb:

    ist evtl std::vector für dich eine Möglichkeit?

    Sone schrieb:

    Dann doch lieber gleich einfach einen STL-Container...

    Cyres schrieb:

    in C++0x ist übrigens auch folgendes möglich:

    Sone schrieb:

    Non-static data member initializers sind aber recht neu und werden gerade mal von GCC 4.8/7 unterstützt. Das ist auch wieder Uniform Initialization. Genau dasselbe geht auch im Konstruktor (s.o.).,

    Merkste was?



  • Cyres schrieb:

    Cyres schrieb:

    ist evtl std::vector für dich eine Möglichkeit?

    Sone schrieb:

    Dann doch lieber gleich einfach einen STL-Container...

    Damit meinte ich, schlag ihm gar nicht erst vor, wie er das Problem mit C-Arrays lösen kann. Sondern zwing ihn praktisch, die bessere Lösung zu nehmen.

    Jetzt kommt er gleich an und sagt: ja funktioniert std::vector ist zu kompliziert danke

    Cyres schrieb:

    Cyres schrieb:

    in C++0x ist übrigens auch folgendes möglich:

    Sone schrieb:

    Non-static data member initializers sind aber recht neu und werden gerade mal von GCC 4.8/7 unterstützt. Das ist auch wieder Uniform Initialization. Genau dasselbe geht auch im Konstruktor (s.o.).,

    Merkste was?

    Nope. Selbst C++11-unterstützende Compiler unterstützen dieses Feature noch nicht. Also sollte man vorsichtig sein, Sachen wie (bspw.) delegation oder inheritable constructors vorzuschlagen.

    Du merkst einfach nicht, dass Anfänger nicht viel Erfahrung haben, weder mit C++11 noch mit Compilern (Installation, Einrichtung, usw.)
    Also lieber erst einmal noch C++98-konforme Programme posten, anstatt dem TE mit anderem Zeug zu verwirren.



  • Wenn jemand fragt, wie etwas geht, dann sage ich, falls ich es weiß, wie es geht, sage aber auch, dass es bessere Möglichkeiten gibt. Und die Initialisier-List gehört zum Standard-C++11.



  • Cyres schrieb:

    Und die Initialisier-List gehört zum Standard-C++11.

    Na auf die bezog sich das doch überhaupt nicht! Sondern auf non-static data member initializers.



  • Ich kann keinen vector nehmen (hab auf der zielplattform keine stl 😉 ), daher die frage.

    Jetzt weiß ich, dass es mit meinem Compiler einfach nicht geht, Ende.



  • esgibtdenvektorja schrieb:

    Ich kann keinen vector nehmen (hab auf der zielplattform keine stl 😉 )

    WTF?
    std::vector gehört zum Standard. Was hast du denn für eine Zielplattform?
    😮

    Also ich kann mir gut vorstellen dass du das mit einer anderen "STL" verwechselst.


Anmelden zum Antworten