2010-10-21 4 views
0
//CCodeWrapperIF.h 
public ref class CCodeWrapperIF 
{ 
public: 
    CCodeWrapperIF// Default constructor 

public: 

    static UINT8 funny; 

    void foo(void); 

} 


//CCodeWrapperIF.cpp 
extern "C" 
{ 
#include "CCodeWrapperIF.h" 
} 

[DllImport("CCode.DLL", CallingConvention = CallingConvention::Cdecl)] 
extern "C" void CCode_Foo(void); 

CCodeWrapperIF::CCodeWrapperIF(void) 
{ 

} 

CCodeWrapperIF::foo(void) 
{ 
    CCode_Foo(); 
} 



//a.h 
public ref class A 
{ 
private: static CCodeWrapperIF^ CCode_IFObject; 
A(void) 
{ 
    CCode_IFObject=gcnew CCodeWrapperIF(); 
} 

} 

//b.h 


public ref class B 
{ 
    private: static CCodeWrapperIF^ CCode_IFObject; 

    B(void) 
    { 

    } 
} 


//main.h 
int main(cli::array<System::String ^> ^args) 
{ 
    A^ aObj=gcnew A(); 
    B^ bObj=gcnew B(); 

    // Funny thing is : bObj->CCode_IFObject->funny has correct value always! 
    // while if you watch the value of bObj->CCode_IFObject acturally it is not defined!! 
} 

quelqu'un peut-il expliquer cela?cli C++ valeur statique drôle dans l'emballage

+0

environnement de construction VS2008 ou VC2008 express – Biwier

Répondre

0

Les membres statiques n'ont pas besoin d'instance.

bObj->CCode_IFObject->funny est converti au moment de la compilation pour se référer directement à CCodeWrapperIF::funny.

EDIT: Ajout d'un texte pertinent de la norme, section accès aux membres de classe[expr.ref], libellé du C++ 0x FCD

Si E2 est déclaré avoir le type « référence à T », puis E1 .E2 est une lvalue; le type de E1.E2 est T. Sinon, l'une des règles suivantes s'applique. - Si E2 est un membre de données statiques et que le type de E2 est T, alors E1.E2 est une lvalue; l'expression désigne le membre nommé de la classe. Le type de E1.E2 est T.

- Si E2 est un membre de données non statique ... l'expression désigne le membre nommé de l'objet désigné par la première expression.

...

Comme vous pouvez le voir, pour les membres non statiques « l'objet délégué par la première expression » doit être valide. Mais les membres statiques peuvent être identifiés par la notation par points tout comme les membres non statiques, et la première expression ne doit pas nécessairement être n'importe quel objet, seule la classe compte.

+0

est la norme C++ décrite ou autorisée? Cette utilisation peut-elle passer la compilation sous VC ou GCC? – Biwier

+0

Il est expressément autorisé par la norme. Voir éditer. –

+0

mon exemple est privé: static CCodeWrapperIF^CCode_IFObject; et chaque classe peut utiliser la même valeur de CCode_IFObject-> funny même la classe n'est pas nouvelle/gcnew il suffit de la définir c'est ok! en bref, le programme n'a qu'une seule copie de drôle parce que le CCode_IFObject seulement créé une fois quelque part. pour une telle situation, il y a deux façons d'y accéder: # 1 utiliser CCodeWrapperIF :: funny pour l'obtenir # 2 déclarer un objet CCode_IFObject de classe CCodeWrapperIF et pas besoin de l'initialiser puis utiliser CCode_IFObject-> funny pour l'obtenir, c'est ok aussi ce que vous avez collé a expliqué le # 1 mais je suis intereting est le # 2. – Biwier