6 / 6 / 3
Регистрация: 17.04.2014
Сообщений: 156
1

Как перегрузить методы, чтобы получились аналоги get set из C#

12.10.2015, 22:15. Показов 4645. Ответов 75
Метки нет (Все метки)

Как можно перегрузить методы, что бы получился аналог get set из C#. Т.е. что то такое:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A
{
 private:
       int count;
 public:
       int X
       {
           get { return x; }
       }
       A(){}
       ~A(){}
}
 
main()
{
     int y;
     A a();
     y = a.X;
}
P.S. знаю, что данный код не будет работать
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2015, 22:15
Ответы с готовыми решениями:

Как сделать, чтобы из числа, допустим, 0,040005000 после 5 получились звёздочки
Как сделать, чтобы из числа, допустим, 0,040005000 после 5 получились звёздочки, именно после...

Std::set с кастомным классом, как правильно перегрузить оператор < ?
Доброго времени суток, у меня имееться такой класс: class Truck { public: size_t...

Как перегрузить методы Equals() и GetHashCode(), для сравнения свойств объектов?
Есть два объекта класса Квадрат.Необходимо сравнить их по площади заданной свойством. Для этого...

Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы
Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…)....

75
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
12.10.2015, 22:18 2
Создай функции getX() и setX().
0
6 / 6 / 3
Регистрация: 17.04.2014
Сообщений: 156
12.10.2015, 22:25  [ТС] 3
Ну это то понятно, что можно. Ну интересует именно перегрузка
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
12.10.2015, 22:32 4
Цитата Сообщение от Lagilo Посмотреть сообщение
Как можно перегрузить методы, что бы получился аналог get set из C#. Т.е. что то такое:
В твоём примере не видно перегрузки. Поясни что ты имеешь в виду.
0
6 / 6 / 3
Регистрация: 17.04.2014
Сообщений: 156
12.10.2015, 22:34  [ТС] 5
Прошу прощения. Там вмсето count долен быть x

Добавлено через 1 минуту
Перегрузки нет) В том то и вопрос как его сделать)
Как сделать свойство для приватной переменной класса, что бы его можно было использовать на подобии C#?
Нашел какой то __declspec, но пока не понял
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
12.10.2015, 22:37 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
class A {
    int i;
 
public:
    A( int _i ) : i (_i) {}
    int foo( int ) { return i; }
    int foo( double ) { return i * 2; }
};
 
int main()
{
    A a( 100 );
    std::cout << a.foo( 123  ) << std::endl; // 100
    std::cout << a.foo( 123. ) << std::endl; // 200
}
Добавлено через 1 минуту
Цитата Сообщение от Lagilo Посмотреть сообщение
что бы его можно было использовать на подобии C#?
Тут единицы знают как это используется в C#. Приведи хотя бы пример на C#.
0
6 / 6 / 3
Регистрация: 17.04.2014
Сообщений: 156
12.10.2015, 22:48  [ТС] 7
Так инкапсулируются переменные:
C#
1
2
3
4
5
6
7
8
9
class A
{
        private int x;
        public int X
        {
            get { return x; }
            set { x = value; }
        }
}
C#
1
2
3
4
int y;
A a = new A();//так объявляется переменная класса А
y = a.X;
a.X = y;
Вот так это работает) На мой взгляд, очень просто)
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
12.10.2015, 22:52 8
Цитата Сообщение от Lagilo Посмотреть сообщение
Так инкапсулируются переменные:
Ок. Где перегрузка?
0
6 / 6 / 3
Регистрация: 17.04.2014
Сообщений: 156
12.10.2015, 22:59  [ТС] 9
Нет перегрузки..) Она и не требуется, потому что сам C# уже нормально умеет инкапсулировать переменные.
С++ так не умеет, поэтому приходится либо писать функции, которые неудобны, либо как то перегрузить операторы, чтобы можно было писать как на C#
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
12.10.2015, 23:08 10
Цитата Сообщение от Lagilo Посмотреть сообщение
Нет перегрузки..) Она и не требуется, потому что сам C# уже нормально умеет инкапсулировать переменные.
С++ так не умеет, поэтому приходится либо писать функции, которые неудобны, либо как то перегрузить операторы, чтобы можно было писать как на C#
Ты говоришь так, будто перегрузка и инкапсуляция - одно и то же. Это не так.
Тебе нужны так называемые "Гетеры" и "Сетеры"?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
class A {
    int x;
 
public:
    A() : x( 0 ) {}
 
    // ...
 
    int get() const { return x; }
    void set( int new_x ) { x = new_x; }
};
 
int main()
{
    A a;
    std::cout << a.get() << std::endl;
    a.set( 123 );
    std::cout << a.get() << std::endl;
}
C++ умеет больше чем ты думаешь.
0
2055 / 1533 / 166
Регистрация: 14.12.2014
Сообщений: 13,345
12.10.2015, 23:14 11
В нормальных компиляторах делается так:
C++
1
2
3
4
5
6
7
class Foo{
       protected:
          void SetBar(int newBar);
          int GetBar();
       public:
          __property int Bar={read=GetBar, write=SetBar};
}

Во всех остальных:
C++
1
2
3
4
5
6
class Foo{
       public:
          void SetBar(int newBar);
          int GetBar();
            __declspec (property(get=GetBar,set=SetBar))int Bar;
};
1
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
12.10.2015, 23:20 12
Fulcrum_013, я и не знал, что в C++ есть эти квази-поля как в C#. Это часть стандарта?
0
2055 / 1533 / 166
Регистрация: 14.12.2014
Сообщений: 13,345
12.10.2015, 23:23 13
Смотри внимательно разницу между случаями. В том который в стандарте свойству можно назначить только геттеры и сеттеры из той же или более открытой области видимости, что в общем то нарушает инкапсуляцию, особенно если сеттер или геттер идут на прямую, т.е в get или set указывается сама переменная а не функция доступа.

Добавлено через 2 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
я и не знал, что в C++ есть эти квази-поля как в C#. Это часть стандарта?
Они появились гораздо раньше чем C#, году этак в 95-о в двух вариантах - борландовском и мелкомягком. мелкомягкий потом внесли в стандарт.
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
12.10.2015, 23:25 14
Цитата Сообщение от nmcf Посмотреть сообщение
Это часть стандарта?
нет.
0
2055 / 1533 / 166
Регистрация: 14.12.2014
Сообщений: 13,345
12.10.2015, 23:26 15
Они кстати еще могут и применяться для инкапсуляции доступа к массивам любой размерности, причем индексом массива может быть любой тип, в том числе и пользовательский.
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
12.10.2015, 23:27 16
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Они появились гораздо раньше чем C#, году этак в 95-о в двух вариантах - борландовском и мелкомягком. мелкомягкий потом внесли в стандарт.
Что за бред? Этого нет в C++.
0
6 / 6 / 3
Регистрация: 17.04.2014
Сообщений: 156
12.10.2015, 23:28  [ТС] 17
C++
1
2
3
4
5
6
7
int main()
{
    int y;
    A a;
    a.set = 123;
    y = a.get;
}
Вот что нужно было) Ну а просто написать такие функции конечно же можно)
Т.е. я хотел перегрузить операцию какую то бинарную или унарную операцию для определенной переменной)
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
12.10.2015, 23:28 18
Ну здесь всё же немного не так. В C# можно назначить одно имя для свойства, а фактически оперировать с внутренним полем с другим именем.
0
2055 / 1533 / 166
Регистрация: 14.12.2014
Сообщений: 13,345
12.10.2015, 23:31 19
Цитата Сообщение от hoggy Посмотреть сообщение
нет.
Ну тем не менее борландовский компилятор поддерживает оба формата. Да и мне тут на форуме с пеной у рта доказывали что второй вариант не мелкомягкий а часть стандарта, значит в стандарте он очень давно, настолько давно что успели забыть что появился этот формат у мелкомягких.
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
12.10.2015, 23:32 20
Цитата Сообщение от Lagilo Посмотреть сообщение
Вот что нужно было)
Что такое A?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2015, 23:32
Помогаю со студенческими работами здесь

получить все комбинации по парам x y, чтобы получились следующие массивы
Столкнулся с алгоритмической задачей, с первого взгляда казалось простой, но никак не могу решить...

Из каждого предложения удалить знаки препинания чтобы получились лексемы
Добрый вечер. Помогите дописать код.Из файла записываем в массив лексемы. Нужно чтобы было примерно...

Как перегрузить оператор = , чтобы ф-ция была дружественной
Как перегрузить оператор = , чтобы ф-ция была дружественной? friend String&amp; operator=(String&amp;);...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru