2013-11-25 66 views
0

這是我的示例代碼。我想從基地或中產階級獲得頂級課程。 我該怎麼做?我不想在任何地方指定頂級類名,我知道我可以寫「GetTop < TopClass>();」,但我希望,沒有這個方法。如何從基類中獲得頂級課程

當然,我的代碼顯示了一個錯誤:

「錯誤C2783: 'T *的BaseClass ::共達(無效)':不能推導出模板參數的 'T'」

class BaseClass 
{ 
public: 
BaseClass(){} 
virtual ~BaseClass() {} 

template < class T > 
T* GetTop() 
{ 
    return static_cast<T*>(this); 
}; 

BaseClass * GetBase() 
{ 
    return this; 
} 
}; 

class MiddleClass : public BaseClass 
{ 
public: 
MiddleClass(){} 
virtual ~MiddleClass() {} 
}; 


class TopClass : public MiddleClass 
{ 
public: 
TopClass(){} 
virtual ~TopClass() {} 
}; 


int __stdcall WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) 
{ 
TopClass * t = new TopClass(); 
MiddleClass * m = static_cast<MiddleClass*>(t); 
BaseClass * b = static_cast<BaseClass*>(t); 


TopClass * top = m->GetTop(); 
TopClass * top2 = b->GetTop(); 

return 0; 
} 

非常感謝你對你的想法:)

+2

可以真的,真的。添加'AnotherTopClass類:public MiddleClass'時會發生什麼? – Mat

+0

無法從返回值推導出模板參數。 – texasbruce

+0

我不完全瞭解您的問題。是static_cast ()太長,你輸入?在這種情況下,爲什麼不直接寫一個別名函數'Topclass * ctt(BaseClass * bc){return static_cast (bc);}'? – MikeMB

回答

1

也許你想要做一個dynamic_cast的<>

您可能希望C++的行爲類似於某些語言與反思,如C#。那是不正確的。
這是另一個類似的帖子。

http://stackoverflow.com/questions/3049404/apples-oranges-and-pointers-to-the-most-derived-c-class 

您可能會問一些它沒有的C++。

class basex 
{ 
    public: 
    virtual ~basex() {}; 
}; 
class middlex : public basex 
{ 
    public: 
    //middlex() = default; 
}; 
int dynamic_test() 
{ 
    basex * cbq = new middlex; 
    basex * cbq2 = new basex; 
    middlex * mcp = dynamic_cast<middlex *>(cbq); 
    //should suceed 
    if (nullptr != mcp) 
    { 
     cout << "dynamic cast worked" << endl; 
    } 
    else 
    { 
     cout << "dynamic cast failed" << endl; 
    } 
    //should fail 
    middlex * mcp2 = dynamic_cast<middlex *>(cbq2); 
    if (nullptr != mcp2) 
    { 
     cout << "dynamic cast worked" << endl; 
    } 
    else 
    { 
     cout << "dynamic cast failed" << endl; 
    } 
    return 0; 
} 

你看起來像你真的想這樣做簡單的鑄件和成員函數似乎並不有用

.....................

template < class T > 
T* GetTop() 

需要改進 很簡單,就是做一個鑄件....和鑄件需要目標類型 的static_cast需要明確的類型參數 這樣.. 共達需要明確的類型參數

共達 是一個成員函數...的T可以是任何類...提供的代碼..具有用於類型推演沒有給定的參數......你的提供指針... C++這樣...因此您可能只會將其稱爲TopClass或派生對象。 (讓我們排除複雜鑄件)

TopClass * top = m->GetTop(); 

編譯器將盡力使右側的意義.............不考慮左側
編譯器不考慮左側的類型的演繹..沒有任何類型演繹的幫助..它只是試圖理解右側
我說,因爲看起來你可能會認爲編譯器會使用類型TopClass類型演繹...它不會

這將工作編譯

TopClass * top = m->GetTop<TopClass>(); 

但它所做的無非一個明確的static_cast更

也許你應該說明你正打算做

+0

我知道,這是「GetTop ();」。比方說,我有很多派生類,只有一個頂級類。比方說,我想將我的對象傳遞給Scene函數,它只接受SceneObject。不派生SceneObject的類不能傳遞。 MiddleClass非常容易獲得,因爲我存儲對基類的引用,但是我有太多的頂級類,它看起來很糟糕,只能讀取類類型,然後投射到我的右上角類。所以我認爲有一個更聰明的方式,如何做到這一點,並有代碼乾淨和短。 – wh1sp3r

+0

和動態演員很不幸很慢。我知道我在施放什麼,我不需要檢查它。 – wh1sp3r

+0

@ wh1sp3r場景是否需要SceneObject或SceneObject&或SceneObject *?全對象,引用,指針?您可能希望在此處包含該代碼示例。你有一個容器或數組...... SceneObject * ..或TopClass *?如果存儲指向對象的指針並且空間允許...也許可以單獨存儲SceneObjects。有時整數與指針大小相同。也許你可以在需要的地方存儲[Object * x,int desired]爲false。您是否測試過dynamic_cast幾次以確保它是toooooo Slooooooo?你有立即記憶力的限制嗎? –

1

你當然可以寫什麼一個成員函數,通過參考參數返回鑄造的指針:

template<typename T> 
void getTop(T*& result) { result=static_cast<T*>(this); } 

您的示例應用程序則是這樣的:

TopClass * t = new TopClass(); 
MiddleClass * m = static_cast<MiddleClass*>(t); 
BaseClass * b = static_cast<BaseClass*>(t); 


TopClass * top(nullptr); m->getTop(top); 
TopClass * top2(nullptr); b->getTop(top2); 

無論你最終得到更多或更少的時間編寫代碼,這是否比當前的課程版本或多或少可讀取決於你的特定代碼。

編輯:一sligly擴展版將是:

template<typename T> 
T*& getTop(T*& result) { 
    result=static_cast<T*>(this); 
    return result; 
} 

TopClass * top=m->getTop(top); 
TopClass * top2=b->getTop(top2); 

我dont't知道如何該解決方案相比前一個在性能方面

相關問題