Array und Default Constructor



  • Hallo

    Annahme, eine Klasse A hat einen privaten Default-Konstruktor, der auch
    nicht aufgerufen werden soll. Stattdessen gibt es einen mit Argument 'int x':

    class A
    {
    public:
      A::A(int x);
    
    private:
      A::A();
    }
    
    class B
    {
    public:
      B::B(int x,int y,int z);
    private
      A array[3];
    }
    
    B::B(int x,int y,int z)
    {
      array[0]=A(x);
      array[1]=A(y);
      array[2]=A(z);
    }
    

    Da Array-Elemente nicht in der Initialisierungsliste des Konstruktors von B
    vorkommen dürfen, kann ich array[0],array[1],array[2] erst im Body des
    Konstruktors zuweisen. Der Compiler beschwert sich natürlich, daß der Default-
    Konstruktor von A privat ist. Wie geht man da vor?

    Fällt mir bloß ein, einen vector<A> zu nehmen und im Konstruktor von B mit
    push_back() zu arbeiten, aber gibts da auch eine syntaktisch richtige Lösung
    für Arrays?

    Danke,lg


  • Mod

    Das geht nicht. Umgehe das Problem indem du keine Arrays benutzt:

    http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.5



  • Was gehen würde, wäre einen Defaultparameter zu verwenden.

    #include <iostream>
    using namespace std;
    
    class A
    {
        public:
            A::A(int = 0);
    };
    
    class B
    {
        public:
            B::B(int x,int y,int z);
        private:
            A array[3];
    };
    
    A::A(int x)
    {
    }
    
    B::B(int x,int y,int z)
    {
      array[0]=A(x);
      array[1]=A(y);
      array[2]=A(z);
    }
    
    int main()
    {
    }
    

    [ EDIT ] Sollten Defaultparameter lieber im Prototyp oder bei der Definition angegeben werden ?



  • SeppJ schrieb:

    ...indem du keine Arrays benutzt:

    Habe dazu gerade mal eine allgemeine Frage.
    Sollte man einen Vektor immer einem Array vorziehen, auch bei z.B. so etwas: ?

    int ar[4] = {}
    

  • Mod

    "Immer" ist ein starkes Wort. Was soll man darauf anderes Antworten als "Nein"?

    Gerade Vector und Array sind nicht 100% äquivalent, der vector entspricht ja einem Zeiger auf ein Array auf dem Heap, während das Array sowohl auf dem Heap als auch auf dem Stack liegen kann. Bei Arrays die man auf den Stack legen würde, sollte man eher eine kleine Kapselklasse mit einem statischen Arraymember benutzen, z.B. boost::array.


Anmelden zum Antworten