CxxTest初探(二)
来源:互联网 发布:js 弹出模态窗口 编辑:程序博客网 时间:2024/06/06 02:15
在CxxTest的CxxTest guide.pdf的P20(4.3.5.1)页那个例子在VS2005下有问题,修改后代码如下:
template<class T>
class TMyClass
{
T _value;
public:
TMyClass( const T &value ) : _value( value )
{}
const T &value() const
{
return _value;
}
// CxxTest requires a copy constructor
TMyClass( const TMyClass<T> &other ) : _value( other._value )
{}
// If you want to use TS_ASSERT_EQUALS
bool operator== ( const TMyClass<T> &other ) const
{
return _value == other._value;
}
};
#ifdef CXXTEST_RUNNING
#include <cxxtest/ValueTraits.h>
#include <typeinfo>
#include <sstream>
#include <string>
namespace CxxTest
{
template<class T>
class ValueTraits< TMyClass<T> >
{
private:
std::ostringstream _s;
char szBuf[256];
public:
ValueTraits( const TMyClass<T> &t )
{
_s << typeid(t).name() << "(" << t.value() << ")";
}
const char *asString() const
{
strcpy((char *)szBuf, _s.str().c_str());
return szBuf;
}
};
};
#endif // CXXTEST_RUNNING
class TMyClass
{
T _value;
public:
TMyClass( const T &value ) : _value( value )
{}
const T &value() const
{
return _value;
}
// CxxTest requires a copy constructor
TMyClass( const TMyClass<T> &other ) : _value( other._value )
{}
// If you want to use TS_ASSERT_EQUALS
bool operator== ( const TMyClass<T> &other ) const
{
return _value == other._value;
}
};
#ifdef CXXTEST_RUNNING
#include <cxxtest/ValueTraits.h>
#include <typeinfo>
#include <sstream>
#include <string>
namespace CxxTest
{
template<class T>
class ValueTraits< TMyClass<T> >
{
private:
std::ostringstream _s;
char szBuf[256];
public:
ValueTraits( const TMyClass<T> &t )
{
_s << typeid(t).name() << "(" << t.value() << ")";
}
const char *asString() const
{
strcpy((char *)szBuf, _s.str().c_str());
return szBuf;
}
};
};
#endif // CXXTEST_RUNNING
我修改了ValueTraits< TMyClass<T>>的asString()方法,原来写法如下:
return _s.str().c_str();
测试代码如下:
#include <cxxtest/TestSuite.h>
#include "TMyClass.h"
#include <iostream>
class TestTMyClass : public CxxTest::TestSuite
{
public:
void testEquals()
{
TMyClass<int> m1(10);
TMyClass<int> m2(23);
TS_ASSERT_EQUALS( m1, m2 );
};
};
#include "TMyClass.h"
#include <iostream>
class TestTMyClass : public CxxTest::TestSuite
{
public:
void testEquals()
{
TMyClass<int> m1(10);
TMyClass<int> m2(23);
TS_ASSERT_EQUALS( m1, m2 );
};
};
修改前运行结果如下:
In TestTMyClass::testEquals:
e:/temp/TestTMyClass.h:13: Error: Expected (m1 == m2), found K7 != class TMyClass<int>(10))
原本是第一个对象变成了第二个,而第二个对象成了K7,莫名其妙!
修改后结果如下:
In TestTMyClass::testEquals:
e:/temp/TestTMyClass.h:13: Error: Expected (m1 == m2), found (class TMyClass<int>(10) != classTMyClass<int>(23))
但是我发现一个奇怪的问题,就是asString中的类成员变量都是const的,于是我用了强制类型转换才搞定。本来我想返回一个string对象,但是作为成员变量的string对象不让我赋值,说是const的。刚刚才想明白,原来asString()是一个const成员函数,不能修改成员变量的。唉,对C++还是了解不够啊!
不过为什么return _s.str().c_str()不行呢?可能是因为_s.str()返回的是一个临时对象,只能这样解释了,但是为什么两个对象顺序颠倒呢?不懂的事情实在太多!
- CxxTest初探(二)
- CxxTest初探
- CxxTest初探(三)
- CxxTest
- 使用CxxTest测试框架
- CxxTest的环境配置
- CxxTest的另类使用
- 初探 PHP5 (二)
- Hibernate初探(二)
- COM初探(二)
- 初探 PHP5 (二)
- tolua++初探(二)
- GDB初探(二)
- Linux初探(二)
- PE文件初探二
- J2ME初探之二
- quartz初探(二)
- SqlHelper初探之二
- QQ机器人
- 何谓技术架构?
- 『多功能會員卡』——談新興連鎖加盟會員e化系統之建置
- java md5 的实现
- 让QQ机器人聪明点,再聪明点
- CxxTest初探(二)
- 字符集的编(解)码的总结
- COGNOS安装笔记
- 静态成员声明,定义
- 腾讯笔试题一道(max宏定义,不使用大于,小于,if语句)
- frame,iframe,frameset 的区别
- 开始学习核心编程
- ASP.NET 2.0 中的窗体身份验证
- 输入框里有文字提示