我写了一个构造函数是私有的类。
我需要将给定值分配给私人成员ONLY ONCE
方法construct(int a)
中的。
它应该像构造函数,但不是构造函数!
每次第一次调用construct(int a)
后,
我不需要为那个特定的OBJECT重新分配任何东西。
如果没有任何布尔值,如何实现这一目标?
我想到了boost::call_once
但是它为整个班级调用了construct(int a)
一次!我需要为每个对象调用此函数 ONCE 。
更新1: 构造函数是私有的。但是该类有一些成员可以从外部分配这些值,但仅限于ONCE
我正在尝试实现一些自动化,以便在没有使用bool wasCalled
之类的情况下检查函数是否已被调用。
更新2:
LT::Pointer lut = LT::New();
std::vector<double> points;
....
lut->construct(points);
第二次
lut->construct(points);
被调用 - 应该给出错误,或者只是以某种方式使它变得不可能。
答案 0 :(得分:1)
直接回答:
您可以设计一个将“assign-once”语义应用于包装对象的包装器。
但是,你可以不让编译器检测到在编译时第二次设置了一个值,所以你应该准备好在运行时使它断言/抛出。
背景/环顾四周
正如其他人所说,这闻起来非常像设计缺陷。为什么不能拥有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
工厂方法设为静态成员,因此它隐含为朋友)