C++ cli clic++;包装器中有趣的静态值 //ccodewraperif.h 公共参考类CCodewraperif { 公众: ccodewraperif//默认构造函数 公众: 静态UINT8有趣; void foo(void); } //CCodewraperif.cpp 外部“C” { #包括“CCodewraperif.h” } [DllImport(“CCode.DLL”,CallingConvention=CallingConvention::Cdecl)] 外部“C”无效CCode_Foo(无效); ccodewraperif::ccodewraperif(void) { } CCodewraperif::foo(无效) { CCode_Foo(); } //a、 h 公共参考A级 { 私有:静态ccodewraperif^CCode\IFObject; A(无效) { CCode_IFObject=gcnew ccodewraperif(); } } //b、 h B级公共参考文献 { 私有:静态ccodewraperif^CCode\IFObject; B(无效) { } } //main.h int main(cli::数组^args) { A^aObj=gcnew A(); B^bObj=gcnew B(); //有趣的是:bObj->CCode\u IFObject->funcy总是有正确的值! //如果你观察bObj->CCode\u IFObject的值,实际上它是没有定义的!! }

C++ cli clic++;包装器中有趣的静态值 //ccodewraperif.h 公共参考类CCodewraperif { 公众: ccodewraperif//默认构造函数 公众: 静态UINT8有趣; void foo(void); } //CCodewraperif.cpp 外部“C” { #包括“CCodewraperif.h” } [DllImport(“CCode.DLL”,CallingConvention=CallingConvention::Cdecl)] 外部“C”无效CCode_Foo(无效); ccodewraperif::ccodewraperif(void) { } CCodewraperif::foo(无效) { CCode_Foo(); } //a、 h 公共参考A级 { 私有:静态ccodewraperif^CCode\IFObject; A(无效) { CCode_IFObject=gcnew ccodewraperif(); } } //b、 h B级公共参考文献 { 私有:静态ccodewraperif^CCode\IFObject; B(无效) { } } //main.h int main(cli::数组^args) { A^aObj=gcnew A(); B^bObj=gcnew B(); //有趣的是:bObj->CCode\u IFObject->funcy总是有正确的值! //如果你观察bObj->CCode\u IFObject的值,实际上它是没有定义的!! },c++-cli,C++ Cli,有人能解释一下吗?静态成员不需要实例 bObj->CCode\u IFObject->funcy在编译时转换为直接引用ccodewraperif::funcy 编辑:添加标准中的相关文本,部分类成员访问[expr.ref],来自C++0x FCD的措辞 如果E2被声明为具有类型“reference to T”,那么E1.E2是一个左值;E1.E2的类型为T。否则,以下规则之一适用 -如果E2是静态数据成员,E2的类型是T,那么E1.E2是左值;表达式指定类的命名成员。E1.E2的类型是T -如果

有人能解释一下吗?

静态成员不需要实例

bObj->CCode\u IFObject->funcy
在编译时转换为直接引用
ccodewraperif::funcy

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

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

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

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


如您所见,对于非静态成员,“由第一个表达式委派的对象”必须有效。但是静态成员可以像非静态成员一样用点符号来标识,第一个表达式根本不必是任何对象,只有C++类才是重要的。这个用法能在VC或GCC下通过编译吗?我的例子是私有的:静态CCodeWrapperIF^CCode\uIfObject;而且每个类都可以使用相同的CCode_IFObject->有趣的是,即使这个类不是new/gcnew,只要定义它就可以了!简而言之,程序只有一个副本,因为CCode_IFObject在某个地方只创建了一次。对于这种情况,有两种方法可以访问它。#1使用CCodeWrapperIF::Funcy获取它#2声明一个对象CCodeWrapperIF类的CCode_IFObject,无需初始化,然后使用CCode_IFObject->Funcy获取它,这也没关系。你粘贴的说明了#1,但我插入的是#2。这是我的理解……如果我错了,请纠正我,谢谢。如果你注意到,我引用的标准部分中没有任何内容涉及范围解析运算符(
)。我引用的上面一段说,
->
变成了
,为了我们讨论的目的,关于
E1.E2
的所有内容也适用于
E1->E2
//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!! 
}