cli C ++ забавное статическое значение в обёртке - PullRequest
0 голосов
/ 21 октября 2010
//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 голосов
/ 21 октября 2010

Статические члены не нуждаются в экземпляре.

bObj->CCode_IFObject->funny преобразуется во время компиляции для прямого обращения к CCodeWrapperIF::funny.

РЕДАКТИРОВАТЬ: Добавление соответствующего текста из стандарта, раздел Доступ членов класса [expr.ref], формулировка из C ++ 0x FCD

Если E2 объявлен с типом «ссылка на T», то E1.E2 является lvalue; тип E1.E2 - T. В противном случае применяется одно из следующих правил.

- Если E2 является статическим элементом данных и тип E2 - T, то E1.E2 - lvalue; выражение обозначает именованный член класса. Тип E1.E2 - T.

- Если E2 является нестатическим элементом данных ... выражение обозначает именованный элемент объекта, обозначенного первым выражением.

...

Как видите, для нестатических членов «объект, делегированный первым выражением», должен быть действительным. Но статические члены могут быть идентифицированы точечной нотацией так же, как нестатические члены, и первое выражение вовсе не должно быть каким-либо объектом, важен только класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...