c++ - 仅对类 NOT STATIC 的每个对象调用方法一次

标签 c++ boost constructor static

我写了一个构造函数是私有(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_sharedmake_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/

相关文章:

c++ - boost::posix_time::ptime 是固定大小的吗?

c++ - 暂停 boost::thread 无限时间

c# - 让构造函数改变对象类型

C++11 如何在编译时识别原子类型(通过 mtl 或定义)?

c++ - 如何计算云中每个点的法线

c++ - io_service 截止时间计时器不定期工作

java - 静态初始化器与实例初始化器与构造函数

c++ - 如何放入 addStaff(const Staff&) 数组

c++ - 模板推演失败

c++ - 模板元组 - 在每个元素上调用一个函数