unresolved static variable 'Martingale::LossLots'

 

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

Помогите, пожалуйста разобраться в синтаксисе! Я вот так пишу:

class Martingale {
   public:
      static double LossLots[MAX_LOSSES_IN_A_ROW];

и получаю ошибку при попытке обращения:

static void Martingale::ReadLots() {
   Martingale::LossLots[0]   =  Loss01_lotSize;

Сообщение об ошибке в заголовке темы:

unresolved static variable 'Martingale::LossLots'       

А как правильно пользоваться статическими переменными классов?

 
Evgeny Potapov:

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

Помогите, пожалуйста разобраться в синтаксисе! Я вот так пишу:

и получаю ошибку при попытке обращения:

Сообщение об ошибке в заголовке темы:

А как правильно пользоваться статическими переменными классов?

Надо так

class Martingale {
   public:
      static double LossLots[MAX_LOSSES_IN_A_ROW];
};

double Martingale::LossLots[MAX_LOSSES_IN_A_ROW];
 
Alexey Volchanskiy:

Надо так

Супер! Да, так работает!
 
Evgeny Potapov:
Супер! Да, так работает!
Дядюшка Страуструп создал весьма путанный язык. Некоторые выверты типа этого двойного объявления статического поля я не могу объяснить логически. Ну а MQ вынуждены следовать подмножеству стандарта С++.
 
Alexey Volchanskiy:
Дядюшка Страуструп создал весьма путанный язык. Некоторые выверты типа этого двойного объявления статического поля я не могу объяснить логически. Ну а MQ вынуждены следовать подмножеству стандарта С++.
Дело в том, что статический член класса, по факту, является глобальной переменной, видимость которой, ограничена классом-владельцем.
Как и для всех глобальных переменных, порядок инициализации/деинициализации статических членов классов будет зависеть от порядка их размещения(объявления вне класса).
Кроме того, не редко требуется инициализация таких переменных значением + некоторым типам требуется явная инициализация (вызов конструктора с параметрами).

Некоторые программисты могут заложиться на порядок инициализации и для нас, проще отдать всё в руки создателя программы, нежели анализировать зависимости и самим организовывать инициализацию глобальных переменных.
Хотя, на досуге, мы подумаем над этим...
 
Ilyas:
Дело в том, что статический член класса, по факту, является глобальной переменной, видимость которой, ограничена классом-владельцем.
Как и для всех глобальных переменных, порядок инициализации/деинициализации статических членов классов будет зависеть от порядка их размещения(объявления вне класса).
Кроме того, не редко требуется инициализация таких переменных значением + некоторым типам требуется явная инициализация (вызов конструктора с параметрами).

Некоторые программисты могут заложиться на порядок инициализации и для нас, проще отдать всё в руки создателя программы, нежели анализировать зависимости и самим организовывать инициализацию глобальных переменных.
Хотя, на досуге, мы подумаем над этим...
Ну вот этот выверт " порядок инициализации/деинициализации статических членов классов будет зависеть от порядка их размещения(объявления вне класса)." ведь вообще ни в какие ворота не лезет. Это что - ассемблер?? С С++ много странных и ненужных фишек и хорошо, что они в MQL не перешли. Помню, как-то давно на собеседовании гоняли меня по этим фишкам, я тогда сказал товарищу, - вот честно, вы сами хоть раз это использовали?
 
Alexey Volchanskiy:
Некоторые выверты типа этого двойного объявления статического поля я не могу объяснить логически. Ну а MQ вынуждены следовать подмножеству стандарта С++.

Если у Вас несколько модулей, то второе объявление в С++ позволяет указать в каком именно модуле будет stаtic. Там static один на класс, что очень даже логично.

Чтобы критиковать С++ его нужно сначала изучить.

 
A100:

Если у Вас несколько модулей, то второе объявление в С++ позволяет указать в каком именно модуле будет stаtic. Там static один на класс, что очень даже логично.

Чтобы критиковать С++ его нужно сначала изучить.

Я С++ когда-то знал очень хорошо, но со временем все забывается. Поясните плз, следущее

1. Зачем переносить static в другой модуль?

2. Зачем мне нужно знать, где он расположен?

Только пожалуйста без сарказма и высокомерия, я и правда подзабыл тонкости языка.

 
Alexey Volchanskiy:
Ну вот этот выверт " порядок инициализации/деинициализации статических членов классов будет зависеть от порядка их размещения(объявления вне класса)." ведь вообще ни в какие ворота не лезет. Это что - ассемблер?? С С++ много странных и ненужных фишек и хорошо, что они в MQL не перешли. Помню, как-то давно на собеседовании гоняли меня по этим фишкам, я тогда сказал товарищу, - вот честно, вы сами хоть раз это использовали?
Полностью поддерживаю. Ни в Java ни в C# всего этого бреда нет. А приложения создаются в разы быстрее чем в C++. Зато с ведением этого нелепого явного объявления статических переменных, бегаешь по коду и смотришь, где же это я забыл инициализировать статическую переменную класса.
 
Alexey Volchanskiy:

Я С++ когда-то знал очень хорошо, но со временем все забывается. Поясните плз, следущее

1. Зачем переносить static в другой модуль?

2. Зачем мне нужно знать, где он расположен?

Только пожалуйста без сарказма и высокомерия, я и правда подзабыл тонкости языка.

Переносить не нужно, нужно указать где он будет изначально
//Test.h
class A { static int a; }
//-----------------------
//Test1.cpp
#include "Test.h"
//-----------------------
//Test2.cpp
#include "Test.h"
int A::a = 0; //static будет здесь в Test2.cpp
 
A100:
Переносить не нужно, нужно указать где он будет изначально
Неточно выразился, но ведь вы поняли вопрос. Зачем размещать инициализацию static в другом модуле? Желательно реальный пример + выгода от такого маневра.