La mia domanda è semplice, il prossimo codice è sicuro?liste di inizializzazione costruttore domanda ordine/assegnazione
struct Parent {
B* _a;
Parent(B* a) : _a(a) {}
};
struct Child : public Parent {
B _b;
Child() : Parent(&_b), _b(2){};
};
int main() {
Child c;
return 0;
}
due punti in più:
- Sono interessato alla parte di passare un riferimento a un oggetto membro al genitore.
- Per sicurezza intendo che verrà assegnato lo
_b
(e il suo indirizzo di memoria) e che questo codice funzionerà indipendentemente dal compilatore che uso.
Grazie in anticipo.
chiarimento
dal sicuro io in realtà ha fatto sì che l'indirizzo di memoria era valido, dal momento che già sapevo che non era inizializzato.
altre note
Nel mio codice vero e proprio ho voluto conservare l'oggetto di tipo B
come un puntatore alla sua classe base A
, in questo modo:
struct Parent {
A* _a;
Parent(A* a) : _a(a) {}
};
struct Child : public Parent {
B _b;
Child() : Parent(&_b), _b(2){};
};
int main() {
Child c;
return 0;
}
Il che, se ho ben capito AndreyT rispondere correttamente , è illegale. Credo che proverò a farlo in modo diverso, poiché questo approccio era soggetto a errori. (Potrei dimenticare che non potevo usare quel puntatore e fare qualcosa con esso nel mio prossimo refactoring).
cosa sono A e B? Perché stai inizializzando un membro B * con A *. A deriva B? Inoltre, B ha un costruttore, che prende 'int' o qualcosa? –
Presumibilmente il costruttore 'Parent' dovrebbe essere' Parent (B * a) '? –
@Kiril Kirov typo, nel mio esempio iniziale A era una superclasse di B. Questo era per mostrare perché ne avrei avuto bisogno. –