【发布时间】:2017-06-17 05:44:04
【问题描述】:
我希望有一种方法可以为具有大量混合类型的可访问(但不可编辑)数据成员的类编写单个 get 函数。使用包含成员地址的 void*-cast 副本的映射将起作用,如以下代码所示,但只要将“const”投入混合以强制执行只读,不出所料 C++ 吠叫说'const void*' 类型不能被重铸以适当地访问数据成员。以下代码适用于为混合数据类型的类编写单个 get 函数,但它有效地将 get 函数访问的所有数据成员公开(具体参见 memlist 类中的 get 函数)。
底线:
有没有办法使指针类型可转换,同时在实际内存位置保持只读?或者更根本的是,可以定义一个指向常量变量的类型转换指针吗?例如,在我看来,const type *var 为只读变量定义了一个只读/不可转换的地址,而我试图找到一些更像@987654325 的东西(到目前为止对我还没有工作) @,虽然我还没有找到任何关于此的文档。
#include <iostream>
#include <string>
#include <map>
class A{
public:
A(int a, double b): a(a), b(b) {};
private:
int a;
double b;
friend std::ostream& operator<<(std::ostream& os, A& rhs);
};
class memlist{
public:
memlist(int param1, double param2)
{
myint = new int(param1);
mydouble = new double(param2);
myclass = new A(param1,param2);
getMap["myint"] = myint;
getMap["mydouble"] = mydouble;
getMap["myclass"] = myclass;
}
~memlist()
{
delete myint;
delete mydouble;
delete myclass;
}
void* get(std::string param) {return getMap[param];};
private:
int *myint;
double *mydouble;
A *myclass;
std::map<std::string,void*> getMap;
};
std::ostream& operator<<(std::ostream& os, A& rhs){
os << rhs.a << std::endl << rhs.b;
return os;
};
int main(){
int myint = 5;
double mydbl = 3.14159263;
memlist mymem(myint,mydbl);
std::cout << *(int*)mymem.get("myint") << std::endl;
std::cout << *(double*)mymem.get("mydouble") << std::endl;
std::cout << *(A*)mymem.get("myclass") << std::endl;
*(int*)mymem.get("myint") = 10;
std::cout << *(int*)mymem.get("myint") << std::endl;
return 0;
}
输出:
5
3.14159
5
3.14159
10
【问题讨论】:
-
我为不得不维护这段代码的程序员感到抱歉。 C++ 有
std::any这样的事情。 -
@PaulMcKenzie 谢天谢地,这只是我在玩指针......
标签: c++ pointers memory-management constants