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

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

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

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

19.08.2016, 07:57. Просмотров 353. Ответов 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
6125 / 5728 / 1852
Регистрация: 18.12.2011
Сообщений: 14,638
Завершенные тесты: 1
19.08.2016, 08:21     Перегрузка внутри класса #2
А почему бы не сделать так
C++
1
2
3
4
5
6
7
template<typename T>
void Points::doSomething()
{
    increaseValue<T>(this);
     Sleep(500);
     decreaseValue<T>(this);
}
Но лучше increaseValue decreaseValue сделать членами класса и this не передавать.
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 10:54  [ТС]     Перегрузка внутри класса #3
Цитата Сообщение от zss Посмотреть сообщение
Но лучше increaseValue decreaseValue сделать членами класса и this не передавать.
Эти функции я привёл для примера. У меня же в коде на данный момент:
Цитата Сообщение от Случай#1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    if (health.type == "Float")
    {
        float temp;
        ReadProcessMemory(hProc, (LPVOID)ptr, &temp, entry.size, NULL);
        temp += health.value.f;
        WriteProcessMemory(hProc, (LPVOID)ptr, &temp, entry.size, NULL);
    }
    else
    {
        int temp;
        ReadProcessMemory(hProc, (LPVOID)ptr, &temp, entry.size, NULL);
        temp += health.value.i;
        WriteProcessMemory(hProc, (LPVOID)ptr, &temp, entry.size, NULL);
    }
Цитата Сообщение от Случай#2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Trainer::printMessage()
{
std::cout << "\t\t* *   "
          << cfg->hotkey.health.name
          << " - increase "
          << getAmmount(cfg->health)
          << " Health         * *" << std::endl;
// print other data like a armour, money, etc...
}
 
inline std::string Trainer::getAmmount(Config::ammount& ammount)
{
    return (ammount.type == "Float") ? std::to_string(ammount.value.f) : std::to_string(ammount.value.i);
}
Во втором случае же для вывода чтобы преобразовать в строку написал вспомогательную функцию getAmmount, возвращающую строку. Думаю здесь можно и перегрузить, например так:
Цитата Сообщение от toString
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
std::ostream & operator<<(std::ostream & _stream, Points const & p)
{
    if (this->type == "Float")
        return _stream << p.f;
    else
        return _stream << p.i;
}
zss,
Цитата Сообщение от zss Посмотреть сообщение
А почему бы не сделать так
C++
1
2
3
4
5
6
7
template<typename T>
void Points::doSomething()
{
    increaseValue<T>(this);
     Sleep(500);
     decreaseValue<T>(this);
}
Компилятор ругается на health.doSomething() и armour.doSomething()
main.cpp(45): error C2672: "Points::doSomething": не найдена соответствующая перегруженная функция
main.cpp(45): error C2783: void Points::doSomething(void): не удается составить аргумент шаблон для "T"
main.cpp(31): note: см. объявление "Points::doSomething"


Вобщем, получилось много текста, а вопрос в целом звучит так: Как объявить функцию без аргументов, возвращающую разные типы данных?
C++
1
2
3
4
5
6
7
type_to_return Myfunction()
{
    if (blablah) 
         return 100; // int
 
    return 250.5; // float
}
Миниатюры
Перегрузка внутри класса  
zss
Модератор
Эксперт С++
 Аватар для zss
6125 / 5728 / 1852
Регистрация: 18.12.2011
Сообщений: 14,638
Завершенные тесты: 1
19.08.2016, 12:02     Перегрузка внутри класса #4
dailydose,
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
template<typename T>
void increaseValue(T& value)
{
    value++;
}
template<typename T>
void decreaseValue(T& value)
{
    value--;
}
 
template<typename T>
class Points
{
    T t;
public:
    Points():t(0){}
    void doSomething();
};
template<typename T>
void Points<T>::doSomething()
{
    increaseValue<T>(t);
    Sleep(500);
    decreaseValue<T>(t);
}
int main()
{
    Points<int> pi;
    pi.doSomething();
    Points<float> pf;
    pf.doSomething();
    return 0;
}
Мне кажется, это то, что Вам хотелось.
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 13:22  [ТС]     Перегрузка внутри класса #5
zss,
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
Points<int> pi;
* * Points<float> pf;
К сожалению, нет. Типы заранее неизвестны, они берутся из файла, поэтому и использую union{int i; float f;}value; совместно с std::string type;

C++
1
2
3
4
5
6
7
8
9
10
class Points
{
    std::string type;
    union
    {
        int i;
        float f;
    } value;
//...
}
Добавлено через 1 минуту

Не по теме:

You are missing the point.

You must have a specific type in use when you compile your program. The type of a thing is not changeable when you run your program.

All a template does is provide a cookie-cutter method for the compiler to generate functions at compile time.



Добавлено через 1 минуту

Не по теме:

оттуда же и этот код

Цитата Сообщение от Duoas
Кликните здесь для просмотра всего текста
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
union NumberUnion {
  int z;
  float x;
  double r;
};
 
enum NumberType { INT, FLOAT, DOUBLE };
 
struct Number {
  NumberUnion val;
  NumberType type;
};
 
 
Number string_to_number(string str) {
  Number num;
  if( /*str is best as an int*/ ) {
    num.type = INT;
    num.val.z = ...
  } else if( /*str is best as a float*/ ) {
    num.type = FLOAT;
    num.val.x = ...
  } else if( /*str is best as double*/ ) {
    num.type = DOUBLE;
    num.val.r = ...
  }
  return num;
}
 
int main() {
  string s = ...
  Number n = string_to_number(s);
 
  switch( n.type) {
   case INT:
    cout << "int " << n.val.z;
    break;
   case FLOAT:
    cout << "float " << n.val.x;
    break;
   case DOUBLE:
    cout << "double " << n.val.r;
    break;
  }
 
  cout << endl;
  return 0;
}

avgoor
 Аватар для avgoor
789 / 431 / 94
Регистрация: 05.12.2015
Сообщений: 1,273
19.08.2016, 13:25     Перегрузка внутри класса #6
dailydose, Вам нужно type erasure.
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 14:51  [ТС]     Перегрузка внутри класса #7
Цитата Сообщение от avgoor Посмотреть сообщение
type erasure.
В моём случае как это будет выглядеть?

Моя попытка
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
#include <iostream>
#include <windows.h>
#include <string>
#include <fstream>
 
template<typename T>
struct point
{
    std::string type;
    T value;
};
 
class Trainer
{
public:
    void* health;
    void* armour;
 
    Trainer()
    {
        readFile();
    }
    ~Trainer()
    {
        delete health;
        delete armour;
    }
private:
    void readFile();
};
 
int main()
{
    Trainer trainer;
 
    // Error: Выражение должно иметь тип класса
    // trainer.health.value += 100;
    // std::cout << trainer.health.value << std::endl;
    
    // так работает, но опять же повторюсь - тип переменных заранее неизвестен
    point<int>* t =  (point<int>*)trainer.health; // клята магія
    t->value += 100;
    std::cout << t->value << 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")
    {
        health = new point<float>;
        (*(point<float>*)health).type = "Float"; // клята магія
 
        getline(ini, buff);
        (*(point<float>*)health).value = stof(buff); // клята магія
    }
    else
    {
        health = new point<int>;
        (*(point<int>*)health).type = "int"; // клята магія
 
        getline(ini, buff);
        (*(point<int>*)health).value = stoi(buff); // клята магія
    }
    // [/copy it for armour]
 
    /*
    ** paste it here:
    */
 
    ini.close();
}
Цитата Сообщение от config.ini
int
100
float
250.0
Такой вот простенький файл. Допустим первая строка тип health, вторая значение; третья строка тип armour, четвертая - значение
avgoor
 Аватар для avgoor
789 / 431 / 94
Регистрация: 05.12.2015
Сообщений: 1,273
19.08.2016, 15:17     Перегрузка внутри класса #8
dailydose, Вы невнимательно читали статью. Тип объекта отдельно хранить не надо. Надо определить шаблонный конструктор и шаблонный оператор приведения типа.
DrOffset
6819 / 4030 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
19.08.2016, 15:20     Перегрузка внутри класса #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
dailydose, можно что-то наподобие этого сделать:
Кликните здесь для просмотра всего текста
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
class MemoryGrabberBase
{
public:
    virtual void increaseMemory(HANDLE hProc, LPVOID ptr) = 0;
    virtual void decreaseMemory(HANDLE hProc, LPVOID ptr) = 0;
 
    virtual ~MemoryGrabberBase() {}
};
 
template <typename T>
class MemoryGrabber
    : public MemoryGrabberBase
{
public:
    explicit MemoryGrabber(T val)
        : m_value(val)
    {}
 
    void increaseMemory(HANDLE hProc, LPVOID ptr)
    {
        T temp;
        ReadProcessMemory(hProc, ptr, &temp, sizeof(T), NULL);
        temp += m_value;
        WriteProcessMemory(hProc, ptr, &temp, sizeof(T), NULL);
    }
    void decreaseMemory(HANDLE hProc, LPVOID ptr)
    {
        T temp;
        ReadProcessMemory(hProc, ptr, &temp, sizeof(T), NULL);
        temp -= m_value;
        WriteProcessMemory(hProc, ptr, &temp, sizeof(T), NULL);
    }
 
private:
    T m_value;
};
 
int main()
{
    //.......
 
    std::unique_ptr<MemoryGrabberBase> mgr;
 
    if(buff == "Float")
    {
        std::getline(ini, buff);
        mgr = std::make_unique<MemoryGrabber<float>>(std::stof(buff));
    }
    else if(buff == "Int")
    {
        std::getline(ini, buff);
        mgr = std::make_unique<MemoryGrabber<int>>(std::stoi(buff));
    }
 
    //.......
 
    mgr->increaseMemory(hProc, ptr);
    //.....
    mgr->decreaseMemory(hProc, ptr);
}

Естественно код неполный, его нужно адаптировать под твою задачу.
Но основная идея, думаю, ясна. Мы проверку строки делаем только один раз, при чтении конфига, а дальше работаем с полиморфным объектом единообразно.
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 15:23  [ТС]     Перегрузка внутри класса #10
DrOffset,
Скорее всего это именно то, что нужно. Сейчас буду разбираться
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 16:36  [ТС]     Перегрузка внутри класса #11
Цитата Сообщение от DrOffset Посмотреть сообщение
работаем с полиморфным объектом единообразно.
На самом деле же с памятью работает класс Game, который используется классом Trainer и оба эти класса пользуются данными, которые читает класс Config. http://pastebin.com/u/dailydose

Цитата Сообщение от DrOffset Посмотреть сообщение
Естественно код неполный, его нужно адаптировать под твою задачу.
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
#include <iostream>
#include <windows.h>
#include <string>
#include <fstream>
#include <memory>
 
class pointBase
{
public:
    void* value;
    virtual ~pointBase() {}
    /*virtual void* getValue();*/
};
 
template<typename T>
class point : public pointBase
{
public:
    T value;
    point(T value)
    {
        this->value = value;
    }
    ~point() {}
    /*T getValue()
    {
        return value;
    }*/
};
 
class Trainer
{
public:
    std::unique_ptr<pointBase> health;
    std::unique_ptr<pointBase> armour;
 
    Trainer()
    {
        readFile();
    }
    ~Trainer(){}
private:
    void readFile();
};
 
int main()
{
    Trainer trainer;
 
    /*std::cout << trainer.health->getValue() << std::endl;*/
    std::cout << trainer.armour->value << 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();
}
std::cout << trainer.armour->value << std::endl;

Значение не выводится, но при отладке отображается. Как всё-таки добраться до него?
http://www.cyberforum.ru/attachment....1&d=1471613449

config.ini всё тотже
Цитата Сообщение от config.ini
int
100
float
250.0
Миниатюры
Перегрузка внутри класса  
DrOffset
6819 / 4030 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
19.08.2016, 17:39     Перегрузка внутри класса #12
Цитата Сообщение от dailydose Посмотреть сообщение
Как всё-таки добраться до него?
В этом и суть.
При этом подходе надо писать так, чтобы снаружи до него не надо было добираться.
Работай с интерфейсами - не нужен void*, и касты не нужны.
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 18:02  [ТС]     Перегрузка внутри класса #13
Цитата Сообщение от DrOffset Посмотреть сообщение
В этом и суть.
При этом подходе надо писать так, чтобы снаружи до него не надо было добираться.
а если тогда юзать геттер? как привёл в этом же коде, нужно только расскоментировать
C++
1
/*std::cout << trainer.health->getValue() << std::endl;*/
C++
1
2
3
4
    /*T getValue()
    {
        return value;
    }*/
но тогда компилятор ругается ...
getValue: не является членом "pointBase"
Миниатюры
Перегрузка внутри класса  
DrOffset
6819 / 4030 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
19.08.2016, 18:06     Перегрузка внутри класса #14
dailydose, зачем тебе геттер? Сформулируй задачу.

Хочешь выводить на экран значения, сделай так:
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
class pointBase
{
public:
    virtual ~pointBase() {}
 
    virtual std::ostream & output(std::ostream & out) const = 0;
};
 
template<typename T>
class point
    : public pointBase
{
public:
    point(T value) : value(value)
    { }
    ~point()
    { }
 
    std::ostream & output(std::ostream & out) const
    {
        return out << value;
    }
 
private:
    T value;
};
 
int main()
{
    pointBase * base = new point<int>(42);
 
    base->output(std::cout);
 
   //......
}
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 18:08  [ТС]     Перегрузка внутри класса #15
Цитата Сообщение от DrOffset Посмотреть сообщение
Работай с интерфейсами - не нужен void*, и касты не нужны.
Интерфейс в плане "абстрактный класс", не содержащий реализации?

Мне же в конечном итоге нужно нечто
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
union
{
    int i;
    float f;
}health, armour;
 
std::string buff = readTypeFromCfg(); // returns "int"
if(buff == "Float")
    health.f = readValueFromCfg();
else
    health.i = readValueFromCfg(); // returns 100
 
buff = readTypeFromCfg(); // returns "Float"
if(buff == "Float")
    armour.f = readValueFromCfg(); // returns 250.0
else
    armour.i = readValueFromCfg();
и чтобы дальше можно было делать так:
C++
1
2
health += 100;
armour += 150.0;
DrOffset
6819 / 4030 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
19.08.2016, 18:12     Перегрузка внутри класса #16
dailydose, еще раз повторю - работай с интерфейсами. определи задачу, разработай для задачи интерфейсы, потом реализуй их. и все получится.
Сначала определи задачу, четко. Потом пиши код. Не наоборот.

Добавлено через 3 минуты
Цитата Сообщение от dailydose Посмотреть сообщение
Мне же в конечном итоге нужно
Вот и определи себе, какие у тебя будут операции с этими объектами, и спроектируй для них интерфейсы. Засунешь их в базовый класс.
Можешь в псевдокоде, написать для себя порядок работы не привязываясь к конкретному типу переменной. То что получится, и будет основой абстрактного интерфейса.
Пока ты мыслишь категориями конкретного типа, ничего не выйдет
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 18:16  [ТС]     Перегрузка внутри класса #17
Цитата Сообщение от DrOffset Посмотреть сообщение
Хочешь выводить на экран значения
перегрузку для вывода уже нашёл в интернете #post9468603
C++
1
2
3
4
5
6
7
std::ostream & operator<<(std::ostream & _stream, Points const & p)
{
    if (this->type == "Float")
        return _stream << p.f;
    else
        return _stream << p.i;
}
Цитата Сообщение от DrOffset Посмотреть сообщение
Сформулируй задачу.
Хочу перегрузить/сделать аналог перегрузки для удобства
чтобы записи вида
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool Game::playerIsDead()
{
    ptr.health = getPointer(cfg->health.module, cfg->health.address, cfg->health.offsets, cfg->health.count);
 
    if (cfg->health.type == "Float")
    {
        ReadProcessMemory(hProc, (LPVOID)ptr.health, &health.f, cfg->health.size, NULL);
        return health.f < 0.1 || health.f > cfg->maxHealth.value.f;
    }
 
    ReadProcessMemory(hProc, (LPVOID)ptr.health, &health.i, cfg->health.size, NULL);
    return health.i < 1 || health.i > cfg->maxHealth.value.i;
}
сократить до
C++
1
2
3
4
5
6
bool Game::playerIsDead()
{
    ptr.health = getPointer(cfg->health.module, cfg->health.address, cfg->health.offsets, cfg->health.count);
    ReadProcessMemory(hProc, (LPVOID)ptr.health, &health, cfg->health.size, NULL);
    return health < 1 || health > cfg->maxHealth.value;
}
и
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Game::addData(types& value, Config::ammount& ammount, Config::entrys& entry, DWORD_PTR& ptr)
{
    ptr = getPointer(entry.module, entry.address, entry.offsets, entry.count);
    if (entry.type == "Float")
    {
        ReadProcessMemory(hProc, (LPVOID)ptr, &value.f, entry.size, NULL);
        value.f += ammount.value.f;
        WriteProcessMemory(hProc, (LPVOID)ptr, &value.f, entry.size, NULL);
    }
    else
    {
        ReadProcessMemory(hProc, (LPVOID)ptr, &value.i, entry.size, NULL);
        value.i += ammount.value.i;
        WriteProcessMemory(hProc, (LPVOID)ptr, &value.i, entry.size, NULL);
    }
}
соответственно в
C++
1
2
3
4
5
6
7
void Game::addData(types& value, Config::ammount& ammount, Config::entrys& entry, DWORD_PTR& ptr)
{
    ptr = getPointer(entry.module, entry.address, entry.offsets, entry.count);
    ReadProcessMemory(hProc, (LPVOID)ptr, &value, entry.size, NULL);
    value += ammount.value;
    WriteProcessMemory(hProc, (LPVOID)ptr, &value, entry.size, NULL);
}
DrOffset
6819 / 4030 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
19.08.2016, 18:23     Перегрузка внутри класса #18
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от dailydose Посмотреть сообщение
перегрузку для вывода уже нашёл в интернете
Она для данного способа не подходит.

Цитата Сообщение от dailydose Посмотреть сообщение
сократить до
В данном случае это должно выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
bool Game::playerIsDead()
{
    return health->readMemory(*this);
/* И вот это делаешь внутри readMemory(Game & gameobj):
    ptr.health = getPointer(cfg->health.module, cfg->health.address, cfg->health.offsets, cfg->health.count);
    ReadProcessMemory(hProc, (LPVOID)ptr.health, &health, cfg->health.size, NULL);
    return health < 1 || health > cfg->maxHealth.value;
*/
}
dailydose
overmind
 Аватар для dailydose
180 / 58 / 13
Регистрация: 21.07.2016
Сообщений: 312
19.08.2016, 18:36  [ТС]     Перегрузка внутри класса #19
Цитата Сообщение от DrOffset Посмотреть сообщение
Сначала определи задачу, четко. Потом пиши код. Не наоборот.
Точно подмечено. Я давным давно еще задумывался о написании трейнера, и вот только в июне руки так сказать дошли до написания. Проектированием не занимался. Со временем трейнер обростал новыми фичами, аля воспроизведение звука(sndPlaySound), вшитие этих звуков в ресурсы (.exe'шник) чтобы не таскать их рядом с самой программой, создание класса Config и чтение чит-таблиц(.CT) которые создаётся программой CheatEngine и прочие плюшки...

Цитата Сообщение от DrOffset Посмотреть сообщение
В данном случае это должно выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
bool Game::playerIsDead()
{
    return health->readMemory(*this);
/* И вот это делаешь внутри readMemory(Game & gameobj):
    ptr.health = getPointer(cfg->health.module, cfg->health.address, cfg->health.offsets, cfg->health.count);
    ReadProcessMemory(hProc, (LPVOID)ptr.health, &health, cfg->health.size, NULL);
    return health < 1 || health > cfg->maxHealth.value;
*/
}
А это, кстати, отличная идея.

отталкиваться я так понимаю от #post9469543, да ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2016, 18:45     Перегрузка внутри класса
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
DrOffset
6819 / 4030 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
19.08.2016, 18:45     Перегрузка внутри класса #20
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от dailydose Посмотреть сообщение
отталкиваться я так понимаю от #post9469543, да ?
Да.
Если есть какая-то логика, перенеся которую из Game, мы нарушим инкапсуляцию, то можно воспользоваться диспетчеризацией, и вернуть управление в функцию Game, но уже с конкретным типом. Например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Game
{
public:
    template <typename T>
    void doSomething(Point<T> & point)
    {
        // тут уже можно звать геттер у point
    }
//...........
    void doSomethingAbstract()
    {
        pBase->doSomething(*this); 
        // вызовется
        // virtual void doSomething(Game & gameobj) { gameobj.doSomething(*this); } 
        // далее в шаблонную функцию Game::doSomething<T>(Point<T> &)
    }
private:
    PointBase * pBase; 
};
Смотри, короче, по обстоятельствам.
Yandex
Объявления
19.08.2016, 18:45     Перегрузка внутри класса
Ответ Создать тему
Опции темы

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