2013-07-22 80 views
1

我在C++ 11升壓編程的情況下,我想實現某種框架,其中一個人只需要從Base類繼承,並實現()方法 ,這可能取決於其他繼承。 然後應該在主函數中自動創建這些繼承,而不需要程序員進行任何修改。自動創建繼承

class Base 
{ 
public: 
    virtual void method() = 0; 
} 

class A : public Base 
{ 
public: 
    static int state = 0; 

    void method() // 
    { 
     //do something with B 
     A::state = B::state * 3; 
    } 
} 

class B : public Base 
{ 
public: 
    static int state = 0; 

    void method() // 
    { 
     //do something with A 
     B::state = A::state * 2; 
    } 
} 

int main() 
{ 

//Access to an Array containing ONE pointer to each Inheritance 

vector<Base*> inheritancesOfBase; 
inheritancesOfBase.push_back(new A); // <- should be done automatically 
inheritancesOfBase.push_back(new B); // <- should be done automatically 

//PSEUDOCODE 
for_each(base* pInh in inheritancesOfBase) 
{ 

    pInh->method(); 
    clones.push_back(pInh->clone()); 

} 


return 0; 
} 

我認爲這應該是可以與一些花式元編程,但如何?

編輯:澄清

+0

目前尚不清楚你真正想要什麼 - 在運行時創建一些As和Bs,或者在運行時創建新類的類型(使用編譯時元編程...?) – doctorlove

+0

最後,我想有一個數組包含每個繼承的一個實例(或指針)。 – Paul

+0

我想我已經找到了解決我的問題[這裏] [1] [1]:http://stackoverflow.com/questions/17410942/c-automatic-instantiation-of-derived-classes – Paul

回答

0

首先:當你缺少的靜把定義您的代碼將無法編譯。您需要在代碼中添加int A::state = 0(或類似),並在B::state中添加相同的代碼。

其次,A和B對象的自動創建是不可能的,因爲編譯器無法知道,您對代碼的意圖是什麼。因此,至少需要在主體中聲明A和B對象。例如。編譯器應該如何知道,你需要一個A和五個B對象?所以,你必須聲明你的意圖的comiler:

int main(void) 
{ 
    A myA; 
    B myBArray[5]; 
    vector<shared_ptr<Base>> myABCollection; 
} 
+0

它也不會編譯因爲它缺少分類後的分號 – doctorlove

0

因此,我們必須像

class Base 
{ 
public: 
    virtual void method() = 0; 
}; 

(不要忘記階級後的分號) 和大量的子類,而不僅僅是顯示了AB

我們希望main像做

for(Base & item : instances) 
{ 
    item.method(); 
} 

你可以做一個工廠,該保持什麼它創建一個vector<shared_ptr<Base>>軌道當問及返回instances
解決了一半的問題。如果你想找到從Base派生的所有類,給定C++沒有反射,我不明白你會怎麼做。你可以用clang把一些東西拼湊起來,然後用這種方式生成一些代碼。 RecusiveASTVisitor可能會有所幫助。

+0

這正是我的意思。 – Paul

+0

基本上我想避免的是實現新方法的程序員需要在項目的其他地方傳播其存在......也許我正在運行在我的項目的基本設計問題中? – Paul

+0

我不清楚你的意思 - 這正在變成聊天。也許我們應該把它聊天 – doctorlove