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++/CLI Discussion :

vc\include\deque(518) : error C2027: use of undefined type


Sujet :

C++/CLI

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Points : 24
    Points
    24
    Par défaut vc\include\deque(518) : error C2027: use of undefined type
    Bonjour,

    J'ai un programme qui fonctionnait bien jusqu'a ce je fasse une separation de la definition et declaration des classes dans des fichiers respectifs .cpp et .h.

    Cependant, maintenant j'obtiens le bug le message d'erreur ci-dessous.

    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
    1>------ Build started: Project: TraceFlowManager2, Configuration: Debug Win32 ------
    1>Compiling...
    1>FlowTracerMain.cpp
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1> c:\program files\microsoft visual studio 9.0\vc\include\stack(21) : see reference to class template instantiation 'std::deque<_Ty>' being compiled
    1> with
    1> [
    1> _Ty=debugFlowTracer
    1> ]
    1> c:\designcpp\include\flowtracermanager.h(9) : see reference to class template instantiation 'std::stack<_Ty>' being compiled
    1> with
    1> [
    1> _Ty=debugFlowTracer
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(519) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(519) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(519) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(519) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\moondragon\distancelearning\cpp\code\traceflowmanager2\flowtracermain.cpp(4) : error C2059: syntax error : 'namespace'
    1>c:\moondragon\distancelearning\cpp\code\traceflowmanager2\flowtracermain.cpp(4) : error C2238: unexpected token(s) preceding ';'
    1>c:\moondragon\distancelearning\cpp\code\traceflowmanager2\flowtracermain.cpp(39) : fatal error C1075: end of file found before the left brace '{' at 'c:\designcpp\include\flowtracer.h(12)' was matched
    1>FlowTracerManager.cpp
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1> c:\program files\microsoft visual studio 9.0\vc\include\stack(21) : see reference to class template instantiation 'std::deque<_Ty>' being compiled
    1> with
    1> [
    1> _Ty=debugFlowTracer
    1> ]
    1> c:\designcpp\include\flowtracermanager.h(9) : see reference to class template instantiation 'std::stack<_Ty>' being compiled
    1> with
    1> [
    1> _Ty=debugFlowTracer
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(519) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(519) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(519) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\deque(519) : error C2027: use of undefined type 'debugFlowTracer'
    1> c:\designcpp\include\flowtracer.h(12) : see declaration of 'debugFlowTracer'
    1>c:\designcpp\source\flowtracermanager.cpp(6) : error C2838: 'm_Instance' : illegal qualified name in member declaration
    1>c:\designcpp\source\flowtracermanager.cpp(9) : error C2535: 'void debugFlowTracer::AddFlow(void)' : member function already defined or declared
    1> c:\designcpp\include\flowtracer.h(18) : see declaration of 'debugFlowTracer::AddFlow'
    1>c:\designcpp\source\flowtracermanager.cpp(14) : error C2535: 'void debugFlowTracer::RemoveFlow(void)' : member function already defined or declared
    1> c:\designcpp\include\flowtracer.h(19) : see declaration of 'debugFlowTracer::RemoveFlow'
    1>c:\designcpp\source\flowtracermanager.cpp(17) : fatal error C1075: end of file found before the left brace '{' at 'c:\designcpp\include\flowtracer.h(12)' was matched
    1>Generating Code...
    1>Build log was saved at "file://c:\MoonDragon\DistanceLearning\cpp\code\TraceFlowManager2\Debug\BuildLog.htm"
    1>TraceFlowManager2 - 23 error(s), 0 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    Les fichiers en question sont ci-dessous:

    =====================
    Flowtracer.h
    =====================
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #ifndef _FLOWTRACER_H_
    #define _FLOWTRACER_H_
     
    #include <string>
    #include <stack>
    #include <vector>
    #include <stdio.h>
     
    FILE * pFile;
     
    class debugFlowTracer
    {
    private:
    	std::string m_sFlowName;
    	std::vector< debugFlowTracer > m_activefunctionStack;
    	bool						   m_bRemoved;
    protected:
    	virtual void AddFlow();
    	virtual void RemoveFlow();
     
    public:
    	debugFlowTracer(void)
    	{
    		m_sFlowName = "Unknown";
    		m_bRemoved = false;
    		AddFlow();
    	}
     
    	debugFlowTracer(const char *strFlow)
    	{
    		m_sFlowName = strFlow;
    		m_bRemoved = false;
    		AddFlow();
    	}
    	debugFlowTracer( const debugFlowTracer& aCopy )
    	{
    		m_sFlowName = aCopy.m_sFlowName;
    		std::vector< debugFlowTracer >::const_iterator iter;
    		for ( iter = aCopy.m_activefunctionStack.begin(); iter != aCopy.m_activefunctionStack.end(); ++iter )
    			m_activefunctionStack.insert( m_activefunctionStack.end(), (*iter) );
    	}
     
     
    	~debugFlowTracer(void)
    	{
    		if ( !m_bRemoved )
    			RemoveFlow();
    		m_bRemoved = true;
    	}
     
    	std::string Name()
    	{
    		return m_sFlowName;
    	}
     
    	void AddSubFlow( debugFlowTracer& cSubFlow )
    	{
    		// Just push it on top of the active function stack
    		m_activefunctionStack.insert( m_activefunctionStack.end(), cSubFlow );
    	}
     
     
    	void PrintStack(int iLevel)
    	{
    		pFile = fopen ("myfile.txt","a");//PSA
    		std::vector< debugFlowTracer >::iterator iter;
    		for ( iter = m_activefunctionStack.begin(); iter != m_activefunctionStack.end(); ++iter )
    		{
    			for ( int i=0; i<iLevel; ++i )
    			{putchar ('\t'); //putchar writes character to the current position in the standard output (stdout) and advances the internal file position indicator to the next position.
    			fputc ( ('\t'), pFile );
    			}
    			printf("Level:%d %s\n", iLevel,(*iter).Name().c_str());
    			fprintf (pFile, "Level: %d %s\n",iLevel,(*iter).Name().c_str());
    			(*iter).PrintStack(iLevel+1);
     
    		}
    		 //fclose (pFile);
    };
    #endif
    ==============================
    FlowTracerManager.h
    ==============================
    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
    #ifndef FLOWTRACERMANAGER_H
    #define FLOWTRACERMANAGER_H
     
    #include "FlowTracer.h"
     
    class debugFlowTracerManager
    {
    private:
    	std::stack< debugFlowTracer> m_functionStack;
    	static debugFlowTracerManager *m_Instance;
     
    public:
    	static debugFlowTracerManager *Instance()
    	{
    		if ( m_Instance == NULL )
    			m_Instance = new debugFlowTracerManager();
    		return m_Instance;
    	}
    	void addFlow( debugFlowTracer& cFlow )
    	{
    		m_functionStack.push( cFlow );
    	}
    	void removeFlow(debugFlowTracer& cFlow)
    	{
    		if ( m_functionStack.empty() )
    			return;
     
    		// Get the top element
    		debugFlowTracer t = m_functionStack.top();
     
    		// Remove it.
    		m_functionStack.pop();
     
    		// If there is anything left, add it
    		if ( m_functionStack.empty() )
    		{
    			pFile = fopen ("myfile.txt","a");//PSA
    			printf("Flot [%s]:\n", t.Name().c_str() );
    			fprintf (pFile,"Flot [%s]:\n", t.Name().c_str() );
    			//fclose (pFile);
    			t.PrintStack(0);
    		}
    		else
    			m_functionStack.top().AddSubFlow( t );
     
    	}
     
    private:
    	debugFlowTracerManager()
    	{
    	}
    	debugFlowTracerManager(const debugFlowTracerManager& aCopy )
    	{
    	}
    	virtual ~debugFlowTracerManager(void)
    	{
    	}
    };
     
     
    #endif
    =============================
    FlowTracerManager.cpp
    =============================
    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
    #include "FlowTracer.h"
    #include "FlowTracerManager.h"
     
     
    debugFlowTracerManager *debugFlowTracerManager::m_Instance = NULL;
     
    void debugFlowTracer::AddFlow()
    {
    	debugFlowTracerManager::Instance()->addFlow( *this );
    }
     
    void debugFlowTracer::RemoveFlow()
    {
    	debugFlowTracerManager::Instance()->removeFlow( *this );
    }
    =============================
    FlowTracerMain.cpp
    =============================

    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
    #include <iostream>
    #include "FlowTracerManager.h"
     
    using namespace std;
     
     
    void func_3()
    {
       debugFlowTracer flow("func_3");
    }
     
    void func_2()
    {
       debugFlowTracer flow("func_2");
       func_3();
    }
     
    void func_1()
    {
       debugFlowTracer flow("func_1");
       func_2();
    }
     
    int main(int argc, char* argv[])
    {
       debugFlowTracer mainFlow("main");
       func_1();
     
       func_2();
       func_3();
     
       //cout << "Ok!" << endl;
     
       return 0;
     
       //system ("BREAK");
       //return EXIT_SUCCESS;
    }

  2. #2
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Points : 30
    Points
    30
    Par défaut
    Salut,

    Il te manque une accolade a la fin de ta fonction PrintStack de FlowTracer.
    Sinon tu dis que tu a séparé définition et déclaration mais pourquoi mets tu la définition de certaine fonctions de flowTracer dans le fichier FlowTracerManager.cpp?

    Tu dois créer un .cpp pour flowTracer et un .cpp pour FlowTracerManager et ajouter la définition des fonctions de chaque classes dans le fichier approprié...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par rincevent_123 Voir le message
    Salut,

    Il te manque une accolade a la fin de ta fonction PrintStack de FlowTracer.
    Merci rincevent, ca a resolu une partie du probleme : mais comment as tu remarqué, est ce en utilisant le débugger ou en scrutant le code (c'est ce que j'ai fait pendant des heures sans rien voir).


    Sinon tu dis que tu a séparé définition et déclaration mais pourquoi mets tu la définition de certaine fonctions de flowTracer dans le fichier FlowTracerManager.cpp?

    Tu dois créer un .cpp pour flowTracer et un .cpp pour FlowTracerManager et ajouter la définition des fonctions de chaque classes dans le fichier approprié...
    Mon c++ est un peu rouillé (a force de faire des vailles et viens avec des missions utilisant d'autres langages...).
    Mais j'avais pensé que debugFlowTracer::AddFlow() et debugFlowTracer::RemoveFlow() appellant debugFlowTracerManager, cela était correcte de tout mettre dans FlowTracerManager.cpp.

    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
     
    #include "FlowTracer.h"
    #include "FlowTracerManager.h"
     
     
    debugFlowTracerManager *debugFlowTracerManager::m_Instance = NULL;
     
    void debugFlowTracer::AddFlow()
    {
    	debugFlowTracerManager::Instance()->addFlow( *this );
    }
     
    void debugFlowTracer::RemoveFlow()
    {
    	debugFlowTracerManager::Instance()->removeFlow( *this );
    }

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Voici ci-dessous les codes mis a jour, cependant j'ai le message d'erreur suivant:

    1>------ Build started: Project: TraceFlowManager2, Configuration: Debug Win32 ------
    1>Compiling...
    1>FlowTracer.cpp
    1>c:\designcpp\include\flowtracer.h(75) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237) : see declaration of 'fopen'
    1>c:\designcpp\include\flowtracermanager.h(39) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237) : see declaration of 'fopen'
    1>Generating Code...
    1>Skipping... (no relevant changes detected)
    1>FlowTracerMain.cpp
    1>FlowTracerManager.cpp
    1>Linking...
    1>FlowTracerManager.obj : error LNK2005: "struct _iobuf * pFile" (?pFile@@3PAU_iobuf@@A) already defined in FlowTracerMain.obj
    1>FlowTracer.obj : error LNK2005: "struct _iobuf * pFile" (?pFile@@3PAU_iobuf@@A) already defined in FlowTracerMain.obj
    1>C:\MoonDragon\DistanceLearning\cpp\code\TraceFlowManager2\Debug\TraceFlowManager2.exe : fatal error LNK1169: one or more multiply defined symbols found
    1>Build log was saved at "file://c:\MoonDragon\DistanceLearning\cpp\code\TraceFlowManager2\Debug\BuildLog.htm"
    1>TraceFlowManager2 - 3 error(s), 2 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

    =====================
    Flowtracer.h
    =====================
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    #ifndef _FLOWTRACER_H_
    #define _FLOWTRACER_H_
     
    #include <string>
    #include <stack>
    #include <vector>
    #include <stdio.h>
     
    FILE * pFile;
     
    class debugFlowTracer
    {
    private:
    	std::string m_sFlowName;
    	std::vector< debugFlowTracer > m_activefunctionStack;
    	bool						   m_bRemoved;
    protected:
    	virtual void AddFlow();
    	virtual void RemoveFlow();
     
    public:
    	debugFlowTracer(void)
    	{
    		m_sFlowName = "Unknown";
    		m_bRemoved = false;
    		AddFlow();
    	}
     
    	debugFlowTracer(const char *strFlow)
    	{
    		m_sFlowName = strFlow;
    		m_bRemoved = false;
    		AddFlow();
    	}
     
    	debugFlowTracer( const debugFlowTracer& aCopy )
    	{
    		m_sFlowName = aCopy.m_sFlowName;
    		std::vector< debugFlowTracer >::const_iterator iter;
    		for ( iter = aCopy.m_activefunctionStack.begin(); iter != aCopy.m_activefunctionStack.end(); ++iter )
    			m_activefunctionStack.insert( m_activefunctionStack.end(), (*iter) );
    	}
     
    	~debugFlowTracer(void)
    	{
    		if ( !m_bRemoved )
    			RemoveFlow();
    		m_bRemoved = true;
    	}
     
    	std::string Name()
    	{
    		return m_sFlowName;
    	}
     
    	void AddSubFlow( debugFlowTracer& cSubFlow )
    	{
    		// Just push it on top of the active function stack
    		m_activefunctionStack.insert( m_activefunctionStack.end(), cSubFlow );
    	}
    	//void PrintStack(int iLevel)
    	//{
    	//	std::vector< debugFlowTracer >::iterator iter;
    	//	for ( iter = m_activefunctionStack.begin(); iter != m_activefunctionStack.end(); ++iter )
    	//	{
    	//		for ( int i=0; i<iLevel; ++i )
    	//			putchar ('\t');
    	//		printf("Level:%d %s\n",iLevel, (*iter).Name().c_str() );
    	//		(*iter).PrintStack(iLevel+1);
    	//	}
    	//}
     
    	void PrintStack(int iLevel)
    	{
    		pFile = fopen ("myfile.txt","a");//PSA
    		std::vector< debugFlowTracer >::iterator iter;
    		for ( iter = m_activefunctionStack.begin(); iter != m_activefunctionStack.end(); ++iter )
    		{
    			for ( int i=0; i<iLevel; ++i )
    			{putchar ('\t'); //putchar writes character to the current position in the standard output (stdout) and advances the internal file position indicator to the next position.
    			fputc ( ('\t'), pFile );
    			}
    			printf("Level:%d %s\n", iLevel,(*iter).Name().c_str());
    			fprintf (pFile, "Level: %d %s\n",iLevel,(*iter).Name().c_str());
    			(*iter).PrintStack(iLevel+1);
     
    		}
    		 //fclose (pFile);
    	}
     
    };
     
    #endif
    ==============================
    FlowTracerManager.h
    ==============================
    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
     
    #ifndef FLOWTRACERMANAGER_H
    #define FLOWTRACERMANAGER_H
     
    #include "FlowTracer.h"
     
    class debugFlowTracerManager
    {
    private:
    	std::stack< debugFlowTracer> m_functionStack;
    	static debugFlowTracerManager *m_Instance;
     
    public:
    	static debugFlowTracerManager *Instance()
    	{
    		if ( m_Instance == NULL )
    			m_Instance = new debugFlowTracerManager();
    		return m_Instance;
    	}
     
    	void addFlow( debugFlowTracer& cFlow )
    	{
    		m_functionStack.push( cFlow );
    	}
     
    	void removeFlow(debugFlowTracer& cFlow)
    	{
    		if ( m_functionStack.empty() )
    			return;
     
    		// Get the top element
    		debugFlowTracer t = m_functionStack.top();
     
    		// Remove it.
    		m_functionStack.pop();
     
    		// If there is anything left, add it
    		if ( m_functionStack.empty() )
    		{
    			pFile = fopen ("myfile.txt","a");//PSA
    			printf("Flot [%s]:\n", t.Name().c_str() );
    			fprintf (pFile,"Flot [%s]:\n", t.Name().c_str() );
    			//fclose (pFile);
    			t.PrintStack(0);
    		}
    		else
    			m_functionStack.top().AddSubFlow( t );
    	}
     
    private:
    	debugFlowTracerManager()
    	{
    	}
     
    	debugFlowTracerManager(const debugFlowTracerManager& aCopy )
    	{
    	}
     
    	virtual ~debugFlowTracerManager(void)
    	{
    	}
    };
    #endif
    =============================
    FlowTracerManager.cpp
    =============================
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "FlowTracerManager.h"
     
    debugFlowTracerManager *debugFlowTracerManager::m_Instance = NULL;
    =============================
    FlowTracer.h
    =============================
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "FlowTracer.h"
    #include "FlowTracerManager.h"
     
    void debugFlowTracer::AddFlow()
    {
    	debugFlowTracerManager::Instance()->addFlow( *this );
    }
     
    void debugFlowTracer::RemoveFlow()
    {
    	debugFlowTracerManager::Instance()->removeFlow( *this );
    }

    =============================
    FlowTracerMain.cpp
    =============================

    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
     
     
    #include <iostream>
    #include "FlowTracerManager.h"
    using namespace std;
     
     
    void func_3()
    {
       debugFlowTracer flow("func_3");
    }
     
    void func_2()
    {
       debugFlowTracer flow("func_2");
       func_3();
    }
     
    void func_1()
    {
       debugFlowTracer flow("func_1");
       func_2();
    }
     
    int main(int argc, char* argv[])
    {
       debugFlowTracer mainFlow("main");
       func_1();
     
       func_2();
       func_3();
     
       //cout << "Ok!" << endl;
     
       return 0;
     
       //system ("BREAK");
       //return EXIT_SUCCESS;
    }

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Points : 30
    Points
    30
    Par défaut
    J'ai juste regardé le code, mais en même temps ce genre d'erreur c'est souvent lié a l'oubli de parenthèses ou accolades.

    Sinon, c'est sur que c'est pas interdit de faire comme tu a fait, mais bon la bonne pratique c'est vraiment d'avoir un cpp spécifique a chaque classe.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    En préambule, j'espère que ce code n'a que des prétentions pédagogiques.
    Des bibliothèques de log, il y en a des dizaines, avec des niveaux de sophistication très élevé. Ne pas réinventer une roue (et ici elle très très carré ).

    Ne jamais mettre ce genre de définition dans un .h.

    En mettant cette déclaration dans un point .h, vous l'a déclaré autant de fois qu'il y a de cpp qui inclut, directement ou indirectement, ce .h.
    Il y a des options de compilations pour "merger" des "globales" mais ce ne sont que des pis-aller pour cacher un gros problème de conception.

    1- les globales, c'est mal
    2- il faut mettre dans les fichiers .h, que ce qui doit être visible par les "utilisateurs" de la classe (sauf la déclaration des membres et méthodes de la classe, c'est un archaïsme du C++)

    Un des concepts fondamentales de la POO (programmation orientée objet) est l'encapsulation : on doit donc pouvoir utiliser une classe sans connaître comment elle est implémenté.
    Dans ces conditions, la déclaration d'une globale dans un .h est en contradiction avec ces principes. Si l'implémentation de debugFlowTracer a besoin de cette globale, la déclaration de la globale et l'implémentation des méthodes doivent être dans le cpp associé FlowTracer.cpp.

    Donc, sauf s'il s'agit d'une classe template, il doit toujours avoir un fichier "classe.h" avec le strict minimum (donc aucune variable globale) donc la déclaration de la classe ; et un fichier "classe.cpp" avec l'implémentation de ses méthodes.
    Il ne faut pas disséminer l'implémentation des méthodes d'une classe dans plusieurs fichiers, cela complexifie la maintenance de la classe et permettrait de circonvenir au principe d'encapsulation. Tout le code d'implémentation d'une classe doit pouvoir être circonscrit à un fichier, sinon, c'est que votre classe ou une des classe qu'il utilise a un gros problème d'encapsulation donc d'utilisabilité.

Discussions similaires

  1. Error: illegal use of this type as an expression
    Par ncheboi dans le forum Débuter
    Réponses: 8
    Dernier message: 29/08/2010, 23h01
  2. Réponses: 3
    Dernier message: 21/01/2010, 00h24
  3. Réponses: 2
    Dernier message: 16/08/2009, 13h20
  4. [PHP 5.2] Fatal error: Cannot use object of type CPanier as array in . .
    Par Gauldo dans le forum Langage
    Réponses: 10
    Dernier message: 12/01/2009, 13h53
  5. error:invalid use of undefined type
    Par assif dans le forum C++
    Réponses: 2
    Dernier message: 25/10/2006, 21h11

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