我曾嘗試使用VS2008中的代碼(可能已經包括在樣品中過多的情況下...):繼承模板參數和上溯造型早在C++
class Base
{
public:
void Prepare() {
Init();
CreateSelectStatement();
// then open a recordset
}
void GetNext() { /* retrieve next record */ }
private:
virtual void Init() = 0;
virtual string CreateSelectStatement() const = 0;
};
class A : public Base
{
public:
int foo() { return 1; }
private:
virtual void Init() { /* init logic */ }
virtual string CreateSelectStatement() { /* return well formed query */ }
};
template<typename T> class SomeValueReader : protected T
{
public:
void Prepare() { T::Prepare(); }
void GetNext() { T::GetNext(); }
T& Current() { return *this; } // <<<<<<<< this is where it is interesting
SomeValue Value() { /* retrieve values from the join tables */ }
private :
string CreateSelectStatement() const
{
// special left join selection added to T statement
}
};
void reader_accessAmemberfunctions_unittest(...)
{
SomeValueReader<A> reader();
reader.Prepare();
reader.GetNext();
A a = reader.Current();
int fooresult = a.foo();
// reader.foo() >> ok, not allowed
Assert::IsEqual<int>(1, fooresult);
};
可正常工作,即,具有獲得「A」成員函數和fooresult返回1。但是,當物體在單元測試函數的末尾被刪除則拋出異常:
System.AccessViolationException: 試圖讀取或寫入受保護的 記憶。這往往是一個跡象 其他內存已損壞
如果我改變電流()函數的返回類型:
T* Current()
{
T* current = dynamic_cast<T*>(this);
return current;
}
那麼一切都OK並沒有訪問衝突單元測試結束。有人可以告訴我第一個Current()實現有什麼問題嗎?謝謝,bouchaet。
我很驚訝任何代碼生成「在單元測試功能的結尾」。似乎沒有任何這些對象具有析構函數。 –
您有足夠的代碼將其粘貼到新項目中,將unittest函數重命名爲'main()',並從頭開始重現問題。我會嘗試。 –