2012-07-18 92 views
0

我創建具有指針的載體和創建從模件派生的類DIGOUT在一種方法稱爲訪問一個矢量對象從一個不同的類

BOOL Cbeckhoff_frontendDlg::OnInitDialog() 
{ 
//... 
std::vector<Modul*> arrDigOut; 
arrDigOut.push_back(new DigOut(IDC_CHECK1, this,"GVL.DigOut1",pAddr)); 
//... 
for(iNumDO = 0;iNumDO<1;iNumDO++) arrDigOut[iNumDO]->InitCheck(this); 
//... 
} 

如何從一個不同的訪問向量新對象方法,如:

void Cbeckhoff_frontendDlg::OnBnClickedButton3() 
{ 
for(iNumDO = 0;iNumDO<1;iNumDO++) arrDigOut[iNumDO]->SetID(); 
} 

我想過使用公共指針或getter和setter方法,
但我沒有得到這樣的創造membervariables:

std::vector<Modul*> * parrDigOut; 

它抱怨說,Modul沒有聲明。

回答

0

你的榜樣給人的感覺你是在功能範圍宣佈vector。它的生命週期在函數調用結束時結束(並且所有內存都被泄漏)。將其存儲爲類成員和成員函數beginend,它們轉發和end成員函數vector。可能將它們包裝在dereference_iterator中以隱藏它們是指針的事實。

class foo { 
public: 
    foo() { 
    // add things to s_ 
    } 

    ~foo() { 
    // dont forget to delete everything in s_ 
    } 
    typedef std::vector<my_stuff*>::iterator iterator; 
    typedef std::vector<my_stuff*>::const_iterator const_iterator; 
    iterator begin() { return s_.begin(); } 
    iterator end() { return s_.end(); } 
    const_iterator begin() const { return s_.begin(); } 
    const_iterator end() const { return s_.end(); } 

    // or to hide the pointers 
    typedef boost::indirect_iterator< std::vector<my_stuff*>::iterator > iterator; 
    iterator begin() { return boost::make_indirect_iterator(s_.begin()); } 
    iterator end() { return boost::make_indirect_iterator(s_.end()); } 
private: 
    std::vector<my_stuff*> s_; 
}; 
0

如果我理解正確的,只是讓公衆和前加入這一行:

class Modul; 
0

您可以像您所描述的那樣定義一個成員變量。 類聲明的頂部只提供預先聲明,

class Modul; 

這是爲了讓編譯器知道這樣一類是會得到某處的路線定義。

成員變量不需要公開,因爲它可以從同一個類中的另一個函數訪問。

而剛剛宣佈的成員:

std::vector<Modul*> parrDigOut; //No need of pointers 

但是,你可以考慮使用智能指針,以確保它被刪除時父類失控的範圍