问题描述
我想在类的公共指针中存储一些数据。
像这样
class var
{
public:
void *_;
template <class T>
var(T &t)
{
_ = &t;
}
};
一切正常。但是如果在这里打电话是有问题的
int main()
{
int i = 1;
var test = i;
i++;
cout << *(int *)test._;
}
我想成为1,但要成为2
所以我需要获取参数的副本,然后如果输入变量更改了,我的数据就不会更改。
像这样
class var
{
public:
void *_;
template <class T>
var(T t)
{
_ = &t;
}
};
所以它不起作用,因为 var(T t) 是局部变量。
所以最后一定是这样的。
class var
{
public:
void *_;
template <class T>
var(T t)
{
_ = new T;
memcpy(_,&t,sizeof(t));
}
};
这很好,但问题是:
( _ = new T; )这行代码使memecpy的内存空间需要更多的处理。例如 100倍。
问题是:
解决方法
您应该为您的值提供一个本地存储,并有一个指向它的公共指针,我将举一个带有联合的示例,但是您可以采用注释中建议的另一种方法:
union Value {
int i;
float f;
//and so on
};
class var
{
private:
Value mPrivateValue;
public:
void * mPublicPointer;
var(Value val)
{
mPrivateValue = val;
mPublicPointer = &mPrivateValue;
}
};
int main() {
Value val = { .i = 100 };
var v(val);
std::cout << v.mPublicPointer << "\n" << ((Value *)v.mPublicPointer)->i << "\n";
return 0;
}