C/Visual C - pragma once y tropecientos LINKERROR

 
Vista:

pragma once y tropecientos LINKERROR

Publicado por Nelek (816 intervenciones) el 20/02/2007 15:11:19
Hola,

aqui debajo os pongo el header que me he creado para incluir en los demas *.cpp y demas. Resulta que si solo lo pongo en los *.cpp, me dice que no reconoce las declaraciones que contienen a las dos clases que especifico aqui. Y si meto el "include #GlobalDef.h" aunque sea en unico fichero header. Me saltan un monton (89) de errores como este:

error LNK2005: "public: virtual __thiscall CFuzzyRule::~CFuzzyRule(void)" (??1CFuzzyRule@@UAE@XZ)

O sea que tengo definiciones multiples, pero he puesto los #if !defined... y el #pragma once pero a pesar de todo sigue diciendo que tu tia... y segun lo que entendi yo por otros mensajes del foro, no deberia ser asi, si ya ha sido declarado, no deberia hacerlo de nuevo, asi que no tendria que darme estos mensajes de fallo, no? A no ser que tenga que poner las funciones miembros de las clases pequenyas en un *.cpp, que es lo unico que se me ocurre, pero entonces no me sirve de nada eso de hacer un header generico para que cada uno tome lo que le interesa de aqui y no tener que hacer 10 o 12 includes por clase que tengo en el espacio de trabajo.

// GlobalDef.h: //
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_GLOBALDEF_H__69B77F88_D9AC_4607_9135_297B9363533C__INCLUDED_)
#define AFX_GLOBALDEF_H__69B77F88_D9AC_4607_9135_297B9363533C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

///////////////////////////////////////////////////////////
// Includes usados
///////////////////////////////////////////////////////////

//Includes de los DialogBoxes
//Include de las clases grandes derivadas de CObject que contienen metodos y a otras clases menores

//Includes de otros ficheros externos y templates
#include <math.h>
#include "MyColorComboBox.h"
#include "MyColorListBox.h"
#include "MyList.h"

///////////////////////////////////////////////////////////
//Constantes
///////////////////////////////////////////////////////////

#define MAXIN 24
//y todo el resto....

///////////////////////////////////////////////////////////
//CObject-derived classes de pequenyo tamanyo
///////////////////////////////////////////////////////////

class CRuleElement : public CObject
{
public:
CString m_szInName;
CString m_szAttName;

CRuleElement();
CRuleElement (const CRuleElement &re); //Copy operator
CRuleElement& operator= (const CRuleElement &re); //Assigment Operator
virtual ~CRuleElement();
};

CRuleElement::CRuleElement()
{ m_szInName = "";
m_szAttName = "";
}

CRuleElement::CRuleElement (const CRuleElement &re)
{ m_szInName = re.m_szInName;
m_szAttName = re.m_szAttName;
}

CRuleElement& CRuleElement::operator= (const CRuleElement &re)
{ m_szInName = re.m_szInName;
m_szAttName = re.m_szAttName;
return *this;
}

CRuleElement::~CRuleElement() { }

//*********************************************************

class CFuzzyRule : public CObject
{
public:
CMyList <CRuleElement, CRuleElement&> m_clRuleElements;
double m_dRuleGWF;

CFuzzyRule();
CFuzzyRule (const CFuzzyRule &fr); //Copy operator
CFuzzyRule& operator= (const CFuzzyRule &fr); //Assigment Operator
virtual ~CFuzzyRule();
};

CFuzzyRule::CFuzzyRule()
{ m_dRuleGWF = VALNULL;
m_clRuleElements.RemoveAll ();
}

CFuzzyRule::CFuzzyRule (const CFuzzyRule &fr)
{ m_dRuleGWF = fr.m_dRuleGWF;
m_clRuleElements = fr.m_clRuleElements;
}

CFuzzyRule& CFuzzyRule::operator= (const CFuzzyRule &fr)
{ m_dRuleGWF = fr.m_dRuleGWF;
m_clRuleElements = fr.m_clRuleElements;
return *this;
}

CFuzzyRule::~CFuzzyRule()
{ m_clRuleElements.RemoveAll (); }

///////////////////////////////////////////////////////////
//Miguel: Needed structs
///////////////////////////////////////////////////////////

typedef struct {
double m_dAttXValue;
bool m_bAttSelected;
} AttPointData;

typedef struct {
CString m_szFileName;
CString m_szDescription;
CString m_szDeparment;
CString m_szWorkerName;
CString m_szStartTime;
CString m_szLastTime;
} FileDescription;

typedef struct {
CString m_szInName;
CString m_szSelection;
} ComboContent;

#endif // !defined(AFX_GLOBALDEF_H__69B77F88_D9AC_4607_9135_297B9363533C__INCLUDED_)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:pragma once y tropecientos LINKERROR

Publicado por fernando.gomez (1603 intervenciones) el 21/02/2007 03:41:08
Jejeje, my friend pues es que tienes declarada la implementación de varios métodos en el header:

CFuzzyRule::~CFuzzyRule()
{ m_clRuleElements.RemoveAll (); }

y pues cada vez que hagas un #include de este archivo, esto se copiará al cpp correspondiente y pues por ende tendrás el método redefinido tantas veces como #includes de este archivo hayas hecho.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:pragma once y tropecientos LINKERROR

Publicado por Nelek (816 intervenciones) el 21/02/2007 08:25:18
Me lo imaginaba, por eso me cree un *.cpp para ese header, donde le meti los metodos de ambas clases definidas en el *.h, es decir, en el header deje los define, los include de otras clases, la definicion de las estructuras y de las clases. Quite todos los XXX::XXX () { ... } y los pase a un GlobalDef.cpp que pongo aqui:

// GlobalDef.cpp:
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "stdafx.h"
#include "GlobalDef.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Konstruktion/Destruktion
//////////////////////////////////////////////////////////////////////

CRuleElement::CRuleElement()
{ m_szInName = ""; m_szAttName = "";
}

CRuleElement::CRuleElement (const CRuleElement &re)
{ m_szInName = re.m_szInName; m_szAttName = re.m_szAttName;
}

CRuleElement& CRuleElement::operator= (const CRuleElement &re)
{ m_szInName = re.m_szInName; m_szAttName = re.m_szAttName;
return *this;
}

CRuleElement::~CRuleElement() { }

//*********************************************************

CFuzzyRule::CFuzzyRule()
{ m_dRuleGWF = VALNULL; m_clRuleElements.RemoveAll ();
}

CFuzzyRule::CFuzzyRule (const CFuzzyRule &fr)
{ m_dRuleGWF = fr.m_dRuleGWF; m_clRuleElements = fr.m_clRuleElements;
}

CFuzzyRule& CFuzzyRule::operator= (const CFuzzyRule &fr)
{ m_dRuleGWF = fr.m_dRuleGWF; m_clRuleElements = fr.m_clRuleElements;
return *this;
}

CFuzzyRule::~CFuzzyRule()
{ m_clRuleElements.RemoveAll (); }


y lo que ocurrio fue... que me empezo a saltar fallos porque no reconoce los "enum { IDD = IDD_XXX }; " de los DialogBox, que antes si que reconocia

error C2065: 'IDD_SIG_ATTDLG' : Identificador no declarado
error C2057: Expresion constante esperada

Estos dos errores se repiten para cada uno de los DialogBox. Si suprimo el *.cpp del espacio de trabajo, ya no me da los fallos.

(Nota: Mi VC++ esta en aleman, asi que la descripcion del error la traduzco yo y puede que no sea el mensaje de error "standard", pero el codigo si que es ese)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:pragma once y tropecientos LINKERROR

Publicado por fernando.gomez (1603 intervenciones) el 21/02/2007 19:10:16
¿En alemán? Si ya me cuesta trabajo diferenciar los usos de der, den, dem, etc, leer el compilador en alemán ha de estar difícil :P

Pero bueno, asegúrate de que estás incluyendo el archivo "resource.h" en tu cpp. Este archivo lo genera el compilador y lo debes emplear siempre que vayas a hacer uso de los recursos. Todos esos valores se guadan ahí.

Como sugerencia, puedes colocar ese #include en el archivo stdafx.h. Esto tiene la ventaja de que ya no lo necesitarías #incluir en otro lugar, pero cada vez que hagas un cambio tendrás que recompilar el stdafx.cpp.

Saludos.

Ich kann Deutsch sprechen, aber wenig. Ich habe eine Deutsche Lehererin, und sie lehere mir Deutsch, aber ich bin nicht ein(er?) guter Student :P
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:pragma once y tropecientos LINKERROR

Publicado por Nelek (816 intervenciones) el 22/02/2007 08:48:48
Gracias por las respuestas fernando,

al final voy a tener que dejar estar el hacerlo de nuevo usando bien las cosas. Al jefe le ha entrado prisa, asi que voy a coger mi antigua version y voy a modificar sobre ella que me resultara mas rapido.

Por cierto, el "resource.h" esta en el header de la clase derivada de CWinApp, nunca me habia dado problemas antes. Ya lo rehare todo mejorando al maximo en un futuro. Ahora me toca ponerme el turbo.

Por cierto:

Ich kann Deutsch sprechen, aber nicht viel. Ich habe eine deutsche Lehrerin. Sie bring mir Deutsch bei, aber ich bin keinen gute Student.

No tiene que ver nada con el foro, pero te recomiendo un par de webs para el aleman, son las que yo uso:

dict.leo.org
(diccionario muy bueno ingles<->aleman, decente espanyol<->aleman)

www.myjmk.com
(diccionario bueno aleman<->espanyol, foro idiomatico muy bueno)

www.canoo.net
(compendio gramatical del aleman, muy bueno)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar