//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!!
}
任何人都可以解释这个吗?
答案 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是非静态数据成员......表达式指定由第一个表达式指定的对象的命名成员。
...
如您所见,对于非静态成员,“由第一个表达式委派的对象”必须有效。但是静态成员可以通过点符号来识别,就像非静态成员一样,并且第一个表达式根本不必是任何对象,只有类很重要。