Domanda

In C ++ Ho un riferimento a un oggetto che vuole puntare di nuovo al suo proprietario, ma non posso impostare il puntatore durante la costruzione contenente classe perché la sua non fatto costruire. Così sto cercando di fare qualcosa di simile:

class A {
   public:

     A() : b(this) {}
   private:
     B b;
};

class B {
   public:
     B(A* _a) : a(_a) {}
   private:
     A* a;
};

C'è un modo per garantire B sempre viene inizializzato con un A * senza A possesso di un puntatore a B?

Grazie

È stato utile?

Soluzione

Prova questo:

class A;

class B {
public:
  B(A *_a) : a(_a) {};

private:
  A* a;
};

class A {
public:
  A() : b(this) {};

private:
  B b;

};

Dal momento che B è contenuta completamente in A, deve essere dichiarato prima. Ha bisogno di un puntatore ad A, quindi bisogna inoltrare-dichiarare una prima di dichiarare B.

Questo codice viene compilato con le versioni più o meno corrente di g ++.

Altri suggerimenti

  

In C ++ ho un riferimento a un oggetto che vuole puntare di nuovo al suo proprietario, ma non riesco a impostare il puntatore durante la costruzione contenente classe, perché la sua non è fatto costruire.

È possibile memorizzare il bene puntatore.

Quello che non si può fare è cercare di raggiungere i membri / metodi di A attraverso il puntatore nel costruttore di B, dal momento che l'istanza principale non potrebbe essere inizializzato completamente al punto:

#include <iostream>

class Y;

class X
{
    Y* y;
public:
    X(Y* y);
};

class Y
{
    X x;
    int n;
public:
    Y(): x(this), n(42) {}
    int get_n() const { return n; }
};

X::X(Y* p): y(p)
{
    //Now this is illegal:
    //as it is, the n member has not been initialized yet for parent
    //and hence get_n will return garbage
    std::cout << p->get_n() << '\n';
}

int main()
{
    Y y;
}

Se si dovesse cambiare in giro i membri in Y, in modo da n otterrebbe inizializzato prima, il costruttore di X sarebbe stampare 42, ma che è troppo fragile per dipendere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top