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

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

Восстановить пароль Регистрация
 
 
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
19.08.2016, 07:57     Перегрузка внутри класса #1
Есть класс 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
5956 / 5561 / 1788
Регистрация: 18.12.2011
Сообщений: 14,211
Завершенные тесты: 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
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
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
5956 / 5561 / 1788
Регистрация: 18.12.2011
Сообщений: 14,211
Завершенные тесты: 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
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
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
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
19.08.2016, 13:25     Перегрузка внутри класса #6
dailydose, Вам нужно type erasure.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
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
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
19.08.2016, 15:17     Перегрузка внутри класса #8
dailydose, Вы невнимательно читали статью. Тип объекта отдельно хранить не надо. Надо определить шаблонный конструктор и шаблонный оператор приведения типа.
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
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
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
19.08.2016, 15:23  [ТС]     Перегрузка внутри класса #10
DrOffset,
Скорее всего это именно то, что нужно. Сейчас буду разбираться
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
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
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
19.08.2016, 17:39     Перегрузка внутри класса #12
Цитата Сообщение от dailydose Посмотреть сообщение
Как всё-таки добраться до него?
В этом и суть.
При этом подходе надо писать так, чтобы снаружи до него не надо было добираться.
Работай с интерфейсами - не нужен void*, и касты не нужны.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
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
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
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
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
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
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
19.08.2016, 18:12     Перегрузка внутри класса #16
dailydose, еще раз повторю - работай с интерфейсами. определи задачу, разработай для задачи интерфейсы, потом реализуй их. и все получится.
Сначала определи задачу, четко. Потом пиши код. Не наоборот.

Добавлено через 3 минуты
Цитата Сообщение от dailydose Посмотреть сообщение
Мне же в конечном итоге нужно
Вот и определи себе, какие у тебя будут операции с этими объектами, и спроектируй для них интерфейсы. Засунешь их в базовый класс.
Можешь в псевдокоде, написать для себя порядок работы не привязываясь к конкретному типу переменной. То что получится, и будет основой абстрактного интерфейса.
Пока ты мыслишь категориями конкретного типа, ничего не выйдет
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
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
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
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
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
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++
Перегрузка operator* у класса Complex C++
C++ Заполнение вектора класса внутри самого класса

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

Или воспользуйтесь поиском по форуму:
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
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     Перегрузка внутри класса
Ответ Создать тему
Опции темы

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