unresolved static variable (внутри самого класса)

 

Здравствуйте! 

Стоит задача выдавать желающим единственный экземпляр класса CEnvironment, пишу:

class CEnvironment
{
public:
   string meS;
   CEnvironment::CEnvironment()
   {
      meS = "meS";
   }
};

class CEAFactoryAbstract
  {
public:
   CEAFactoryAbstract::CEAFactoryAbstract();
   CEAFactoryAbstract::~CEAFactoryAbstract() {delete meCEnvironment;};
   CEnvironment                          *getCEnvironment();
private:
   static CEnvironment                   *meCEnvironment;
  };

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CEnvironment *CEAFactoryAbstract::getCEnvironment()
  {
   if(meCEnvironment == NULL)
     {
      meCEnvironment = new CEnvironment();
     }
   return meCEnvironment;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//---

  }
//+------------------------------------------------------------------+

при компилировании, получаю

unresolved static variable 'CEAFactoryAbstract::meCEnvironment' FactoryStatic.mq5 16 54

Прочел, https://www.mql5.com/ru/forum/65668, понял, что вне класса нужно указывать явно указывать где определяется статическая переменная, но не понял, что делать, если static используется внутри.

?

   

unresolved static variable 'Martingale::LossLots'
unresolved static variable 'Martingale::LossLots'
  • 2015.10.18
  • www.mql5.com
unresolved static variable 'Martingale::LossLots' А как правильно пользоваться статическими переменными классов?
 

Добавьте после второго класса:

CEnvironment *  CEAFactoryAbstract::meCEnvironment=NULL;
 
Dmitry Fedoseev:

Добавьте после второго класса:

Спасибо!

 

Зачем так много букв?

class CEnvironment
{
   CEnvironment():meS("meS"){}
public:
   string meS;
   static CEnvironment* Get(){
      static CEnvironment obj;
      return &obj;}
};

void OnStart()
  {
  Print(CEnvironment::Get().meS);
  }

или, если надо возможность наследования, контроля количества ссылок и т.п.:

class CEnvironment
{
protected:
   static CEnvironment* obj;
   CEnvironment():meS("meS"){}
  ~CEnvironment(){}
public:
   string meS;
   static CEnvironment* Get(){
      if (!obj) obj=new CEnvironment;
      return obj;}
   static void Free() {delete obj;}
};

CEnvironment* CEnvironment::obj=NULL;

void OnStart()
  {
  Print(CEnvironment::Get().meS);
  CEnvironment::Free();
  }
 
Vladimir Simakov:

Зачем так много букв?

или, если надо возможность наследования, контроля количества ссылок и т.п.:

спасибо!

Иногда нужны дополнительные буквы ))