cli C ++有趣的静态值在包装器中

时间:2010-10-21 01:05:34

标签: c++-cli

//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!! 
}

任何人都可以解释这个吗?

1 个答案:

答案 0 :(得分:0)

静态成员不需要实例。

bObj->CCode_IFObject->funny在编译时转换为直接引用CCodeWrapperIF::funny

编辑:从标准类成员访问 [expr.ref]部分添加相关文本,来自C ++ 0x FCD的措辞

  

如果声明E2具有“对T的引用”类型,那么E1.E2是左值; E1.E2的类型为T.否则,以下规则之一适用。

     

- 如果E2是静态数据成员且E2的类型是T,则E1.E2是左值;表达式指定类的命名成员。 E1.E2的类型是T.

     

- 如果E2是非静态数据成员......表达式指定由第一个表达式指定的对象的命名成员。

     

...

如您所见,对于非静态成员,“由第一个表达式委派的对象”必须有效。但是静态成员可以通过点符号来识别,就像非静态成员一样,并且第一个表达式根本不必是任何对象,只有类很重要。