Problème sur une création de classe [Résolu]

Signaler
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
-
Messages postés
3818
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
23 septembre 2020
-
Bonjour,

Je bloque sur un problème de définition de classe et ça commence à me prendre la tête. Est-ce que vous pourriez m'indiquer ce qui ne vas pas parce que là j'ai épuisé ma patience...
merki d'avance

Le problème est le suivant : j'ai une classe Dates (fichier .cc et .h) qui contient une date de début, une date de fin et deux méthodes publiques pour récupérer ces dates. Compilation : Impeccable. Lors de l'édition des liens j'ai le message comme quoi dans main.cc, j'ai une "undefined reference to `CDates::CDates()', undefined reference to `CDates::getDateDebut()'"


fichier Dates.h
#ifndef DATES_H
#define DATES_H

class CDates
{
private :
std::string m_DateDebut;
std::string m_DateFin;
public :
CDates();
std::string getDateDebut();
std::string getDateFin();
};

#endif

Fichier Dates.cc
#include <string>
#include <Dates.h>

using namespace std;

CDates::CDates()
{
m_DateDebut = "";
m_DateFin = "";
}

string CDates::getDateDebut()
{
return m_DateDebut;
}

string CDates::getDateFin()
{
return m_DateFin;
}

fichier main.cc
#include <string>
#include <Dates.h>

using namespace std;

int main()
{
CDates test;

test.getDateDebut();
}

Simon

6 réponses

Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Salut,

En survolant rapidement ... je crois que tu n'appelle pas ton constructeur.
Ton objet n'est pas alloué dans le tas.

Je fais pas de C++, donc je connais pas trop la syntaxe, mais en C# je ferais
CDates test = new CDates();

A+
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
merci pour la rapidité de ta réponse.
En fait, je viens de trouver mon erreur... dans la syntaxe de l'édition des liens
Pour info, en c++, tu peux aussi appeller le constructeur en instanciant une variable.


Simon
Messages postés
92
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
23 septembre 2015

Quand il n'y a pas d'argument pour ton constructeur, tu n'es pas obligé de mettre les parenthèses, et ce sur l'allocation dynamique comme statique


Coin coin !
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
En C++ si tu déclares un objet (pas un pointeur) il est alloué dans la pile, et la syntaxe de Moomoon07 n'est même pas correcte
CDates test();
ou bien
CDates* test = new CDates();

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
Salut vecchio56

ok pour la syntaxe de l'allocation dynamique... mais pourquoi les parenthèses sur : CDates test();


Simon
Messages postés
3818
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
23 septembre 2020
112
A noter qu'il est préférable de ne pas mettre les parenthèses.
Le sens n'est pas le même avec et sans !!!
Lorsque l'on fait un new, pas de différence, mais sans le new, l'un veut dire "je construit l'objet" et l'autre "je declare une fonction qui retourne mon objet"

Voici un petit exemple récapitulatif:
#include 

class Toto
{
public:
  Toto()
  {
    std::cout << "Construction de Toto" << std::endl;
  }
};
int main()
{
  std::cout << "Init normal" << std::endl;
  Toto t;
  std::cout << "Constructeur initalise" << std::endl;

  std::cout << std::endl;

  std::cout << "Init invalide" << std::endl;
  Toto x();
  std::cout << "Et oui rien ne s'affiche..." << std::endl;

  std::cout << std::endl;
  std::cout << std::endl;

  std::cout << "Init normal" << std::endl;
  Toto* pt = new Toto;
  std::cout << "Constructeur initalise" << std::endl;
  delete pt;

  std::cout << std::endl;

  std::cout << "Init normal aussi" << std::endl;
  Toto* px = new Toto();
  std::cout << "Constructeur initalise" << std::endl;
  delete px;

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]