【问题标题】:How to model an OO style interface for C functions?如何为 C 函数建模 OO 风格的接口?
【发布时间】:2009-05-18 10:42:43
【问题描述】:

我有一个由 Real-time Workshop 基于 Simulink 模型创建的 C 模块。 该模块提供三个公共功能:

int init();
int calc(double *inputarray, double *outputarray);
int term();

基于 outputarray 的内容,我可以为一个名为 OutputThing 的类建模。

我想将这些函数集成到一个名为 WrapperModule 的包装器类中。 现在我有一个看起来像这样的类:

class WrapperModule {
public:
    int initialize();
    OutputThing calc(...);
    int terminate();
};

我的问题是,如何正确设计 calc() 函数的包装方法。我想避免 创建一个以数组/向量作为其单个参数的方法。但是确定正确的论点 从向量中提取是棘手的,我不喜欢使用具有 6 个或更多参数的方法的想法。

Bertrand Meyer 在他的 OOSC 书中建议使用 setter 方法。比如:

class WrapperModule {
public:
    int initialize();
    void set_foo(double f);
    void set_bar(double b);
    OutputThing calc();
    int terminate();
};

有什么想法吗?我不确定哪种方法会更好。

【问题讨论】:

  • 在我的回答中,我假设 init() 是一次性初始化函数, term() 是一次性终止函数,并且 calc() 可以在初始化()和术语()。这是正确的吗?

标签: c++ oop


【解决方案1】:

如果您还能够将 inputarray 抽象为 InputThing 类,我建议您执行以下操作。这也更好地封装了使用 C++ 构造/销毁的初始化/终止。

class WrapperModule {
public:
    // Calls init()
    WrapperModule();

    // Calls term()
    ~WrapperModule();

    // Calls calc()
    OutputThing calculate(const InputThing& inputThing);
};

如有必要,InputThing 可以具有访问器和修改器 (get/set) 函数,以防止它需要构造函数接受许多参数。

【讨论】:

  • InputThing 和 OutputThing 可以是 std::vector ,它可以与 C 样式函数一起使用,因为它保证项目位于连续的内存位置。
  • 另外,我认为与计算函数紧密耦合的 InputThing 和 OutputThing 最好都定义为 WrapperModule 类的内部类。
  • @Naveen Jens 在他的问题中建议,输出数组有一些结构,他想用 OutputThing 建模,因此双精度向量可能不会削减它。不过,这样做可能对 InputThing 有意义。
  • 是的,init() 和 term() 是一次性的。 InputThing 可用于对多个属性/参数进行分组。除了一些元信息之外,我还可以从输出向量中提取一个真实类型。输入向量包含一些可用于建模类的可能类型。
猜你喜欢
  • 2010-10-06
  • 1970-01-01
  • 2012-07-15
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 2022-11-11
相关资源
最近更新 更多