首先,我一直在寻找stackoverflow超过1小时,但我真的不知道,如何找到我正在寻找的具体问题(我想已经有了一些答案) )。 我试图通过变量调用一个对象(字符串) 我的代码示例:
//class itself
using namespace std
class locations {
public:
locations(int id, string name){ // constructor
this->id= id;
this->name=name;
}
int id= 0;
string name = "";
};
和新对象:
locations home(1,"home");
我现在想要的是:
string obj = "home";
obj.id = 3;
或
string meth = "id";
home.meth = 3;
如果您与其他问题有任何良好的联系,那将会很有帮助。 也许它可以通过矢量以某种方式访问,但我不太了解它
答案 0 :(得分:1)
C ++的设计考虑了强大的输入和编译时间检查和优化。对于您想要的访问类型,没有可用的设施。
C ++不支持您期望的语义:
string obj = "home"; // create an object of type string.
obj.id = 3; // access to member id of your object.
如果它是动态的,生成的代码将需要维护变量的范围(因为home对象可以在不同的范围内具有不同的含义。
但幸运的是,在map的帮助下,您可以轻松实现一个对象存储,即您注册对象及其名称:
map<string, locations> mystore; // store of all my location variables
mystore["home"] = locations(1,"home"); // copy a new object into the store
string obj = "home";
mystore[obj].id = 3; // access object via its name.
顺便说一句,如果locations::name
只是按名称提供访问权限,那么您不再需要locations
,因为地图会将字符串链接到对象值。
C ++根本不支持您的语义:
string meth = "id"; // name of a member
home.meth = 3; // invalid: because meth is not a member of home
C ++不支持您在java和其他半编译或解释语言中找到的反射。如果您需要这样的东西,您需要仔细设计您的课程,以便自己实现。这将是相当困难的,因为每个成员都可以拥有自己的类型,并且C ++需要在编译时知道类型。
一种方法是将地图的使用(用于存储动态成员)与boost::variant
的使用相结合(以存储可以具有不同类型值的地图对象)。
但这并不容易,而且最重要的是,你必须自己管理任何不同类别的继承逻辑。
答案 1 :(得分:1)
这不是C ++中的事情,C ++是面向对象的,静态类型的,值语义语言。所有这些都会影响设计,而您似乎想要的设计不适合静态类型的语言。这是否会导致您更改设计或更改语言取决于您。也就是说,如果你真的想要映射对象和方法运行时,可以模拟这样的东西:
#include <iostream>
#include <string>
#include <map>
using namespace std;
struct Object;
typedef int (*funcptr)(Object*,int);
struct Object
{
map<string,funcptr> funcs;
map<string,int> data;
int call(string name,int param) { return funcs[name](this,param); }
};
map<string,Object> allObjects;
Object& get(string name) { return allObjects[name]; }
//----------------------------------------------------------------------------------
int main()
{
get("obj1").funcs["run"] = [](Object* self,int param) -> int { self->data["somename"] = param; return 0; };
get("obj1").call("run",5);
cout << get("obj1").data["somename"] << endl;
}
那就是说,请不要这样做,将你的设计改为实际上非常适合C ++优势的东西,即面向对象,静态类型,价值语义。