让Xcode在虚拟函数中强制执行数据类型和常量

时间:2015-05-28 19:10:15

标签: c++ xcode

因此,我注意到Xcode(v6.2)似乎并没有像Visual Studio那样在纯虚函数中强制执行const。几个问题: 1)如果我在一个具有const参数的基类中有一个纯虚拟,并且当它在derrived类中定义时它是非const ...那么符合ANSI标准并且: 2)有没有办法让Xcode像Visual Studio一样抛出错误?

在第一个块中,我们有头文件,它有一个纯虚函数。

// Some header file (assume include guards and all that fun stuff)
namespace Testing123
{
    class ClassA
    {
    public:
        // ************ NOTICE THAT THE ARGUMENT IS CONST!!! ***************   
        virtual double  somePureVirtualFunk( const double someNumber ) = 0;       

    protected:
        inline double getSomeFunkyNumber(){ return m_something; };
    private:
        double m_something;
    }
}

现在在第二个文件中,我们有一个派生类的头,它有一个内联函数,用于定义ClassA中的纯虚拟...

// Some header file (assume include guards and all that fun stuff)
#include "ClassA.h"

namespace Testing123
{
    class ClassB : public ClassA
    {
    public:
        // ************ NOTICE THAT THE ARGUMENT IS **NOT** CONST!!! *************   
        inline virtual double  somePureVirtualFunk( double someNumber )
        { return this->getSomeFunkyNumber(); }; 
    }
}

所以我认为这证明了我所看到的,在ClassA中,somePureVirtualFunk被声明为具有const参数,当它在ClassB中定义时,constness缺失。 Visual Studio提醒您注意这一事实,Xcode没有。有没有办法让Xcode警告我这个?

1 个答案:

答案 0 :(得分:4)

1)符合标准。顶级const被忽略,因此

virtual double  somePureVirtualFunk( const int someNumber ) = 0; 

与此

完全相同
virtual double  somePureVirtualFunk( int someNumber ) = 0; 

将函数中的const设置为声明是没有意义的,因为它会被忽略。它可以用作函数的定义中使用的实现细节,它只是意味着不能在函数体中修改局部参数。

double ClassB::somePureVirtualFunk(const int someNumber )
{
  // someNumber cannot be modified here.
  // But it is local, so nobody needs to know.
}

请注意,这仅适用于顶级const,如您的示例所示。

2)鉴于功能签名是相同的,我不确定警告会有多大用处。一个好的警告是告诉你在函数声明中有一个顶级const限定符,并且它没有效果。