函数指针是紧密耦合类的安全替代品吗?

问题描述 投票:0回答:1

假设 MyClass 需要来自 Util 类的信息。下面的函数指针使用示例安全吗?请注意,这是在 CPU 资源紧张的嵌入式系统上运行的。

如果我错了,请纠正我,但我相信这有很多优点:

  1. 可进行单元测试
  2. 消除类之间的耦合
  3. 运行时性能比单独运行 Util::TheTruth() 并将结果作为参数传递给 myObject 更好。

但是,文献并没有给我提供太多这方面的指导。


class Util {
public:

  static bool TheTruth() {
    return a || (!b && c);
  }

  bool a = false;
  bool b = false;
  bool c = false;
  
};

class MyClass {
public:

  MyClass() {
    IsItTrue = &MyClass::ReturnFalse;
  }
  MyClass(bool (*_IsItTrue)(void)) {
    IsItTrue = _IsItTrue;
  }
  void Handler() {
    if (serviceRequest) {
      truth = IsItTrue();
    }
  }

private:

  bool (*IsItTrue)(void);
  static bool ReturnFalse() { return false; }

  bool truth;
};

int main() {

  Util utility;
  MyClass myObject(&Util::TheTruth);
  
  while (true) {
    if (condition) {
      myObject.Handler();
    }
    
    // Some other code
  }
}

我尝试过类似的方法并得到了预期的行为; IsItTrue() 获得与 TheTruth() 相同的结果,但周期更少。

使用这种方法有什么风险?

c++ c++14
1个回答
0
投票

(我会评论,但我不能)

对我来说,静态方法 TheTruth 调用非静态类成员有一个错误 - a b c。如果这是可能的,但我错了,所以老实说我不知道......

如果 a b c 是静态的 - 则无需使用指针,因为您可以从我相信的任何地方调用 Util 类。一切都应该是安全的。

如果方法 TheTruth 不是静态的 - 您应该将变量 **utility** 的方法传递给 myObject,这应该是安全的,因为您不分配新的内存。只有一个指向 TheTruth 方法分配的现有内存的指针。当程序停止工作或者没有该类 Util 的任何活动实例时,所占用的内存将被释放。一切都安全了。

© www.soinside.com 2019 - 2024. All rights reserved.