只为NOT STATIC类的EACH对象调用一次方法

Call method only once for EACH object of the class NOT STATIC

本文关键字:一次 方法 调用 STATIC NOT 类的 EACH 对象 只为      更新时间:2023-10-16

我写了一个类,其中构造函数是私有的。

我只需要将给定的值分配给私人成员一次

在方法CCD_ 1中。

它应该类似于构造函数,但不是构造函数!

每当在第一次之后调用该CCD_ 2时,我不需要将任何东西重新分配给那个特定的OBJECT。

如何在没有任何布尔值的情况下实现这一点?

我想到了boost::call_once,但它为整个课堂调用了construct(int a)一次!并且我需要为每个对象调用此函数一次

就像克托一样!有什么想法吗?

更新1:构造函数是私有的。但是类有一些成员,这些值可以从外部分配,但只能分配一次

我正在尝试在不使用bool wasCalled或类似的东西的情况下实现一些自动化,以检查是否已经调用了函数。

更新2:

LT::Pointer lut = LT::New();
std::vector<double> points;
....
lut->construct(points);

第二次

lut->construct(points);

被称为-应该给出错误,或者只是以某种方式使其不可能。

直接回答

您可以设计一个包装器,将"一次性分配"语义应用于被包装的对象。

但是,您可以而不是让编译器在编译时检测到第二次设置值,因此您应该准备好让它在运行时断言/抛出。

背景/环视

正如其他人所说,这闻起来很像是一个设计缺陷。为什么不能使用New操作前向构造函数参数(a-lamake_sharedmake_unique?):

template <typename T, typename... Args>
SmartPointer<T> genericNew(Args&&... args) {
return SmartPointer<T>(new T(std::forward<Args>(args)...));
}

当然,也可以有专门的工厂方法,甚至知道如何在施工后设置私人财产。让工厂方法成为朋友,以防止其他人使用工厂创建后的隐藏属性(setters):

struct X { 
int a; 
X(int i) : a(i) {}
typedef SmartPointer<X> Ptr;
static Ptr New(int a, int init_only) {
Ptr p(new X(a));             
p->init_only = init_only;
return p;
}
private:
int init_only;
};

(在这里,我选择将construct(int a)0工厂方法作为静态成员,因此它隐含地是一个朋友)