[英]Call method only once for EACH object of the class NOT STATIC
我写了一个构造函数是私有的类。
我只需要一次将给定值分配给私有成员
在方法construct(int a)
。
它应该像构造函数,而不是构造函数!
第一次之后每次调用此construct(int a)
时,我都不需要为该特定对象重新分配任何内容。
如何在没有布尔值的情况下实现这一目标?
我想到了boost::call_once
但它为整个类调用一次一次construct(int a)
! 我需要为每个对象调用一次此函数。
就像ctor! 有任何想法吗?
更新1:构造函数是私有的。 但是该类有一些成员,这些值可以从外部分配,但只能一次
我正在尝试实现一些自动化,以检查是否使用bool wasCalled
类的函数是否已被调用。
更新2:
LT::Pointer lut = LT::New();
std::vector<double> points;
....
lut->construct(points);
第二次
lut->construct(points);
被称为-应该给出错误,或者以某种方式使其无法执行。
直接回答 :
您可以设计一个将“一次分配”语义应用于包装对象的包装器。
但是,您不能使编译器在编译时检测到第二次设置值,因此您应该准备在运行时声明/抛出该值。
背景/环顾四周
正如其他人所说,这闻起来很像是设计缺陷。 为什么不能使用New
操作转发构造函数参数(a-la make_shared
, make_unique
?):
template <typename T, typename... Args>
SmartPointer<T> genericNew(Args&&... args) {
return SmartPointer<T>(new T(std::forward<Args>(args)...));
}
当然,可能会有专门的工厂方法,甚至在建造后都知道如何设置私有财产。 在工厂创建后,使工厂方法成为朋友,以防止他人使用隐藏的属性(setter):
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;
};
(在这里,我选择使New
factory方法成为静态成员,因此它暗中是朋友)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.