我有一个对象需要稍微不同的构造,它的实例是静态或动态分配的。 该对象应该只有一个默认构造函数。因此,拥有两个构造函数,每个案例一个,并让用户明确选择适当的构造函数是不可能的。
有没有正确的方法来实现这个目标?
这就是我现在这样做的方式: 我重载该对象的new运算符,malloc内存,并使用返回的指针作为指向(尚未初始化的)实例的指针,并将对象的特定数据成员设置为某个魔术值。 然后,在使用者中,我检查成员的值。如果它是魔术值,则该对象动态分配99.9%。
在重新调试和调试模式下,这个方法对我来说还没有失败,但是,这似乎是一个糟糕的黑客攻击。
答案 0 :(得分:2)
你应该能够实现你想要的,同时留下一个用户可访问的默认构造函数(将用于静态和auto 对象 - 你似乎忽略了自动对象的存在,例如局部变量,所以我想你想要对这些案例进行相同处理。)
使operator new
和一个单独的构造函数都是私有的,并创建一个公共静态方法(这是“工厂方法”设计模式的一种情况),它只执行return new TheClass(123);
(假设单独的构造函数采用例如一个整数,但当然你可以选择你想要的任何类型的参数,因为无论如何都不使用这个参数。)
你知道你说对象应该有一个构造函数,但是从用户的角度来看,这个类的行为正是如此,并且用户的部分没有“显式选择构造函数”(他只是无法调用) new
明确但必须通过您提供的工厂方法,这就是全部。
答案 1 :(得分:0)
任何构造函数都可用于静态或动态分配。无论您分配对象的哪种方式,都无法强制对象的用户使用特定的构造函数。
答案 2 :(得分:0)
我认为你不能在构造函数中告诉我。
我不知道这是否有帮助,但你可以通过使析构函数私有来阻止对象的静态创建。您还需要一个公共的“删除”方法,为动态分配此类对象的代码执行delete this
- 它们必须执行obj->Delete()
而不是delete obj
。