2017-09-15 1 views
-2
class shape{ 
public: 
    shape(string a, bool b):name(new string), moral(new bool){ 
     *name=a; 
     *moral=b; 
    } 
    shape():name(new string),moral(new bool){ 
     *name="shape"; 
     *moral=true; 
    } 
    ~shape(){ 
     delete name; 
     delete moral; 
    } 

protected: 
    string* name; 
    bool* moral; 
}; 


class circle:public shape{ 
public: 
    circle(string s, bool bb, double d):shape(new string, new 
bool),radius(new double){ 


    } 
protected: 
    double * radius; 
}; 

Récemment, j'essayais de ramasser C++. Voici un exemple de code que j'ai écrit en apprenant la propriété de l'héritage. Des erreurs apparaissent sur "shape (new string, new bool)" dans le cercle de la classe enfant. Je ne suis pas sûr de ce qui est la bonne syntaxe pour le faire. De plus, j'ai remarqué que si on utilisait des pointeurs dans les classes, la forme de la liste initialize était utilisée pour allouer de la mémoire au lieu d'assigner des valeurs. Y a-t-il de meilleures expressions et syntaxes que je peux utiliser pour faire les deux? Merci les gars d'avance.Syntaxe correcte pour l'héritage en C++ avec la liste d'initialisation et l'allocation de mémoire?

+3

Pourquoi utilisez-vous le nom ': (nouvelle chaîne)' 'au lieu de simplement le nom :(a) '? – Barmar

+0

nom est un pointeur que j'ai créé. Pour la mémoire dynamique, ne devrais-je pas allouer de la mémoire en premier? –

+0

Pourquoi avez-vous besoin d'être dynamique? Pourquoi ne pas avoir juste un 'string' en tant que membre au lieu de' string * '? – Barmar

Répondre

1

préfèrent traiter des valeurs. C++ n'est pas comme java ou C#. Évitez les pointeurs, nouveaux et supprimez pour ce genre de chose.

Si vous n'écrivez pas de destructeur, le compilateur vous donne les destructeurs corrects. copie et se déplace gratuitement.

#include <string> 

class shape{ 
public: 
    shape(std::string a, bool b) : name(a), moral(b) 
    { 
    } 
    shape():name("shape"),moral(true){ 
    } 

protected: 
    std::string name; 
    bool moral; 
}; 


class circle:public shape{ 
public: 
    circle(std::string s, bool bb, double d) 
    : shape(s, bb) 
    , radius(d) 
    { 

    } 
protected: 
    double radius; 
}; 

Mais dans la vraie classe que je veux utiliser la mémoire dynamique pour le stockage:

#include <string> 
#include <memory> 

class shape{ 
public: 
    shape(std::string a, bool b) 
    : name(std::make_unique<std::string>(a)) 
    , moral(b) 
    { 
    } 

    shape() 
    : shape("shape", true) 
    { 
    } 

protected: 
    std::unique_ptr<std::string> name; 
    bool moral; 
}; 


class circle:public shape{ 
public: 
    circle(std::string s, bool bb, double d) 
    : shape(s, bb) 
    , radius(d) 
    { 

    } 
protected: 
    double radius; 
}; 
+0

Eh bien, je sais comment gérer les valeurs mais les pointeurs, c'est la raison pour laquelle je demande s'il existe une syntaxe correcte et simple pour utiliser la mémoire dynamique en classe, en particulier lors de la gestion de l'héritage. –

+0

@TianYuan ok mettra à jour pour démontrer la mémoire dynamique avec des pointeurs intelligents –