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

Перегрузка внутри класса - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как разделить участки кода в одном исходнике для разных битовых систем http://www.cyberforum.ru/cpp-beginners/thread1795956.html
В проекте нужно разделить участки программы примерно таким образом, как показано псевдокодом if (сборка выполняется для х64) компилируется эта часть программы; else if (сборка выполняется для х86) компилируется эта часть; возможно ли такое сделать?
C++ Шаблон функции для подсчета значений в массиве Всем доброго времени суток. Очень прошу помочь написать программу. Нужно создать шаблон функции count() для подсчета числа появлений некоторого значения в массиве. В основной программе передайте в функцию массив значений типа double, int и сhar. Большое спасибо за помощь. http://www.cyberforum.ru/cpp-beginners/thread1795927.html
C++ Форматирование вывода и округление double
Доброго времени суток. Я много подобных тем полистал. Но не нашел ответа. Мне нужно написать функцию, которая бы получала double число, округляла его до сотых(потом идет вывод данного числа, те можно и в строковом представлении) и возвращало бы его в виде строки. Посмотрев примеры я нашел что-то типа этого: std::string RoundAndTransformToString(double number) { std::stringstream stream;...
C++ Передача по ссылке и по значению
Эта тема стара как мир, но я хотел уточнить одну вещь. QBluetoothAddress* address = new QBluetoothAddress("00:1A:7D:DA:71:15"); void try_connect_to_local_address(QBluetoothAddress &address); Как сделать так, чтобы в функции try_connect_to_local_address в качестве аргумента была передена address, а не ее копия или новый объект?
C++ Отловить русские буквы с помощью библиотечной функции http://www.cyberforum.ru/cpp-beginners/thread1795908.html
Через _gettch() отлавливаю код вводимой буквы.Ввод произвожу на русской раскладке.При нажатии буквы "п" отлавливает код "63" и пишет что соответствует этому коду знак "?". Пробовал делать следующее: SetConsoleCP(1251); SetConsoleOutputCP(1251); так же пробовал делать через setlocale ставить LC_ALL Russian.Результата нету.Что делать, помогите, плевое дело такое не дает зделать проверку на...
C++ Наследование классов в раздельных файлах Здравствуйте! Вопрос: Реализовал .h и .cpp файлы для класса односвязного списка. Затем создал унаследованный от этого класса класс для двусвязного списка. Оба класса реализованы в отдельных файлах и при компиляции возникает ошибка. Кидаю код всех файлов. list.h: #ifndef LIST_H #define LIST_H class List подробнее

Показать сообщение отдельно
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
19.08.2016, 07:57     Перегрузка внутри класса
Есть класс Points, который использует обычные стандартные функции. Здесь для примера написал две функции(работают со значениями переменных по ссылке) increaseValue, increaseValue, чтобы проще было отобразить суть, на самом деле эти я пользуюсь другими функциями.
C++
1
2
3
4
5
6
7
8
9
10
template<typename T>
void increaseValue(T& value)
{
    value++;
}
template<typename T>
void decreaseValue(T& value)
{
    value--;
}
Для удобства работы с полями этого класса сделал перегрузку присваивания, чтобы не было такого:
C++
1
2
3
4
if (this->type == "Float")
    this->value.f = newValue;
else
    this->value.i = newValue;
Вместо этого можно использовать упрощенную запись:
C++
1
*this = newValue
и в завимости от того какого типа переменная newValue запишется значение в this->value.i или же в this->value.f
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Points
{
public:
    std::string type;
    union
    {
        int i;
        float f;
    } value;
 
    void readFloatValuesFromFile();
    void readIntegerValuesFromFile();
    void doSomething();
 
private:
    template<typename T>
    Points& operator=(T newValue);
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Points::readFloatValuesFromFile()
{
    this->type = "Float";
    *this = 250.5;
}
void Points::readIntegerValuesFromFile()
{
    this->type = "Integer";
    *this = 100;
}
 
template<typename T>
Points& Points::operator=(T newValue)
{
    if (this->type == "Float")
        this->value.f = newValue;
    else
        this->value.i = newValue;
 
    return *this;
}
Теперь собственно вопрос можно ли сделать такую же перегрузку для этого кода?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Points::doSomething()
{
    if(this->type == "Float")
        increaseValue(this->value.f);
    else
        increaseValue(this->value.i);
 
    Sleep(500);
 
    if (this->type == "Float")
        decreaseValue(this->value.f);
    else
        decreaseValue(this->value.i);
}
вот в это
C++
1
2
3
4
5
6
7
8
void Points::doSomething()
{
    increaseValue(this);
 
    Sleep(500);
 
    decreaseValue(this);
}
Вряд ли в C++ есть подобная перегрузка. В голову пришла идея использовать геттер:
C++
1
2
3
4
5
6
7
8
void Points::doSomething()
{
    increaseValue(getValue());
 
    Sleep(500);
 
    decreaseValue(getValue());
}
Но тогда вопрос в том как определить этот метод?
C++
1
2
3
4
5
6
/* ??type?? */ Points::getValue()
{
    if (this->type == "Float")
        return this->value.f;
    return this->value.i;
}
Какой должен быть тип возвращаемого значения? Eсли этот метод возвращает float или int в зависимости от значения std::string type
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 13:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru