Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
#1

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

19.08.2016, 07:57. Просмотров 497. Ответов 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2016, 07:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перегрузка внутри класса (C++):

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

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием...

Создать объект внутри класса, который может вызывать функцию этого класса
Ребята помогите уже несколько дней мучаюсь. Хочу сделать программу в консоле...

Наследование: Как мне определить любой из методов заданного класса внутри другого класса?
Добрый день, подскажите пожалуйста, что я делаю не так Есть файл Container.h...

BST дерево. Инициализация класса внутри класса
Здравствуйте, нужно реализовать класс дерева бинарного поиска с использованием...

Заполнение вектора класса внутри самого класса
class A { private: int a; public: A() { a = 0; }; A get(vector...

20
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 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 не передавать.
1
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
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
}
0
Миниатюры
Перегрузка внутри класса  
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 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;
}
Мне кажется, это то, что Вам хотелось.
1
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
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;
}

0
avgoor
1008 / 602 / 157
Регистрация: 05.12.2015
Сообщений: 1,686
19.08.2016, 13:25 #6
dailydose, Вам нужно type erasure.
1
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
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, четвертая - значение
0
avgoor
1008 / 602 / 157
Регистрация: 05.12.2015
Сообщений: 1,686
19.08.2016, 15:17 #8
dailydose, Вы невнимательно читали статью. Тип объекта отдельно хранить не надо. Надо определить шаблонный конструктор и шаблонный оператор приведения типа.
1
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
19.08.2016, 15:20 #9
Лучший ответ Сообщение было отмечено dailydose как решение

Решение

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);
}

Естественно код неполный, его нужно адаптировать под твою задачу.
Но основная идея, думаю, ясна. Мы проверку строки делаем только один раз, при чтении конфига, а дальше работаем с полиморфным объектом единообразно.
1
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
19.08.2016, 15:23  [ТС] #10
DrOffset,
Скорее всего это именно то, что нужно. Сейчас буду разбираться
0
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
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
0
Миниатюры
Перегрузка внутри класса  
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
19.08.2016, 17:39 #12
Цитата Сообщение от dailydose Посмотреть сообщение
Как всё-таки добраться до него?
В этом и суть.
При этом подходе надо писать так, чтобы снаружи до него не надо было добираться.
Работай с интерфейсами - не нужен void*, и касты не нужны.
1
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
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"
0
Миниатюры
Перегрузка внутри класса  
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
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);
 
   //......
}
1
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
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;
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
19.08.2016, 18:12 #16
dailydose, еще раз повторю - работай с интерфейсами. определи задачу, разработай для задачи интерфейсы, потом реализуй их. и все получится.
Сначала определи задачу, четко. Потом пиши код. Не наоборот.

Добавлено через 3 минуты
Цитата Сообщение от dailydose Посмотреть сообщение
Мне же в конечном итоге нужно
Вот и определи себе, какие у тебя будут операции с этими объектами, и спроектируй для них интерфейсы. Засунешь их в базовый класс.
Можешь в псевдокоде, написать для себя порядок работы не привязываясь к конкретному типу переменной. То что получится, и будет основой абстрактного интерфейса.
Пока ты мыслишь категориями конкретного типа, ничего не выйдет
1
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
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);
}
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
19.08.2016, 18:23 #18
Лучший ответ Сообщение было отмечено dailydose как решение

Решение

Цитата Сообщение от 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;
*/
}
1
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
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, да ?
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
19.08.2016, 18:45 #20
Лучший ответ Сообщение было отмечено dailydose как решение

Решение

Цитата Сообщение от 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; 
};
Смотри, короче, по обстоятельствам.
1
19.08.2016, 18:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2016, 18:45
Привет! Вот еще темы с решениями:

delete внутри класса для самого класса
Доброго времени суток, пишу программу для работы с матрицами. По условию дали...

Методы класса внутри определения класса
Все привет! Решил закрепить свои знания по C++, читаю Р.Лафоре -...

Видимость экземпляра класса внутри класса
Здравствуйте! Пытаюсь вывести openCV видео в QT виджете. На данный момент в...

Объявление дружественного класса внутри класса
class A{ friend class B{ B(A &amp;a); } } ...


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

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

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