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

我修改了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 );
    }
;
}
;

 

修改前运行结果如下:

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()返回的是一个临时对象,只能这样解释了,但是为什么两个对象顺序颠倒呢?不懂的事情实在太多!