我目前正在练习测试驱动开发的编程风格,并试图记住我学到的一些有用的习语和异常安全规则。我已经使用了第一学期的旧编程任务来简单地解决问题,使用不应该用来感受它们的东西,了解它们各自的优点和缺点。你知道,练习。
我一直使用Boost_Unit_Test框架进行编码,到目前为止它一直很好(只有我尝试过的测试框架)。除此测试外:
BOOST_AUTO_TEST_CASE(CopyConstructor)
{
Field *field = Field::EmptyField();
PushValsToField(&field, 5);
Field *field2 = new Field(*field);
BOOST_REQUIRE_EQUAL(field->Size(), field2->Size());
BOOST_REQUIRE_EQUAL((*field)[0], (*field2)[0]);
BOOST_REQUIRE_EQUAL((*field)[1], (*field2)[1]);
BOOST_REQUIRE_EQUAL((*field)[2], (*field2)[2]);
BOOST_REQUIRE_EQUAL((*field)[3], (*field2)[3]);
BOOST_REQUIRE_EQUAL((*field)[4], (*field2)[4]);
// Error with BOOST_EQUAL_REQUIRE_COLLECTIONS
BOOST_REQUIRE_EQUAL_COLLECTIONS(&(*field)[0], &(*field)[5],
&(*field2)[0], &(*field)[5]);
delete field;
delete field2;
}
我不知道为什么,但是最后的比较([5])集合测试失败了。但是,其他测试通过。为什么最后一次测试失败了?
此外,任何风格指南或指针都会受到高度赞赏,但不在问题的范围内。
错误:
fatal error in "CopyConstructor":
critical check { &(*field)[0], &(*field)[5] } == { &(*field2)[0], &(*field)[5] } failed.
Collections size mismatch: 5 != 1073731817
实用信息和代码段
void PushValsToField(Field **field, int numPushes)
{
for (int i(1); i <= numPushes; ++i)
(*field)->Push_Back(i*10);
}
构造
Field *Field::EmptyField()
{
return new Field();
}
Field::Field()
: v_(new ElemType[10000]), vused_(0), vsize_(10000)
{}
Field::Field(const Field& other)
: v_(h::NewCopy(other.v_,
other.vsize_,
other.vsize_)),
vused_(other.vused_),
vsize_(other.vsize_)
{}
// Also available as a const& version
int& Field::operator[](int index) throw(const char *)
{
if (index < 0 || index > vused_)
throw "Index out of bounds.";
else
return v_[index];
}
复制功能
template <class T>
T *NewCopy( const T* src,
size_t srcSize,
size_t destSize)
{
assert( destSize >= srcSize );
T *dest = new T[destSize];
try
{
std::copy(src, (src + srcSize), dest);
}
catch(...)
{
delete[] dest;
throw;
}
return dest;
}
答案 0 :(得分:2)
如果你的尺码是5,那么你的有效指数是不是0-4? 5将超出范围。我认为您的operator[]
边界检查中有错误:
if (index < 0 || index > vused_)
......应该......
if (index < 0 || index >= vused_)
答案 1 :(得分:2)
BOOST_REQUIRE_EQUAL((*field)[0], (*field2)[0]); // one
BOOST_REQUIRE_EQUAL((*field)[1], (*field2)[1]); // two
BOOST_REQUIRE_EQUAL((*field)[2], (*field2)[2]); // three
BOOST_REQUIRE_EQUAL((*field)[3], (*field2)[3]); // four
BOOST_REQUIRE_EQUAL((*field)[4], (*field2)[4]); // five
BOOST_REQUIRE_EQUAL((*field)[5], (*field2)[5]); // wait, six?
计算您正在检查的元素数量,从零到五......它给你六个。但是你的收藏应该有五个元素。