對於你的問題最簡單的答案是,你必須正確聲明你的容器和你必須爲你的類定義一個合適的assigment操作符。從你的例子儘可能密切合作:
typedef class MyActionableClass T;
T* getGlobalPointer();
void AddInstance(T const& objInstance)
{
T* arrayFromElsewhere = getGlobalPointer();
//ok, now at this point we have a reference to an object instance
//and a pointer which we assume is at the base of an array of T **objects**
//whose first element we don't mind losing
//**copy** the instance we've received
arrayFromElsewhere[0] = objInstance;
//now invoke the action() method on our **copy**
arrayFromElsewhere[0].action();
}
注簽名更改爲const引用其中強調,我們要複製原始對象,不以任何方式改變它。
而且筆記仔細是arrayFromElsewhere [0] .action()不是一樣objInstance.action(),因爲你已經做了一個副本 - 行動()被在不同的上下文中調用,不管有多相似。
雖然很明顯你已經濃縮了,但是這樣做的原因並不那麼明顯 - 例如指定你想要維護一個回調對象數組會更好地滿足「需要」這個能力。像你這樣使用「T」也是一個糟糕的選擇,因爲這往往意味着大多數有經驗的C++程序員都會使用模板。
最有可能導致您的「不明原因」崩潰的事情是賦值運算符;如果你沒有定義一個,編譯器會自動生成一個作爲按位副本的工具 - 幾乎可以肯定地是而不是如果你的類不是簡單數據類型(POD)的集合,你想要什麼。
爲了在任何複雜類別上正常工作,您可能需要定義深層副本或使用引用計數;在C++中,讓編譯器爲您創建任何ctor,dtor或賦值幾乎總是一個糟糕的選擇。
而且,當然,使用標準容器而不是您的示例中隱含的簡單數組機制將是個不錯的主意。在這種情況下,由於容器和算法的假設,你應該也可以定義一個默認的ctor,一個虛擬的dtor和一個copy。
如果,事實上,你不想創建對象的副本,但希望,相反,在一個陣列中調用原對象,但是從動作(),那麼你就需要一個數組的指針來代替。再次緊密合作,以你原來的例子:
typedef class MyActionableClass T;
T** getGlobalPointer();
void AddInstance(T& objInstance)
{
T** arrayFromElsewhere = getGlobalPointer();
//ok, now at this point we have a reference to an object instance
//and a pointer which we assume is at the base of an array of T **pointers**
//whose first element we don't mind losing
//**reference** the instance we've received by saving its address
arrayFromElsewhere[0] = &objInstance;
//now invoke the action() method on **the original instance**
arrayFromElsewhere[0]->action();
}
注意密切注意arrayFromElsewhere現在的對象指針,而不是實際對象的數組的數組。
注意,我放棄了const修飾在這種情況下,因爲我不知道,如果行動()是一個const方法 - 有了這樣的名字我假設不...
注意仔細號(地址 - 的)運營商正在使用的任務。
還要注意通過使用pointer-to運算符來調用action()方法的新語法。
最後注意,使用指針的標準集裝箱是充滿了內存泄漏的危險,但通常不近作爲危險的,因爲使用裸陣列: -/
您正在創建*指針數組*和努力在裏面存儲* objects *。這絕對不行,它通常不應該編譯。還有其他錯誤。我真的看不到這是如何編譯的。 – Jon 2012-01-14 02:05:44
這是你的真實代碼嗎?因爲那真的不應該編譯('T [0]'如果'T'是一個類型是沒有意義的。如果使用'objectList',那麼它仍然不能編譯,因爲'objectList [0]'是鍵入'T *',而'object'類型爲'T&') – Grizzly 2012-01-14 02:08:13
T是一個類。這只是僞代碼,我試圖從幾個分散的地方提取樣本。 – 2012-01-14 02:09:36