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 :

Choix de construction / Initialisation d'une instance de classe


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut Choix de construction / Initialisation d'une instance de classe
    Bonjour,

    je me pose une question :
    vaut-il mieux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    CWaveFile::CWaveFile()
    {
    	//Init tout à Zéro
    	m_lpfile = NULL;
    	m_hwo = NULL;
    	m_dwDurationTime = 0;
    	m_hEventDone = NULL;
    	ZeroMemory( &m_wfex, sizeof(WAVEFORMATEX) );
    	ZeroMemory( &m_whdr, sizeof(WAVEHDR) );
    }
     
     
    CWaveFile::~CWaveFile()
    {
    	//arreter la diffusion en cours
    	Stop();
     
    	//fermer le device
    	Close();	
     
    	//Libération mémoire et handle allouée
    	if( m_lpfile)
    		delete [] m_lpfile;
    	if( m_hEventDone )
    		CloseHandle( m_hEventDone );
    }
     
     
    MMRESULT CWaveFile::Open(LPCSTR szFileName, UINT uDeviceID /*=WAVE_MAPPER*/)
    {
        // Open and read the wave file
        FILE* f = fopen(szFileName, "rb");
        if(!f)				// Error, file not found.        
            return MMSYSERR_ERROR;
     
        // Determine the file size
        fseek(f, 0, SEEK_END);
        long fileLen = ftell(f);
     
        // Rewind the pointer to the begginning so we can read it
        fseek(f, 0, SEEK_SET);
     
        // Request enough memory to store the entire file
        m_lpfile = new char [fileLen];
     
        // 'Copy' the file to memory
        fread(m_lpfile, sizeof(char), fileLen, f);
     
        // Close the file, we won't need it anymore
        fclose(f);
     
    	// Fill WAVEFORMATEX with the data from the file
        m_wfex.wFormatTag         = *((WORD* )(m_lpfile + OFFSET_FORMATTAG     ));
        m_wfex.nChannels          = *((WORD* )(m_lpfile + OFFSET_CHANNELS      ));
        m_wfex.nSamplesPerSec     = *((DWORD*)(m_lpfile + OFFSET_SAMPLESPERSEC ));
        m_wfex.nAvgBytesPerSec    = *((DWORD*)(m_lpfile + OFFSET_AVGBYTESPERSEC));
        m_wfex.nBlockAlign        = *((WORD* )(m_lpfile + OFFSET_BLOCKALIGN    ));
        m_wfex.wBitsPerSample     = *((WORD* )(m_lpfile + OFFSET_BITSPERSAMPLE ));
    	m_wfex.cbSize = 0;
     
    	// Fill the WAVEHDR structure
    	m_whdr.lpData = m_lpfile+HEADER_SIZE;
    	m_whdr.dwBufferLength = fileLen-HEADER_SIZE;
     
    	//Durée prévu (en millisecondes)
    	m_dwDurationTime = (float)m_whdr.dwBufferLength / m_wfex.nSamplesPerSec / (m_wfex.wBitsPerSample/8) * 1000;
     
    	// Open and configure the device
    	return waveOutOpen(&m_hwo, uDeviceID, &m_wfex, (DWORD)WaveOutProc, (DWORD)this, CALLBACK_FUNCTION);
    }
    Ou alors prendre le code "initialisant" de CWaveFile::Open pour le mettre dans le constructeur ?

    Pour moi la raison qui fait que ce n'est pas dans le constructeur, c'est que le si le fopen() foire mon constructeur échoue.
    Donc j'ai préféré faire un constructeur par défaut, et tester ensuite le CWaveFile::Open()

    Qu'en pensez-vous ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour moi la raison qui fait que ce n'est pas dans le constructeur, c'est que le si le fopen() foire mon constructeur échoue.
    Donc j'ai préféré faire un constructeur par défaut, et tester ensuite le CWaveFile::Open()
    Ca paraît honête. Gérer une erreur dans un constructeur necessite de sortir les exceptions, ce qui n'est pas toujours adapté ou pratique pour des erreurs qui sont facilement rattrapables. Ensuite, ouvrir le fichier après la construction peut aider aussi pour les variables statiques ou globales, ou simplement pour le cas où l'on ne connaît pas le nom du fichier à l'avance.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    OK, bon alors je reste sur mon idée.
    Merci.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il y a tout de même une autre solution : ne pas faire renvoyer l'erreur par la fonction qui la génère, mais la stocker au niveau de l'instance, et la tester avec une fonction ou un opérateur dédié. Comme par exemple ce qui se fait avec les flux standards.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CWaveFile File("toto.wav");
    if (!File)
    {
        // Error...
    }

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    salut,
    ouui c'est vrai ... Au début, j'avais mon constructeur comme ça,
    mais l'erreur du fopen() me génait (entre autres ...)

    Comment faire pour que le File "retourné" soit égal à NULL ?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il ne faut pas qu'il soit à NULL (ce n'est pas un pointeur), simplement que tu définisses les opérateurs de conversion qui vont bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class CWaveFile
    {
    public :
     
        operator bool() const {return Error};
        bool operator !() const {return !Error};
     
    private :
     
        bool Error;
    };

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    Comment faire pour que le File "retourné" soit égal à NULL ?
    Oui oui c'était un abus de langage pour exprimer "comment le tester ?"

    OK, je comprends l'idée des redéfinissions d'opérateurs pour ce cas.

    J'ai aussi trouvé ce post :
    http://www.developpez.net/forums/showthread.php?t=68583
    trés intéressant pour mon cas !

    Merci beaucoup Laurent !
    Maintenant à moi de me débrouiller avec tout ça, et de choisir les meilleures implémentations.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 27/02/2007, 11h31
  2. Réponses: 5
    Dernier message: 13/07/2006, 09h44
  3. [POO] Tableau d'objets B dans une instance de class A
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 24/05/2006, 09h52
  4. Réponses: 3
    Dernier message: 18/02/2006, 23h21
  5. Exporter une instance de classe au format XML ou XMI
    Par Scorpion Rouge dans le forum Persistance des données
    Réponses: 2
    Dernier message: 22/12/2005, 11h19

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