0

我正在尝试创建一个指针访问类,其目标是简化对已知内存位置的访问。

至于现在我有这个类:

template<class T = DWORD> struct Pointer
{
private://minimum 2 params
    std::vector<T> params;
    Pointer()
    {}
    Pointer(T a)
    {params.push_back(a);}
public:
    Pointer(T a, T b)
    {params.push_back(a);Pointer::Pointer(b);}
    Pointer(T a, T b, T c)
    {params.push_back(a);Pointer::Pointer(b,c);}
    Pointer(T a, T b, T c, T d)
    {params.push_back(a);Pointer::Pointer(b,c,d);}
    Pointer(T a, T b, T c, T d, T e)
    {params.push_back(a);Pointer::Pointer(b,c,d,e);}
    Pointer(T a, T b, T c, T d, T e, T f)
    {params.push_back(a);Pointer::Pointer(b,c,d,e,f);}
    Pointer(T a, T b, T c, T d, T e, T f, T g)
    {params.push_back(a);Pointer::Pointer(b,c,d,e,f,g);}
    //all the way to ... z
    T* ResolvePointer(/*,bool fallback = false*/) 
    {  
        T variable = params[0];
        try
        {
            auto it = params.begin();
            ++it;  

                for(; it != params.end(); ++it)
                    variable = *reinterpret_cast<T*>(variable) + *it;
        }
        catch(...)
        {   
            /*if(fallback){
                static char fallback_location[2048];
                variable = reinterpret_cast<T>(&fallback_location[0]);
            }else{*/
            variable = NULL;
            //} 
        }
        return reinterpret_cast<T*>(variable);
    }
    T* operator()()
    {
        return ResolvePointer();
    }
};

但每当我叫它

(例如:

Player[slot].Money = Pointer<int>(0x00400000+0x008E98EC,0xD8+(0x4*slot),0xE4,0x00,0x4)();),

params向量总是只有a:( _

我究竟做错了什么?我该如何解决这个问题?

PS:我想使用可变参数模板,但我正在使用MICROSOFT VISUAL C++ 11

4

2 回答 2

1

构造函数中的Pointer::Pointer(...)行不是构造函数委托,而是临时对象的声明。你基本上是在告诉编译器扔掉除了参数之外的所有东西a。您想要的语法 - VC11 不支持 - 是:

Pointer(T a, T b, T c) : Pointer(a, b) {
  params.push_back(c);
}

老实说,这门课似乎一开始就构思不佳。我认为如果您询问您要通过该课程实现的目标而不是如何实现它,我们可以为您提供更多帮助。

于 2013-06-02T05:45:07.460 回答
1

从另一个构造函数调用构造函数实际上重建了整个对象,所以它不是“理智的”。

从 C++11 开始,可以在同一对象的构造函数之间进行委托,但必须在初始化列表级别

Pointer(T a, T b, T c) : Pointer(a, b) 
{
  params.push_back(c);
}

但是要定义一组函数,可变参数模板可能会有所帮助:

template<class T>
class Pointer
{
    std::vector<T> params;

    template<class A, class... AA>
    void push(const A& a, const AA&... aa)
    { push(aa...); params.push_back(a); } //< invert these calls depending on the order you wish

    void push() //the final recourse
    {}

public:
    template<class... AA>
    Pointer(const AA&... aa)
    { push(aa...); }

};
于 2013-06-02T06:31:14.783 回答