【发布时间】:2023-01-18 05:15:03
【问题描述】:
我有一组参数定义为一组操作的结构(均值、最小值等)
struct Arguments {
double *data;
int num_data;
Arguments(double *data, int num_data) : data(data), num_data(num_data) {}
};
struct MeanOperationArguments: Arguments {
MeanOperationArguments(double *data, int num_data) : Arguments(data, num_data) {}
};
struct MinmaxOperationArguments: Arguments {
bool is_min_op;
MinmaxOperationArguments(double *data, int num_data, bool is_min_op) : is_min_op(is_min_op), Arguments(data, num_data) {}
};
我需要定义一个手术类如下:
class Operation {
public:
virtual void execute() = 0;
}
class MeanOperation: public Operation {}
// an operation that can be told to display either the minimum or the maximum.
class MinmaxOperation: public Operation {}
另外,我有一个操作工厂,它根据操作类型返回特定的操作对象实例:
class OperationFactory {
public:
Operation *get(OP_TYPE t, Arguments *args) {
switch(t) {
case MEAN:
return new MeanOperation(args);
case MINMAX:
return args->is_min_op ? // ERROR: Because struct downcasts to `Arguments`
new MinOperation(args):
new MaxOperation(args);
}
}
};
我需要能够基于参数结构的类型运行我的操作,如下所示:
int main() {
double data[] = { 1, 2, 3, 4 };
int num_data = 4;
OperationFactory operations;
Arguments *mean_args = new MeanOperationArguments(data, num_data);
Operation *mean_op = operations.get(MEAN, mean_args);
mean_op->execute();
Arguments *min_args = new MinmaxOperationArguments(data, num_data, true);
Operation *min_op = operations.get(MINMAX, min_args);
min_op->execute();
return 0;
}
如何根据用例使用 require 参数初始化我的操作?
【问题讨论】:
-
我可以帮忙,但是你需要这种结构层次结构和类的复杂结构吗?这是任何人或任何事物强制执行的事情吗?
-
不是真的,这就是我想做的。但我对实施持开放态度。想要创建一个非常通用的结构来支持具有不同参数类型的更多操作
-
如果您使用的是 args->is_min_op,那么 Arguments 必须有一个成员
is_min_op而不是添加virtual Operation* Arguments::GetOp(OP_TYPE t); -
这里的数据流似乎不对,从参数中获取操作不是很直观..
-
恰恰相反,将操作与参数分开可能不是一个好主意。在这两行中
Arguments *mean_args = new MeanOperationArguments(data, num_data); Operation *mean_op = operations.get(MEAN, mean_args);你是说你想要平均操作两次.重复自己会适得其反。说一次就足够了。
标签: c++ oop inheritance struct