Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статичный член-элемент 
:(
    Опции темы
hoz
Дата 17.8.2014, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Мне нужно чтоб член-элемент структуры, да и классов тоже по сути, становился статичным и не терял своё значение после отработки метода. Если в теле класса, например, в секции private написать static требуемой перемонной, то код не компилируется.
Я так понимаю, это не возможно. Получается нужно как-то передавать значения всех переменных через параметры дабы выделить память?
Как это правильно делается?
Например, вот моя структура есть:
Код

struct Position_Properties
{
   datetime    gdt_Expiration;      // Срок истечения отложенного ордера
   datetime    gdt_OpenTime;        // Время открытия выбранной позиции
   double      gd_OpenPrice;        // Цена открытия
   double      gd_Lots;             // Объём позиции на открытие
   double      gd_CurSL;            // Текущий Stop Loss выбранной позиции
   double      gd_NewSL;            // Новый Stop Loss выбранной позиции
   double      gd_CurTP;            // Текущий Take Profit выбранной позиции
   double      gd_NewTP;            // Новый Take Profit выбранной позиции
   int         gi_CurTicket;        // Тикет выбранного ордера
   int         gi_Type;             // Тип торговой операции
   int         gi_Slippage;         // Максимально допустимое отклонение цены для рыночных ордеров
   int         gi_Magic;            // Магический номер
   string      gs_Comment;          // Комментарий
   string      gs_Symbol;           // Наименование фин. инструмента, с которым производится операция
   ulong       gu_Duration;         // Длительность позиции в секундах
};

PM MAIL   Вверх
NoviceF
Дата 18.8.2014, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(hoz @  17.8.2014,  23:56 Найти цитируемый пост)
Если в теле класса, например, в секции private написать static требуемой перемонной, то код не компилируется.

Не уверен, что это так, приведи пример.

Подход со статическими переменными влечёт за собой следующую особенность - эти переменные общие для всех экземпляров класса. Твоя структура описывает свойства конкретной позиции, если ты добавишь туда статические поля, то они станут общими для всех позиций.

Цитата(hoz @  17.8.2014,  23:56 Найти цитируемый пост)
Мне нужно чтоб член-элемент структуры, да и классов тоже по сути, становился статичным и не терял своё значение после отработки метода. 

А поля объекта и так не теряют значения после своего изменения, пока объект находится в области видимости.
Может ты имел ввиду, чтобы поля становились константными? Если нужно инициализировать значения только один раз - можешь сделать поля константными и провести инициализацию в конструкторе.

Из того, что ты написал, лично я пока не могу понять, в чём заключается проблема smile


PM MAIL   Вверх
tzirechnoy
Дата 18.8.2014, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



Например, научитесь выражать свои проблемы понятным русским языком. А то пока что -- Вы что-то написали, у Вас что-то не скомпилировалось, и Вы не знаете, как что-то сделать.
К сожалению, это что-то описано в таких терминах, по которым совершэнно нереально понять, что Вы хотите и что у Вас не получается.
PM MAIL   Вверх
hoz
Дата 18.8.2014, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



tzirechnoy, 
 Статический член-элемент как-то иначе можно понять? По-моему это понимается однозначно. Мне нужно, чтоб выделялась память на те члены-элементы, которые я выше привёл и всё. Причём для всех объектов. Хочу понять как это правильно делается. Ибо я этот момент не втыкаю на данный момент.
Например, тут такая же ошибка как у меня выскакивает.

Цитата(NoviceF @  18.8.2014,  08:32 Найти цитируемый пост)
Не уверен, что это так, приведи пример.

NoviceF, вот именно, так и есть. Если просто в секции private, например, инициализировать переменную с модификатором static, то компилятор ругается, так примерно как по ссылке выше..
У меня было вот так:
Код

unresolved static variable 'Lots_Properties::gd_LotStep'        MarketData.mqh  72      23

Цитата(NoviceF @  18.8.2014,  08:32 Найти цитируемый пост)
Подход со статическими переменными влечёт за собой следующую особенность - эти переменные общие для всех экземпляров класса. Твоя структура описывает свойства конкретной позиции, если ты добавишь туда статические поля, то они станут общими для всех позиций.

Мне это и нужно. В будущем, если позиций будет больше по-моему логично будет члены-элементы реализовать как массивы. С индексом канкретного инструменты. Я так думаю. Если не согласны прошу Вас обосновать.

Цитата(NoviceF @  18.8.2014,  08:32 Найти цитируемый пост)
А поля объекта и так не теряют значения после своего изменения, пока объект находится в области видимости.

Область видимость это пока не отработал код или пока программа не закрыта вообще? Я некоторые момент недопонимаю. Прошу понять меня правильно. Я программирую для себя. Но образования специального нет. Так что в некоторых момента плаваю.. Хотя и читал не мало. Но не всё понимаю. Потом и интересуюсь.

Цитата(NoviceF @  18.8.2014,  08:32 Найти цитируемый пост)
 Если нужно инициализировать значения только один раз - можешь сделать поля константными и провести инициализацию в конструкторе.

Это как?

Это сообщение отредактировал(а) hoz - 18.8.2014, 20:23
PM MAIL   Вверх
NoviceF
Дата 19.8.2014, 10:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(hoz @  18.8.2014,  21:22 Найти цитируемый пост)
Если просто в секции private, например, инициализировать переменную с модификатором static, то компилятор ругается, так примерно как по ссылке выше..

Так дело не в модификаторе доступа секции, в а том, что нельзя инциализировать статический член в теле класса (если это не простой целочисленный тип).

Цитата(hoz @  18.8.2014,  21:22 Найти цитируемый пост)
Мне это и нужно. В будущем, если позиций будет больше по-моему логично будет члены-элементы реализовать как массивы. С индексом канкретного инструменты. Я так думаю. Если не согласны прошу Вас обосновать.

По-моему логично как раз наоборот, сделать статический (или глобальный или в рамках паттерна одиночка) массив, и его элементами сделать записи, так, чтобы каждая запись характеризовала конкретную позицию. Хотя всё это зависит от того, что именно делает ПО и для чего вообще используется эта структура.

Цитата(hoz @  18.8.2014,  21:22 Найти цитируемый пост)
Область видимость это пока не отработал код или пока программа не закрыта вообще? 

Код

int main (int, char**)
{
    { // <-- начало области видимости
        int i = 0;    // <-- объявление и определение переменной i

        i = 10; // <-- здесь i ещё видно
    } // <-- конец области видимости в которой i была объявлена
    // <-- здесь i уже не существует

    return 0;
}


Цитата(hoz @  18.8.2014,  21:22 Найти цитируемый пост)
Это как?

Код

struct Position_Properties
{
    Position_Properties(double openPrice, double lots) :
        gd_OpenPrice(openPrice), gd_Lots(lots) {}

   const double      gd_OpenPrice;        // Цена открытия
   const double      gd_Lots;             // Объём позиции на открытие

};


PM MAIL   Вверх
sQu1rr
Дата 20.8.2014, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(hoz @  18.8.2014,  20:22 Найти цитируемый пост)
 Если просто в секции private, например, инициализировать переменную с модификатором static, то компилятор ругается, так примерно как по ссылке выше..

Код

class SomeClass {
#include <iostream>

class SomeClass {
public:
    int getI() const {
        return i;
    }
private:
    static int i;
};

int SomeClass::i = 0;

int main() {
    std::cout << (SomeClass().getI()) << std::endl;
}

Цитата(hoz @  18.8.2014,  20:22 Найти цитируемый пост)
Например, тут такая же ошибка как у меня выскакивает.

Там кстати все объяснили
Цитата(hoz @  18.8.2014,  20:22 Найти цитируемый пост)
unresolved static variable 'Lots_Properties::gd_LotStep'        MarketData.mqh  72      23

И компилятор объяснил
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.4143 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.