基类具有带有此签名的成员函数

virtual void method(A &a, B &b, C &c, D& d);

用户定义了一个重写此方法的派生类。

我们发现方法代码具有误导性,因为它的设计不正确:
  • a只是输入,不应修改
  • b只是输出,必须设置为
  • c仅是输出,可以设置还是不设置
  • d是同时输入和输出的,因此应将其读取并可以将其设置为方法内部的值。

  • 代码的其余部分将使用为b赋予的值,如果设置了c和d的值,则将受益。

    显然,这是一个糟糕的设计,例如应将a声明为 const

    问题:
  • 那么对象b,c和d呢?是一种考虑到不同行为的更好的方法来声明此方法吗?
  • 在不影响当前使用此方法的代码的情况下,我们应如何弃用此方法并替换它?
  • 最佳答案

    C++不像其他一些语言(例如C#,refout[Obsolete]标记)那样为此提供任何方便的工具。

    不过,我已经看到有人这样做:

    #define in
    #define out
    #define optional
    
    // DEPRECATED
    virtual void method(const A& a, out B& b, optional out C& c, in out D& d);
    

    当然,这在行为上没有什么不同,并且对编译器没有任何意义,对人类读者来说只是美化了。

    除此之外,我认为制作第一个参数const是您可以做的最好的事情。从语义上讲,没有什么比将它们保留为非常量引用更好的了。

    至于标记不推荐使用,最好的办法是在其上留下评论,或者在使用该功能时在控制台或日志文件中打印“我不推荐使用,请勿使用我”警告消息。

    关于c++ - 成员函数的设计问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22637335/

    10-10 18:12
    查看更多