PDA

Visualizza la versione completa : [c++]static


giuseppe500
09-08-2010, 02:08
ciao,
ho una funzione :


void MaterialTextureConnections( tag_INT_MATERIAL* pMat, KFbxSurfaceMaterial* pMaterial)
{
KFbxProperty lProperty;

//Diffuse Textures
lProperty = pMaterial->FindProperty((char const*)KFbxSurfaceMaterial::sDiffuse);
pMat->m_strDiffuseTexture = GetTexturesName(&lProperty);
}


quando hoprovato a crearla, inserendo il pMaterial->FindProperty, vuole che sia statica, e quindi l'ho dichiarata statica:


static void MaterialTextureConnections(tag_INT_MATERIAL* pMat, KFbxSurfaceMaterial* pMaterial);


il problema che se la invoco dall'interno della classe da una funzione non statica mi da il seguente errore:
Error 14 error LNK2001: unresolved external symbol "public: static char const * const fbxsdk_2011_3::KFbxSurfaceMaterial::sDiffuse" (?sDiffuse@KFbxSurfaceMaterial@fbxsdk_2011_3@@2PBD B) FbxLoader.obj

come si gestisce una funzione statica in questo caso?
da quello che ho letto su google una funzione statica ha accesso solo a membri statici e non a membri non statici di classe ,non ha stato ,e non possibile utilizzare this, ma non so proprio come procedere.

grazie.

giuseppe500
09-08-2010, 12:29
questa se puo servire la classe incriminata ,ho un costruttore protetto , perch protetto?


#include <fbxfilesdk/fbxfilesdk_def.h>

#include <fbxfilesdk/kfbxplugins/kfbxobject.h>
#include <fbxfilesdk/kfbxplugins/kfbxcolor.h>
#include <fbxfilesdk/kfbxplugins/kfbxgroupname.h>

// FBX namespace
#include <fbxfilesdk/fbxfilesdk_nsbegin.h>

/** This class contains material settings.
* \nosubgrouping
*/
class KFBX_DLL KFbxSurfaceMaterial : public KFbxObject
{
KFBXOBJECT_DECLARE(KFbxSurfaceMaterial, KFbxObject);

public:
/**
* \name Standard Material Property Names
*/
//@{

static char const* sShadingModel;
static char const* sMultiLayer;

static char const* sEmissive;
static char const* sEmissiveFactor;

static char const* sAmbient;
static char const* sAmbientFactor;

static char const* sDiffuse;
static char const* sDiffuseFactor;

static char const* sSpecular;
static char const* sSpecularFactor;
static char const* sShininess;

static char const* sBump;
static char const* sNormalMap;
static char const* sBumpFactor;

static char const* sTransparentColor;
static char const* sTransparencyFactor;

static char const* sReflection;
static char const* sReflectionFactor;

static char const* sDisplacementColor;
static char const* sDisplacementFactor;

//@}

/**
* \name Material Properties
*/
//@{

/** Returns the material shading model.
* \return The shading model.
*/
KFbxPropertyString GetShadingModel() const;

/** Returns the multilayer state.
* \return The state of the multi-layer flag.
*/
KFbxPropertyBool1 GetMultiLayer() const;

//@}

//////////////////////////////////////////////////////////////////////////
// Static values
//////////////////////////////////////////////////////////////////////////

/**
* \name Default property values
*/
//@{

static fbxBool1 sMultiLayerDefault;
static char const* sShadingModelDefault;

//@}

///////////////////////////////////////////////////////////////////////////////
//
// WARNING!
//
// Anything beyond these lines may not be documented accurately and is
// subject to change without notice.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef DOXYGEN_SHOULD_SKIP_THIS

// Clone
virtual KFbxObject* Clone(KFbxObject* pContainer, KFbxObject::ECloneType pCloneType = eDEEP_CLONE) const;

protected:
bool SetColorParameter(KFbxProperty pProperty, KFbxColor const& pColor);
bool GetColorParameter(KFbxProperty pProperty, KFbxColor& pColor) const;
bool SetDoubleParameter(KFbxProperty pProperty, double pDouble);
bool GetDoubleParameter(KFbxProperty pProperty, double pDouble) const;

KFbxSurfaceMaterial(KFbxSdkManager& pManager, char const* pName);

virtual bool ConstructProperties(bool pForceSet);

public:
// From KFbxObject
virtual KString GetTypeName() const;

protected:
KFbxPropertyString ShadingModel;
KFbxPropertyBool1 MultiLayer;

friend class KFbxLayerContainer;
#endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
};

typedef KFbxSurfaceMaterial* HKFbxSurfaceMaterial;

#include <fbxfilesdk/fbxfilesdk_nsend.h>

#endif // FBXFILESDK_KFBXPLUGINS_KFBXSURFACEMATERIAL_H

shodan
09-08-2010, 18:30
Una funzione statica non diversa da una funzione classica. Cambia il tipo di linkage (C++ ovviamente), esiste solo se preceduta dal nome della classe o struttura di appartenza, ma il comportamento uguale a una normale funzione.
Nel tuo caso, se non hai messo:


void KFbxSurfaceMaterial::MaterialTextureConnections (/*parametri*/)

(con il KFBX_DLL tra il void e il nome della classe probabilmente), il linker non trova la signature corretta della funzione e segnala errore.
Se invece l'hai dichiarata e definita all'interno della classe stessa, c' altro in gioco.

Un costruttore viene protetto quando non si vuole che l'utente possa istanziare la classe direttamente, ma solo attraverso un metodo (static ovviamente), oppure una funzione e/o classe friend (tipicamente una factory). In questo caso attraverso KFbxLayerContainer, probabilmente.

giuseppe500
09-08-2010, 20:11
mi sspiace se rompo , ma devo capire perch non funziona anche se so che per te molto difficile aiutarmi con poche spiegazioni.
la classe che ti ho postato relativa al pMaterial che di tipo KFbxSurfaceMaterial con relativa classe che ho postato.
la funzione


void KFBX_DLL CFbxLoader::MaterialTextureConnections( tag_INT_MATERIAL* pMat, KFbxSurfaceMaterial* pMaterial)
{
KFbxProperty lProperty;

//////Diffuse Textures
lProperty = pMaterial->FindProperty(KFbxSurfaceMaterial::sDiffuse);
.
.
.
}

che interna alla mia classe CFbxLoader
non ha problemi se commento la linea

lProperty = pMaterial->FindProperty(KFbxSurfaceMaterial::sDiffuse);

ma se la uncommento: becco quest' errore:
Error 1 error LNK2001: unresolved external symbol "public: static char const * const fbxsdk_2011_3::KFbxSurfaceMaterial::sDiffuse" (?sDiffuse@KFbxSurfaceMaterial@fbxsdk_2011_3@@2PBD B) FbxLoader.obj

e non capisco.
scusa se mi sono spiegato male.
ciao

MacApp
09-08-2010, 20:43
Originariamente inviato da giuseppe500

ma se la uncommento: becco quest' errore:
Error 1 error LNK2001: unresolved external symbol "public: static char const * const fbxsdk_2011_3::KFbxSurfaceMaterial::sDiffuse" (?sDiffuse@KFbxSurfaceMaterial@fbxsdk_2011_3@@2PBD B) FbxLoader.obj

e non capisco.
scusa se mi sono spiegato male.
ciao
devi definire il membro statico (tipicamente in un cpp):


char const* KFbxSurfaceMaterial::sDiffuse = "pinco pallino" // o altro valore d'inizializzazione;

Loading