我想弄清楚如何遍歷一個容器(如std :: vector)的對象在內存中共享一個公共基類父類連續。迭代遍歷內存中的公共基類的對象
爲了演示這個問題,我們使用下面的例子。現在
class Base
{
public:
Base();
virtual void doStuff() = 0;
};
class DerivedA : public Base
{
private:
//specific A member variables
public:
DerivedA();
virtual void doStuff();
};
class DerivedB : public Base
{
private:
//specific B member variables
public:
DerivedB();
virtual void doStuff();
};
,使用std :: vector的迭代會保持在連續內存中的對象,但我們會體驗到切片,因爲沒有空間的派生屬性。
因此,我們必須使用多態技術使用指針像這樣
int main()
{
std::vector<Base*> container;
container.push_back(new DerivedA());
container.push_back(new DerivedB());
for (std::vector<Base*>::iterator i = container.begin(); i!=container.end(); i++)
{
(*(*i)).doStuff();
}
}
據我知道,應該工作正常鑑於類實現。
問題:現在 ,載體含有指針在連續內存中,但這並不意味着它們都指向地址。
因此,如果我希望能夠隨時刪除對象並將其插入到矢量中,那麼這些對象將遍佈整個內存中。
問: 好像每個人建議做它的std ::向量的方式,但爲什麼沒有考慮問題的是,它不是在內存中連續可迭代(假設我們實際使用的指針)?
我是否被迫做了複製麪食的方式?
int main()
{
std::vector<DerivedA> containerA;
DerivedA a;
containerA.push_back(a);
std::vector<DerivedB> containerB;
DerivedB b;
containerB.push_back(b);
for (std::vector<DerivedA>::iterator i = containerA.begin(); i!=container.end(); i++)
{
(*i).doStuff();
}
for (std::vector<DerivedB>::iterator i = containerB.begin(); i!=container.end(); i++)
{
(*i).doStuff();
}
}
我猜可能沒有真正解決這一點,因爲在內存中保存各種大小的物體線性並沒有真正意義,但如果任何人都可以給我一些意見,我將不勝感激。
我認爲你最後一句話總結了它。如果你無法忍受複製粘貼,也許使用容器來管理你的載體。如果你想要一些想法,我已經在[這裏](http://codereview.stackexchange.com/questions/87729/storing-collections-of-objects-of-any-type)刺了一刀。 – Quentin
Offhand我可以想象一種方法來保持內存中的連續類型。但是你會失去隨機訪問,並可能有其他限制。事實上,它有點像在同一時間獲得矢量和列表的最壞方面。與軟件開發中的大部分內容一樣,在某個地方有一個權衡。 – TheUndeadFish
它們的尺寸有多大?對於他們採用派生大小的大數,再加上一個指針或頭頂的指針,你還好嗎?你是否使用繼承來實現多態?界面有多大?你有提升嗎?派生類的集合是否被修正(在編譯時)並且有界?這些不是閒置的問題,對它們的回答可以使某些解決方案可行,而其他方案則不行。 – Yakk