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()
byMySetX(,)
OK,我写了一个子类来扩展这个类,它工作得很好