Il docente dice di non inizializzare i costruttori dei genitori C ++ vuoti nelle classi figlie è una cattiva pratica!

4

Considera che hai 2 classi semplici:

class Parent {
public:
    virtual void foo() = 0;
};

class Child : public Parent {
    std::vector<Parent*> parents;
public:
    Child() : parents() {}
    virtual void foo() {
        std::cout << "Foo" << std::endl;
    }
};

Mi sembra corretto! Ma il mio insegnante dice che non ho eseguito esplicitamente il costruttore del genitore nel costruttore di Child, anche se non ha argomenti, quella è una cattiva pratica di programmazione!

Per chiarire, voleva che lo facessi invece:

class Child : public Parent {
    std::vector<Parent*> parents;
public:
    Child() : parents(), Parent() {}
    virtual void foo() {
        std::cout << "Foo" << std::endl;
    }
};

Non riesco a trovare alcuna documentazione specifica in C ++ che dica che quello che ho fatto è considerato una cattiva pratica di programmazione o che quello che vuole è considerato una buona pratica di programmazione!

L'inferno! Ha anche esteso la sua teoria a Java, che programma da più di 4 anni e non l'ha mai fatto!

Qualcuno può aiutarmi a trovare un documento ufficiale che dice diversamente o che supporta il mio punto? O almeno i programmatori esperti là fuori che rispettano sempre le convenzioni, qual è la tua opinione!?

Perché per me quello che ho fatto è una buona pratica di programmazione, e che non dovrei essere penalizzato nel mio esame per non aver fatto quello che voleva.

    
posta PatriqDesigns 07.03.2017 - 20:55
fonte

2 risposte

9

è una differenza semantica unica per C ++. Dipende da cosa è la classe genitore. Se non si richiama esplicitamente il costruttore, esso verrà inizializzato di default, che potrebbe non essere affatto inizializzato per i tipi primitivi che sono membri di un tipo semplice (gli UDT con costruttori chiameranno i loro costruttori). Se si richiama esplicitamente il costruttore, si riceverà il costruttore predefinito per un'inizializzazione del valore o UDT, che esclude qualsiasi membro primitivo.

Per quanto ne so, questa distinzione non esiste in altre lingue. Anche varie revisioni di C ++ hanno avuto alcuni comportamenti diversi.

La risposta tipica è di non scrivere tipi che non si costruiscono in modo appropriato, nel qual caso l'inizializzazione di default è perfettamente adeguata. Tuttavia, quando si utilizzano da classi sconosciute o classi di terze parti inaffidabili, può essere una buona pratica forzare in modo difensivo l'inizializzazione del valore.

Vedi link per un altro esempio di dove questo può avere importanza con new .

Nel caso generale, mentre rifiuto la tua idea implicita che 4 anni di Java contino come una sorta di esperienza utile, sono d'accordo che non c'è nulla di sbagliato nel non chiamare esplicitamente i costruttori della classe base quando si è soddisfatti del comportamento predefinito costruttore.

    
risposta data 07.03.2017 - 21:49
fonte
2

L'opinione del tuo insegnante varia dalla moderna pratica professionale. Non scrivere codice non necessario. Fa solo meravigliare un esperto "Perché è lì?" Quando la risposta è "nessuna buona ragione", l'esperto pensa semplicemente "WTFF?"

Molti professori CS sono disconnessi con la pratica degli esperti di consenso. Se vuoi vedere come è realmente fatta la programmazione, guarda il codice da importanti progetti open-source. Per C ++ puoi guardare il sorgente per STL o Boost.

Ricorda che in realtà la programmazione di questi giorni generalmente è più utile della programmazione di programmazione.

    
risposta data 07.03.2017 - 21:12
fonte

Leggi altre domande sui tag