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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
#1

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

19.08.2016, 07:57. Просмотров 352. Ответов 20
Метки нет (Все метки)

Есть класс 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2016, 19:15     Перегрузка внутри класса
Еще ссылки по теме:

C++ Методы класса внутри определения класса
C++ Видимость экземпляра класса внутри класса
Перегрузка функций класса C++
Перегрузка operator* у класса Complex C++
C++ Заполнение вектора класса внутри самого класса

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

Или воспользуйтесь поиском по форуму:
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 19:15  [ТС]     Перегрузка внутри класса #21
DrOffset,
Похоже получилось, но это лишь на этом псевдокода, позже перенесу на основной код там и видно будет.

На основе предложенного тобой способа(#post9468603) подкорректировал свой код, как ты сказал
Цитата Сообщение от DrOffset Посмотреть сообщение
При этом подходе надо писать так, чтобы снаружи до него не надо было добираться.
C++
1
2
3
4
5
6
int main()
{
    Trainer trainer;
    std::cout << (int)trainer.checkPlayerIsDead() << std::endl;
    return 0;
}
C++
1
2
3
4
    bool Trainer::checkPlayerIsDead()
    {
        return health->check();
    }
C++
1
2
3
4
    bool point::check()
    {
        return value <= 0 || value > 1000;
    }
C++
1
virtual bool pointBase::check() = 0;
Здесь всё прекрасно работает
Взять всё тотже config.ini
int
100
float
250.0


то
C++
1
std::cout << (int)trainer.checkPlayerIsDead() << std::endl; //0
выводит 0, т.е. return 100<= 0 || 100 > 1000; // false

стоит только заменить в этом файле значение 100 на другое, допустим меньше либо равное нулю или наоборот больше чем 1000, то выводит 1, т.е. игрок мёртв

Добавлено через 1 минуту
полный код:
Цитата Сообщение от main.cpp
Кликните здесь для просмотра всего текста
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <windows.h>
#include <string>
#include <fstream>
#include <memory>
 
class pointBase
{
public:
    void* value;
    virtual ~pointBase() {}
    virtual bool check() = 0;
};
 
template<typename T>
class point : public pointBase
{
public:
    T value;
    point(T value)
    {
        this->value = value;
    }
    ~point() {}
 
    bool check()
    {
        return value <= 0 || value > 1000;
    }
};
 
class Trainer
{
public:
    std::unique_ptr<pointBase> health;
    std::unique_ptr<pointBase> armour;
 
    Trainer()
    {
        readFile();
    }
    ~Trainer() {}
 
    bool checkPlayerIsDead()
    {
        return health->check();
    }
private:
    void readFile();
};
 
int main()
{
    Trainer trainer;
 
    std::cout << (int)trainer.checkPlayerIsDead() << std::endl;
 
 
    return 0;
 
}
 
void Trainer::readFile()
{
    std::string buff;
    std::ifstream ini("config.ini");
 
    // [copy it for armour]
    getline(ini, buff);
    if (buff == "Float")
    {
        getline(ini, buff);
        health = std::make_unique<point<float>>(std::stof(buff));
    }
    else
    {
        getline(ini, buff);
        health = std::make_unique<point<int>>(std::stoi(buff));
    }
    // [/copy it for armour]
 
    /*
    ** paste it here:
    */
    getline(ini, buff);
    if (buff == "Float")
    {
        getline(ini, buff);
        armour = std::make_unique<point<float>>(std::stof(buff));
    }
    else
    {
        getline(ini, buff);
        armour = std::make_unique<point<int>>(std::stoi(buff));
    }
 
    ini.close();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Yandex
Объявления
19.08.2016, 19:15     Перегрузка внутри класса
Ответ Создать тему
Опции темы

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