回答你的问题的最简单答案是,你必须正确申报其集装箱,而且你必须确定一个适当的舱位操作员。 尽可能从您的榜样中密切合作:
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();
iii
注 签字改为const reference<>,其中强调,我们将复制原物体,而不会以任何方式改变原物体。
∗∗∗∗∗ 由于你提供了一份副本,因此与服从行为一样——正在不同情况下援引行动,无论情况如何类似。
虽然你显然感到迷惑不解,但冷却使得这样做的理由不那么明显——例如,你想要维持一系列的退约目标,会更好地证明这种能力“需要”。 如同你一样,使用“T”也是很不好的选择,因为这往往意味着对大多数经验丰富的C++方案制定者的模板使用。
造成你“无法解释”的坠机最有可能的是,派任经营人;如果你不给人定义,汇编者将自动产生一份双向复印件——几乎肯定是而不是——如果你的班子不是收集简单数据类型(POD)。
为使这项工作能够妥善进行一系列复杂的工作,你可能需要确定一个深厚的复印件或参考数;在C++中,让汇编者为你创建任何导师、导师或派任几乎总是很难。
当然,使用标准集装箱,而不是你所举的例子所暗示的简单阵容机制,是一种好的想法。 在这种情况下,由于集装箱和算法的假设,你可能还应界定违约方、虚拟拖车和复印机。
事实上,如果你真的希望(<>不是)在<>原始<<>物体上,但从一阵列中援引行动,那么你就需要有一系列的点。 再次与你原来的榜样密切合作:
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();
iii
密切地注意到阵列 从Elseland开始,现在有一系列的点,而不是一系列实际物体。
请注意,我在此案中投下了最热烈的词句,因为我不知道行动是否是一种最连贯的方法,而我所假设的名号是......
Note carefully the ampersand (address-of) operator being used in the assignment.
说明还使用了点到操作员来援引(a)方法的新辛迪加。
Finally be advised that using standard containers of pointers is fraught with memory-leak peril, but typically not nearly as dangerous as using naked arrays :-/