我写了一个构造函数是私有(private)的类。
我只需要将给定值分配给私有(private)成员一次
在方法 construct(int a)
中。
它应该是构造函数而不是构造函数!
每次 construct(int a)
第一次调用后,
我不需要为那个特定的对象重新分配任何东西。
如何在没有任何 bool 值的情况下实现这一点?
我想到了 boost::call_once
但它为整个类调用了一次 construct(int a)
!我需要调用此函数 ONCE for EACH OBJECT。
就像ctor!有什么想法吗?
更新 1: 构造函数是私有(private)的。但是该类有一些成员可以从外部分配这些值,但只能分配一次
我试图在不使用 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)...));
}
当然,可以有专门的工厂方法,甚至知道如何在构造后设置私有(private)属性。使工厂方法成为 friend ,以防止其他人使用工厂创建后的隐藏属性(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
工厂方法成为静态成员,所以它隐含地是一个 friend )
关于c++ - 仅对类 NOT STATIC 的每个对象调用方法一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22203513/