0
votes

C ++ Quelle syntaxe pour éviter les déclarations dupliquées?

J'apprends C ++ et surtout la programmation OO.

Mon programme Utilisez des pointeurs pour faire face à une allocation de mémoire dynamique. P>

Tout en créant mon constructeur par défaut, je m'ennuyais de répéter avec p >

Annonce::Annonce(string Titre, long double Prix, string Intro, string Description, vector<vector<string>> ImgUrls) {

    titre = new string;
    intro = new string;
    description = new string;
    imgUrls = new vector<vector<string>>;
    prix = new long double;

    id = new size_t;
    *id = nbAnnonces;

    *titre = std::move(Titre);
    *prix = Prix;
    *intro = std::move(Intro);
    *description = std::move(Description);
    *imgUrls = std::move(ImgUrls);

}


11 commentaires

"Mon programme utilise des pointeurs pour faire face à une allocation de mémoire dynamique." Cela doit-il? Au lieu de votre classe consistant à std :: string * et std :: vecteur <> * , peut-il juste tenir std :: chaîne et std :: vecteur ? Ces objets gèrent eux-mêmes l'allocation de mémoire dynamique. Nous n'avons donc pas besoin.


J'ai 99,9% certains que vous n'avez pas besoin de ces indicateurs. Regardez-y pour la façon dont un constructeur devrait regarder: Stackoverflow.com/questions/1711990/...


myint = nouveau int; devrait être quelque chose que vous ne faites presque jamais. Même avec intro = nouvelle chaîne;


Vous ne devriez presque jamais utiliser nouveau directement (à l'exception potentiellement comme argument à E.G. std :: partagé_ptr ou std :: unique_ptr membres). Les exemples que vous montrez ici en particulier sont clairement faux. Voir Pourquoi les programmeurs C ++ doivent-ils minimiser l'utilisation de «Nouveau»? . Si votre matériel pédagogique vous a appris à écrire C ++ comme ceci, alors je vous suggère d'arrêter d'utiliser ce matériau et de regarder l'un des Recommandé C ++ Livres à la place.


No myint, myotherint = nouveau INT; ne fonctionnera pas. Recherchez ce que l'opérateur de la virgule fait parce qu'il ne fait pas ce que vous voudriez.


C ++ n'est pas Java. Nouveau peut être de routine en Java, mais il doit être évité ou minimisé en C ++, pour des raisons que la noix pointait.


@John non, ça ne fait pas que j'apprends et j'écris donc seulement pour apprendre des pointeurs et soyez bien avec eux.


@LAURENT Bien que ce soit certainement quelque chose que vous pouvez apprendre, l'une des fonctionnalités de C ++ est la rarement nécessaire de travailler avec une allocation de mémoire dynamique. Pour répondre à votre question, je m'éloignerais d'un moyen plus rapide d'écrire une "nouvelle chaîne" encore et encore à nouveau à tout le moins afin que cela laisse un mauvais goût dans la bouche.


@Nathanoliver la même chose que je réponds à John, il suffit d'apprendre comment les pointeurs fonctionnent et que je n'en ai pas besoin.


@walnut Merci beaucoup pour les liens qu'il est très utile. J'apprendais sur Udemy et avec le livre de Bjarne Stroustrup.


En savoir plus sur la règle de 3/5 / 0. Si vous utilisez des pointeurs dans vos classes, vous devrez suivre la règle de 3 ou 5 au lieu de la règle de 0. https://fr.cppreference.com/w/cpp/language/rule_of_three


3 Réponses :


2
votes

Il n'y a pas de raccourci pour attribuer plusieurs variables de la mémoire dynamique.

Les fonctions d'allocation de mémoire renvoient une seule adresse mémoire (pointeur). Chaque variable doit avoir son propre emplacement en mémoire.

La syntaxe de la langue C ++ devrait modifier afin de prendre en charge les fonctions de mémoire dynamiques qui renvoient plusieurs adresses (pointeurs).

Une recommandation est de réduire la quantité d'allocations de mémoire. Demandez-vous: "Est-ce que j'ai vraiment besoin d'allouer de la mémoire dynamique?" avant d'attribuer de la mémoire dynamique.


0 commentaires

-1
votes

Première suggestion de réponse: ne le faites pas.

Deuxième pré-réponse Suggestion: Évitez la répartition de la mémoire autogérée / distribution et utilisez des conteneurs STL et / ou des pointeurs intelligents ( std :: unique_ptr code >, std :: partagé_ptr code>, etc.) au lieu de p>

réponse: non, aussi loin que je sais que vous ne pouvez pas écrire quelque chose comme p> xxx Pré>

qui alloue les deux variables (avec différents pointeurs alloués). P>

Mais vous pouvez envelopper les pointeurs d'une classe ou d'une structure qui alloue automatiquement le pointeur contenu (et, peut-être, le détruire dans le destructeur ). P>

juste pour le plaisir ... Si vous écrivez un wrapper comme suit p> xxx pré>

Vous pouvez écrire votre annonce code> Way P>

struct Annonce
 {
   wrappPnt<std::string>  titre, intro, description;
   wrappPnt<std::vector<std::vector<std::string>>> imgUrls;
   wrappPnt<long double>  prix;


   Annonce (std::string Titre, long double Prix, std::string Intro,
            std::string Description,
            std::vector<std::vector<std::string>> ImgUrls)
    {
      *titre = std::move(Titre);
      *prix = Prix;
      *intro = std::move(Intro);
      *description = std::move(Description);
      *imgUrls = std::move(ImgUrls);
    }
 };


0 commentaires

0
votes

Y a-t-il un moyen d'écrire quelque chose comme: p>

void foo(int x) {
    auto p = std::make_unique<p>();
    p.get() = x;
    // do stuff with p

    // ...

    // no need to delete p at the end of the function
}
  • Pas besoin d'utiliser nouveau code>, toujours. li>
  • Pas besoin de supprimer quoi que ce soit. Li>
  • aucune chance de fuites de mémoire (en raison de cette classe) li> ul>

    2. Sinon, utilisez std :: unique_ptr code> 's h3>

    le std :: unique_ptr code> classe vous permet d'éviter de devoir gérer vous-même la mémoire. Il prend en charge cela. Donc, si vous faites vos membres std :: unique_ptr code>'s, vous pouvez initialiser la valeur qu'ils indiquent à l'aide de get () code>, par exemple: p>

    myInt, myOtherInt = new int;
    


0 commentaires