Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';在c+;中修改库函数的最佳方法是什么+;?_C++ - Fatal编程技术网

C++ 什么';在c+;中修改库函数的最佳方法是什么+;?

C++ 什么';在c+;中修改库函数的最佳方法是什么+;?,c++,C++,如果要确保传递给setX()方法的每个参数都是正数,最好的方法是什么 例如: a.setX(32); // I don't need to worry about if 32 is less than 0 if(a.getY()-64 > 0) { b.setX(a.getY()-64); // But I have to check if a variable will be less than 0 } 我可以在setX()方法中添加if语句来进行一些更改吗?但是在第

如果要确保传递给
setX()
方法的每个参数都是正数,最好的方法是什么

例如:

 a.setX(32); // I don't need to worry about if 32 is less than 0
 if(a.getY()-64 > 0)
 {
     b.setX(a.getY()-64); // But I have to check if a variable will be less than 0
 }
我可以在
setX()
方法中添加if语句来进行一些更改吗?但是在第三方库中修改函数不是一个好主意,是吗?有没有一种方法可以在不接触图书馆的情况下实现这一点


当然,每次调用此函数时,我都可以手动确保参数为正值。但这听起来更糟。我可能会经常调用这个函数,我不能每次调用这个函数之前都做一些检查。那最好的办法是什么

为什么不创建自己的函数并确保只调用此函数而不调用原始函数:

inline void MySetX( TheClass& a, int value )
{
    if ( value >= 0 )
    {
         a.setX( value );
    }
    else
    {
         // Do your error handling, throw exception, assert, or whatever
    }
}

然后,将所有的
a.setX(i)
替换为
MySetX(a,i)

为什么不创建自己的函数,并确保只调用此函数,而不调用原始函数:

inline void MySetX( TheClass& a, int value )
{
    if ( value >= 0 )
    {
         a.setX( value );
    }
    else
    {
         // Do your error handling, throw exception, assert, or whatever
    }
}

然后,将所有的
a.setX(i)
替换为
MySetX(a,i)

为什么不创建自己的函数,并确保只调用此函数,而不调用原始函数:

inline void MySetX( TheClass& a, int value )
{
    if ( value >= 0 )
    {
         a.setX( value );
    }
    else
    {
         // Do your error handling, throw exception, assert, or whatever
    }
}

然后,将所有的
a.setX(i)
替换为
MySetX(a,i)

为什么不创建自己的函数,并确保只调用此函数,而不调用原始函数:

inline void MySetX( TheClass& a, int value )
{
    if ( value >= 0 )
    {
         a.setX( value );
    }
    else
    {
         // Do your error handling, throw exception, assert, or whatever
    }
}


然后,将所有
a.setX(i)
替换为
MySetX(a,i)

向函数添加断言。“在第三方库中修改函数不是一个好主意,是吗?”这取决于。添加这个断言不会(不应该)改变它的行为,所以如果其他人使用您的代码和他们自己的原始库副本,它仍然可以工作。但至少你可以调试你的逻辑。你可以构建一个包装器函数,并向它传递一个绝对值,比如
setx(abs(value))
@w.b,所以你建议应该无误地传递错误输入?给函数添加一个断言。“在第三方库中修改函数不是一个好主意,是吗?”这取决于。添加这个断言不会(不应该)改变它的行为,所以如果其他人使用您的代码和他们自己的原始库副本,它仍然可以工作。但至少你可以调试你的逻辑。你可以构建一个包装器函数,并向它传递一个绝对值,比如
setx(abs(value))
@w.b,所以你建议应该无误地传递错误输入?给函数添加一个断言。“在第三方库中修改函数不是一个好主意,是吗?”这取决于。添加这个断言不会(不应该)改变它的行为,所以如果其他人使用您的代码和他们自己的原始库副本,它仍然可以工作。但至少你可以调试你的逻辑。你可以构建一个包装器函数,并向它传递一个绝对值,比如
setx(abs(value))
@w.b,所以你建议应该无误地传递错误输入?给函数添加一个断言。“在第三方库中修改函数不是一个好主意,是吗?”这取决于。添加这个断言不会(不应该)改变它的行为,所以如果其他人使用您的代码和他们自己的原始库副本,它仍然可以工作。但至少你可以调试你的逻辑。你可以构建一个包装器函数,并向它传递一个绝对值,比如
setx(abs(value))
@w.b,所以你是说错误的输入应该毫无错误地传递?我同意。不要更改库,创建库的接口包装器。除了允许您验证输入之外,这还有助于将代码与库的新版本中的更改隔离开来。另请参见。(OP:)这听起来是一个不错的解决方案,但我必须重新编写所有已编写为“a.setX”的内容,实际上我不知道有什么好的重构工具可以将每个“a.setX(I)”更改为“MySetX(a,I)”。我可以创建扩展类的子类吗?这样我就可以使我的源代码与库保持一致?如果是这样,怎么做?是的,你可以,但是你必须改变创建类对象的每个地方。如果您使用的是Visual Studio,“在文件中替换”工具非常棒,可以通过
MySetX(,)
替换
.setX()
。好的,我编写了一个子类来扩展这个类,它工作得很好。所以我决定使用#define指令在创建对象时进行更改。我尝试替换a=TheClass::create();使用a=(类*)子类::create();它工作得很好,但是#定义class::create(class*)子类::create不起作用。为什么?不能在宏名称中使用::。您将问题从用
MySetX
替换所有
setX
转移到用
subclass
creation替换所有
class
创建…此外,如果
setX
未声明
virtual
,请注意在
class*
指针上调用
setX
(即使创建为
子类
对象),不会调用subclass::setX函数,它将执行
class::setX
…我同意。不要更改库,创建库的接口包装。除了允许您验证输入之外,这将有助于将代码与库的新版本中的更改隔离开来。另请参阅。(OP:)这听起来是一个很好的解决方案,但我必须重新编写所有已编写为“a.setX”的内容,实际上我不知道有什么好的重构工具可以将每个“a.setX(I)”都更改为“MySetX(a,I)”。我可以创建一个扩展类的子类吗?这样我就可以使我的源代码与库保持一致?如果可以,怎么做?是的,你可以,但是你必须更改创建类对象的每个位置。如果你使用Visual Studio,“在文件中替换”工具非常好,可以用来替换
.setX()
by
MySetX(,)
OK,我写了一个子类来扩展这个类,它工作得很好