【问题标题】:C++ fix unused parameter warning with polymorphismC++ 使用多态性修复未使用的参数警告
【发布时间】:2013-12-15 00:00:23
【问题描述】:

我的程序收到一些关于未使用变量的编译器警告,我想知道什么是解决此问题的合适方法。

我有一个由基类继承的函数,并且在为父类实现该函数时,我没有使用子类所需的所有参数;当然这会导致警告,由于我不是经验丰富的程序员,我不确定修复这些警告的最佳方法是什么。

所以一个最小的例子是:

在标题中:

    class car{
     public:
       virtual void init(int color, int size)
     private:
       int size;
    }
    class sportscar : public car{
     public:
       virtual void init(int color, int size)
     private:
       int color;
       int size;
    }

在源文件中:

    void car::init(int color, int size){
      this->size = size;
    }
    void sportscar::init(int color, int size){
      this->color = color;
      this->size = size;
    }

【问题讨论】:

  • 怎么样color = color...
  • @BitFiddlingCodeMonkey 不!如果长参数和成员具有完全相同的名称,那将不起作用!
  • 我们有一个这样的宏在工作:#define TOUCH(v) (v = v)...
  • @g-makulik 感谢您的提醒。
  • @BitFiddlingCodeMonkey 这真的不会发出任何代码吗? operator= 的副作用如何?不可分配的类型会发生什么?我经常看到的是(void)color;#define TOUCH(x) while(0) { (void)x; }。这不会发出任何代码,适用于每种类型,并在许多代码库中使用。

标签: c++ polymorphism unused-variables


【解决方案1】:

您需要做的就是不在实现中命名它们:

void car::init(int /* color */, int size){
    this->size = size;
}

【讨论】:

    【解决方案2】:

    函数参数的名称可以省略。

    void car::init(int, int size) {
      this->size = size;
    }
    

    这有时是不可取的,因为某些工具使用签名来提取文档,并且您可以内联定义函数。然后你就可以使用演员表了。

    struct car {
      void init(int color, int size) {
        (void)color; // prevent warning
        this->size = size;
      }
    };
    

    同时,请记住,C++ 类通常不需要 init 函数,因为这就是构造函数的用途。

    【讨论】:

      【解决方案3】:

      函数参数不需要命名:如果你不使用参数,就不要命名它:

      void car::init(int, int size) {
          this->size = size;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-07
        • 1970-01-01
        • 2014-04-24
        • 2016-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-02
        • 1970-01-01
        相关资源
        最近更新 更多