Problème sur une création de classe

Résolu
sp40 Messages postés 1284 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 17 févr. 2010 à 18:21
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 - 18 févr. 2010 à 17:30
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

Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
17 févr. 2010 à 19:36
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+
3
sp40 Messages postés 1284 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 13
17 févr. 2010 à 19:43
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
3
dragonjoker59 Messages postés 92 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 23 septembre 2015
18 févr. 2010 à 10:18
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 !
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
17 févr. 2010 à 19:48
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sp40 Messages postés 1284 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 13
18 févr. 2010 à 08:23
Salut vecchio56

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


Simon
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
18 févr. 2010 à 17:30
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]
0