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

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

Войти
Регистрация
Восстановить пароль
 
 
dailydose
overmind
358 / 105 / 28
Регистрация: 21.07.2016
Сообщений: 515
#1

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

19.08.2016, 07:57. Просмотров 383. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2016, 07:57     Перегрузка внутри класса
Посмотрите здесь:

Перегрузка внутри класса - C++
Как описывается перегрузка внутри класса и вне его?

Перегрузка функций класса - C++
в классе есть функция которая принимает int bool Fwrite( int&amp; ); если её вызвать так Fwrite(78); то будет ошибка, он будет...

Перегрузка методов класса - C++
Проблема заключается в следующем я не получается правильно сделать задание. Задание:&quot;Для класса реализовать набор операций для работы с...

Перегрузка оператора для класса - C++
Здравствуйте! Подскажите, пожалуйста, почему так не работает: class ClassA { public: ClassA() { m = 1; ...

Перегрузка операторов в шаблоне класса - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;typeinfo&gt; #include &lt;windows.h&gt; using namespace std; template &lt;class Type1,...

Перегрузка операторов для класса - C++
class A { private: size_t i; public: size_t i_get() { return i; } };

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

Перегрузка функций, шаблон класса - C++
Есть самонаписанный шаблон класса &quot;Saraksts&quot;, аналог вектора. Должен подходить под любые простые типы данных. Также есть класс &quot;Student&quot;,...

Перегрузка оператора = в шаблоне класса - C++
Доброго дня! Возник такой вот вопрос: я сделал шаблон класса и пытаюсь перегрузить его оператор присваивания, в итоге получается...

Перегрузка operator* у класса Complex - C++
Complex* Complex::operator*(const Complex&amp; other) const { Complex* product = this; *product *= other; return product; }...

Перегрузка операторов класса время - C++
Не могу сообразить как перегрузить операторы +,-,+=,-= и = для класса время. Нужно это как-то реализовать с учетом, что 60 секунд = минута...


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

Или воспользуйтесь поиском по форуму:
dailydose
overmind
358 / 105 / 28
Регистрация: 21.07.2016
Сообщений: 515
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     Перегрузка внутри класса
Ответ Создать тему
Опции темы

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