IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

erreur avec new


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Par défaut erreur avec new
    Je n'arrive pas a utiliser new correctement, j'ai le message:
    "new peut uniquement être utilisé avec des types valeur simples" avant la compilation.
    Si vous avez une idée, merci.

    dans mon .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public ref class CppWrapperClass
    {
    	private:
    		Delaunay::DelaunayClass* pClass;
    	public:
    		CppWrapperClass();
    ...	
    }
    dans mon .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CppWrapperClass::CppWrapperClass(void)
    {
    	pClass = new Delaunay::DelaunayClass;  <- !!
    }

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Cela requiert l'utilisation d'un constructeur.
    J'ajoute par principe le unique_ptr (que tu trouveras dans <memory>)
    Il est rarissime d'avoir besoin de stocker un new en dehors d'un "smart pointer" tel que unique_ptr (ou shared_ptr, parfois)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class CppWrapperClass {
    	private:
    		std::unique_ptr<Delaunay::DelaunayClass> pClass;
    	public:
    		CppWrapperClass(): pClass(new Delaunay::DelaunayClass() ) {}
    };
    voire mieux encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class CppWrapperClass {
    	private:
    		std::unique_ptr<Delaunay::DelaunayClass> pClass;
    	public:
    		CppWrapperClass(): pClass( std::make_unique<Delaunay::DelaunayClass>() ) {}
    };

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Etant donné le public ref class tu n'es pas en C++ mais C++/CX ou CLI et une classe managée ne peut pas contenir d'allocation dynamique sur un type non managé ?
    Pour allouer dynamiquement une classe managée, c'est ref new ou gcnew il me semble.

    Je trouve bien ça sur SO https://stackoverflow.com/questions/...-managed-class qui indique que ça devrait marcher mais le message d'erreur en français ne retourne aucun résultat chez moi.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Par défaut
    Je veux du C++, donc j'ai enlever le "ref".
    J'ai la même erreur:
    "new peut uniquement être utilisé avec des types valeur simples" avant la compilation.

    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class CppWrapperClass
    {
    	private:
    		std::unique_ptr<Delaunay::DelaunayClass> pClass;
    	public:
    		CppWrapperClass();
    		~CppWrapperClass();
    }
    .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CppWrapperClass::CppWrapperClass(void)
    {
    	std::unique_ptr<Delaunay::DelaunayClass> pClass(new Delaunay::DelaunayClass); <- !!
    }
     
    CppWrapperClass::~CppWrapperClass(void)
    {
    	pClass.reset();
    }

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    appelle ton constructeur. Il doit au minimum y avoir les parenthèses de l'appel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Delaunay::DelaunayClass /* entre là -> */() /* <- et là */
    Cela dit, n'utilise pas new, mais make_unique.

    Enfin, l'intérêt premier de unique_ptr, c'est de détruire son pointé quand lui-même est détruit.
    reset n'est pas nécessaire dans le destructeur.

    (Son autre intérêt, c'est de ne pas être copiable, mais transférable.)

    Un peu de documentation:
    utilisation de new
    le RAII
    <memory>

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Je sais pas trop ce que tu trafiques, mais choisir de travailler en managé ou non c'est un peu plus complexe que d'enlever le ref de la déclaration d'une classe.
    Pourrait-on avoir un semblant de contexte ou quoi que ce soit pour comprendre ce que tu espères faire ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    On peut avoir la déclaration de la classe "DelaunayClass" ?
    Parce que, comme le dit @Bousk, on ne fait pas "comme on veut", à l'arrache.

  8. #8
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Citation Envoyé par ternel Voir le message
    appelle ton constructeur. Il doit au minimum y avoir les parenthèses de l'appel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Delaunay::DelaunayClass /* entre là -> */() /* <- et là */
    [...]

    Un peu de documentation:
    utilisation de new
    Je confirme les dires de Bousk : dans une expression avec new qui appelle le constructeur par défaut, les parenthèses du constructeur sont facultatives. Par exemple, le code suivant compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string* test = new std::string;
    D'ailleurs, le lien que tu as donné en parle. Voir le passage : « If initializer is absent, the object is default-initialized. »

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    ah…
    Merci pour ta question, rubisvert, j'aurai appris quelque chose en essayant d'y répondre.

  10. #10
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    Je confirme les dires de Bousk : dans une expression avec new qui appelle le constructeur par défaut, les parenthèses du constructeur sont facultatives. Par exemple, le code suivant compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string* test = new std::string;
    D'ailleurs, le lien que tu as donné en parle. Voir le passage : « If initializer is absent, the object is default-initialized. »
    J'ajoute une précision, si le type alloué ne possède pas de constructeur, il n'y aura pas d'initialisation. Par contre, avec les parenthèses, il y aura une zéro-initialisation, l'équivalent de T{}.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] Avertissement ou erreur avec New pointeur
    Par ThWilliam dans le forum Lazarus
    Réponses: 6
    Dernier message: 25/05/2017, 12h38
  2. Erreur avec procédure LockWorkStation ...
    Par simonseztech dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 16/08/2004, 15h33
  3. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  4. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37
  5. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 00h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo