Форум программистов, компьютерный форум CyberForum.ru

Запретить редактирование переменной внутри класса - C++

Восстановить пароль Регистрация
 
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
28.05.2014, 07:15     Запретить редактирование переменной внутри класса #1
как сделать чтобы переменная (не const) внутри класса чтобы она одновременно была видна из места вызова, но ей там нельзя было что то присвоить? скажем:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Test
{
public:
int Count;
...
};
 
void main()
{
Test t;
int x;
x = count; //можно
count = x; //нельзя
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
28.05.2014, 07:29     Запретить редактирование переменной внутри класса #2
в чистом С++ так не получится...
можно объявить функцию, которая будет возвращать значение переменной
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Test {
private:
    int m_count;
public:
    int count() { return m_count; }
    /************/
};
/***********/
int main() {
    Test t;
    int x = t.count();
    return 0;
}
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
28.05.2014, 07:32     Запретить редактирование переменной внутри класса #3
А чем const не нравится?
Ну можешь #define использовать, только это будет не внутри класса...
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
28.05.2014, 07:59  [ТС]     Запретить редактирование переменной внутри класса #4
Цитата Сообщение от Cra3y Посмотреть сообщение
в чистом С++ так не получится...
а если не чистый? скажем C#, С++/cli? можно юзать property?

Добавлено через 49 секунд
Цитата Сообщение от solar_wind Посмотреть сообщение
А чем const не нравится?
тем что эта переменная может (и будет) меняться внутри класса, но снаружи ее менять нельзя !
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
28.05.2014, 08:12     Запретить редактирование переменной внутри класса #5
GetHelp, Я так понял сначала, что ее нельзя менять и внутри класса.....
Но если так, то объявляешь ее private, пишешь функцию только для чтения переменной и все....какие проблемы......
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
28.05.2014, 08:16     Запретить редактирование переменной внутри класса #6
про C# С++/cli-нику ничего сказать не могу...
немного изврата на С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Counter;
class Test {
private:
    int m_count;
public:
    /************/
friend class Counter;
};
class Counter {
private:
    int *m_count;
public:
    Counter(const Test& val):m_count(&val.m_count) {}
    int operator()() { return *m_count; }
};
/***********/
int main() {
    Test t;
    Counter count(t);
    int x = count();
    return 0;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
28.05.2014, 08:27     Запретить редактирование переменной внутри класса #7
Цитата Сообщение от Cra3y Посмотреть сообщение
Counter(const Test& val):m_count(&val.m_count) {}
const пришлось убрать.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
28.05.2014, 08:58  [ТС]     Запретить редактирование переменной внутри класса #8
Cra3y, не очень светлая мысль так бы все хорошо, но теперь это выглядит как функция (что в общем то и есть на самом деле), соответственно когда будешь юзать надо будет писать Count(), ну как то это не логично... хочется чтобы это выглядело именно как переменная...
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
28.05.2014, 09:09     Запретить редактирование переменной внутри класса #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от GetHelp Посмотреть сообщение
хочется чтобы это выглядело именно как переменная
Именно для этого и нужно
Цитата Сообщение от GetHelp Посмотреть сообщение
юзать property
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
28.05.2014, 09:13     Запретить редактирование переменной внутри класса #10
Цитата Сообщение от Cra3y Посмотреть сообщение
в чистом С++ так не получится...
Впринципе можно. Для этого нужно использовать константный объект и переменные члены объявленные со спецификатором mutable. Однако это не всегда хорошее решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Test
{
public:
  int Count;
  mutable int Sec;
  Test(): Count(), Sec()
  {}
};
 
int main()
{
  const Test t;
  int x;
  x = t.Count; //можно
  //t.Count = x; //нельзя
 
  x = t.Sec; //можно
  t.Sec = x; //можно
  return 0;
}
Но лучше использовать const спецификаторы полей класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Test
{
public:
  const int Count;
  int Sec;
  Test(): Count(), Sec()
  {}
};
 
int main()
{
  Test t;
  int x;
  x = t.Count; //можно
  //t.Count = x; //нельзя
 
  x = t.Sec; //можно
  t.Sec = x; //можно
  return 0;
}
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
28.05.2014, 09:47     Запретить редактирование переменной внутри класса #11
Продолжение изврата
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Test {
private:
    int m_count;
public:
    /************/
    class Counter {
    private:
        int *m_count;
        Counter(){}
    public:
        Counter(Test& val):m_count(&val.m_count) {}
        operator int() const {
        return *m_count;
    }
    };
};
/***********/
int main() {
    Test t;
    Test::Counter count(t);
    int x = count; // << OK
    //count = x; // << error
    return 0;
}
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
28.05.2014, 12:03  [ТС]     Запретить редактирование переменной внутри класса #12
Цитата Сообщение от Cra3y Посмотреть сообщение
Продолжение изврата
да хватит извращаться, короче смысл в переходе на шарп или cli и использовании там property с get/set...
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
28.05.2014, 12:39     Запретить редактирование переменной внутри класса #13
Цитата Сообщение от GetHelp Посмотреть сообщение
в переходе на шарп или cli
А борландовый диалект вы не рассматриваете? Там вам и property и плюсы.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
28.05.2014, 14:14  [ТС]     Запретить редактирование переменной внутри класса #14
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А борландовый диалект вы не рассматриваете? Там вам и property и плюсы.
не знал что борландовый си отличается от vs-вского... так или иначе я чаще пишу под VS, там на мой взгляд все куда удобнее чем допотопном борланде, вообще борланд это метрвый проект имхо, что делфи (вообще язык уже мертвый), что си...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2014, 14:22     Запретить редактирование переменной внутри класса
Еще ссылки по теме:

C++ Создать объект внутри класса, который может вызывать функцию этого класса
C++ Методы класса внутри определения класса
C++ Видимость экземпляра класса внутри класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
28.05.2014, 14:22     Запретить редактирование переменной внутри класса #15
Цитата Сообщение от GetHelp Посмотреть сообщение
не знал что борландовый си отличается от vs-вского
Си-то не отличается, а вот реализации тех или иных механизмов разнятся, тех же property.
Цитата Сообщение от GetHelp Посмотреть сообщение
чем допотопном борланде
Пишите на недопотопном.
Цитата Сообщение от GetHelp Посмотреть сообщение
что делфи, что си
Которые не при делах тут.

Все, все, все. Ладно. Завязываю. Убеждать однобоких людей дело не благодарное.
Yandex
Объявления
28.05.2014, 14:22     Запретить редактирование переменной внутри класса
Ответ Создать тему
Опции темы

Текущее время: 13:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru