通过变量调用对象和方法(字符串)

时间:2015-03-21 13:59:13

标签: c++ c++11

首先,我一直在寻找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;

如果您与其他问题有任何良好的联系,那将会很有帮助。 也许它可以通过矢量以某种方式访问​​,但我不太了解它

2 个答案:

答案 0 :(得分:1)

C ++的设计考虑了强大的输入和编译时间检查和优化。对于您想要的访问类型,没有可用的设施。

1)动态查找对象:

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,因为地图会将字符串链接到对象值。

2)动态查找成员:

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 ++优势的东西,即面向对象,静态类型,价值语义。