gpt4 book ai didi

c++ - 当运行时属性名称未知时,按属性对 C++ 对象进行通用聚合

转载 作者:行者123 更新时间:2023-11-30 04:38:56 24 4
gpt4 key购买 nike

我目前正在实现一个系统,该系统具有多个类的表示对象,例如客户端、业务、产品等。标准业务逻辑。正如人们可能期望的那样,每个类都有许多标准属性。

我有一长串基本相同的要求,例如:

  • 能够检索其行业为制造业的所有企业。
  • 能够检索位于伦敦的所有客户

类业务有属性sector,client有属性location。显然这是一个关系问题,在伪 SQL 中看起来像这样:

SELECT ALL business in business' WHERE sector == manufacturing

不幸的是,插入数据库不是一种选择。

我想要做的是拥有一个单一的通用聚合函数,其签名将采用以下形式:

vector<generic> genericAggregation(class, attribute, value);

其中 class 是我要聚合的对象的类,attribute 和 value 是感兴趣的类属性和值。在我的示例中,我将 vector 作为返回类型,但这行不通。声明一个相关类类型的 vector 并将其作为参数传递可能更好。但这不是主要问题。

我如何接受类、属性和值的字符串形式的参数,然后将它们映射到通用对象聚合函数中?

由于不发布代码是不礼貌的,下面是一个虚拟程序,它创建了一堆具有富有想象力的命名类的对象。包括一个特定的聚合函数,它返回 B 对象的 vector ,其 A 对象等于命令行中指定的 id,例如..

$ ./aggregations 5

它返回 A 对象的“i”属性等于 5 的所有 B。见下文:

#include <iostream>
#include <cstring>
#include <sstream>
#include <vector>

using namespace std;

//First imaginativly names dummy class
class A {
private:
int i;
double d;
string s;
public:
A(){}
A(int i, double d, string s) {
this->i = i;
this->d = d;
this->s = s;
}
~A(){}
int getInt() {return i;}
double getDouble() {return d;}
string getString() {return s;}
};

//second imaginativly named dummy class
class B {
private:
int i;
double d;
string s;
A *a;
public:
B(int i, double d, string s, A *a) {
this->i = i;
this->d = d;
this->s = s;
this->a = a;
}
~B(){}
int getInt() {return i;}
double getDouble() {return d;}
string getString() {return s;}
A* getA() {return a;}
};

//Containers for dummy class objects
vector<A> a_vec (10);
vector<B> b_vec;//100

//Util function, not important..
string int2string(int number) {
stringstream ss;
ss << number;
return ss.str();
}


//Example function that returns a new vector containing on B objects
//whose A object i attribute is equal to 'id'
vector<B> getBbyA(int id) {
vector<B> result;
for(int i = 0; i < b_vec.size(); i++) {
if(b_vec.at(i).getA()->getInt() == id) {
result.push_back(b_vec.at(i));
}
}
return result;
}



int main(int argc, char** argv) {

//Create some A's and B's, each B has an A...
//Each of the 10 A's are associated with 10 B's.
for(int i = 0; i < 10; ++i) {
A a(i, (double)i, int2string(i));
a_vec.at(i) = a;
for(int j = 0; j < 10; j++) {
B b((i * 10) + j, (double)j, int2string(i), &a_vec.at(i));
b_vec.push_back(b);
}
}

//Got some objects so lets do some aggregation

//Call example aggregation function to return all B objects
//whose A object has i attribute equal to argv[1]
vector<B> result = getBbyA(atoi(argv[1]));

//If some B's were found print them, else don't...
if(result.size() != 0) {
for(int i = 0; i < result.size(); i++) {
cout << result.at(i).getInt() << " " << result.at(i).getA()->getInt() << endl;
}
}
else {
cout << "No B's had A's with attribute i equal to " << argv[1] << endl;
}

return 0;
}

编译:

g++ -o aggregations aggregations.cpp

如果你愿意的话:)

我不想实现一个单独的聚合函数(即示例中的 getBbyA()),而是希望有一个通用的聚合函数,它可以解释所有可能的类属性对,从而满足所有聚合要求......并且在稍后添加事件附加属性,或附加聚合要求,这些将自动被考虑在内。

所以这里有一些问题,但我想深入了解的主要问题是如何将运行时参数映射到类属性。

我希望我已经提供了足够的细节来充分描述我正在尝试做的事情......

最佳答案

您必须将数据存储在散列图或法线图中,而不是原始 C++ 数据。如果不对 C++ 中的每个可能值执行 switch/case/default,就不可能从字符串“hai”转到 A.hai。

至于之前的回答,这是反射,不是RTTI。 C++ 确实有 RTTI——这就是 typeid() 的用途。但是,C++ 肯定不支持它,不管你想怎么调用它。

关于c++ - 当运行时属性名称未知时,按属性对 C++ 对象进行通用聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2797967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com