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

时间:2014-03-05 16:29:44

标签: c++ boost constructor static

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

我需要将给定值分配给私人成员ONLY ONCE

方法construct(int a)中的

它应该像构造函数,但不是构造函数!

每次第一次调用construct(int a)后, 我不需要为那个特定的OBJECT重新分配任何东西。

如果没有任何布尔值,如何实现这一目标?

我想到了boost::call_once但是它为整个班级调用了construct(int a)一次!我需要为每个对象调用此函数 ONCE

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

更新1: 构造函数是私有的。但是该类有一些成员可以从外部分配这些值,但仅限于ONCE

我正在尝试实现一些自动化,以便在没有使用bool wasCalled之类的情况下检查函数是否已被调用。

更新2:

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

第二次

lut->construct(points);

被调用 - 应该给出错误,或者只是以某种方式使它变得不可能。

1 个答案:

答案 0 :(得分:1)

直接回答

您可以设计一个将“assign-once”语义应用于包装对象的包装器。

但是,你可以让编译器检测到在编译时第二次设置了一个值,所以你应该准备好在运行时使它断言/抛出。

背景/环顾四周

正如其他人所说,这闻起来非常像设计缺陷。为什么不能拥有New操作正向构造函数参数(a-la make_sharedmake_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工厂方法设为静态成员,因此它隐含为朋友)