用于删除将数据置于“不良状态”的默认构造函数的模式?

问题描述 投票:0回答:1

假设您有一个班级,该班级的成员应始终进行设置(即默认设置将使其处于不良状态)。为防止对象具有“不良状态”,您需要一个构造函数,该构造函数需要设置所有内容。问题是,您还有一组“工厂”类,通过解析一些数据流并直接设置成员来创建对象。您希望明确说明哪些类可以在不使用构造函数的情况下构造对象。是否有一个好的模式?

示例:

enum class DataState
{
     STATE_ONE,
     STATE_TWO
};

class Data
{
public:
   Data(std::string _dp1, DataState _dp2): dp1(_dp1), dp2(_dp2) {}
   Data() {}; /* Don't want this constructor because it forces a default for dp2

   std::string dp1;
   DataState dp2;
};

默认构造函数是必需的,因为您有工厂类,这些工厂类使用“ Data”对象获取回调,并按每个成员填充其成员。即类似于:

Field1Callback(Data &d, const std::string &fieldVal)
{
    d.dp1 = field;
}

Field2Callback(Data &d, const std:string &fieldVal)
{
    d.dp2 = ConvertToState(fieldVal);
}

是否有任何模式可以明确说明允许哪些类调用“默认”构造函数?即串行器和解析器?

c++ design-patterns constructor friend
1个回答
0
投票

如果您真的想明确地知道哪些类可以调用默认构造函数,则可以执行以下操作:

#include <memory>

class Factory;

void create_data(Factory &);

class Data {
    Data() = default;

    friend void create_data(Factory &);
};

class Factory {

    std::unique_ptr<Data> _data;

public: 
    void set_data(std::unique_ptr<Data> &&inp) {
        _data = std::move(inp);
    }

    std::unique_ptr<Data> make_data();

};

void create_data(Factory &f) {
    f.set_data(std::unique_ptr<Data>(new Data())); // make_unique does _not_ work.
}

std::unique_ptr<Data> Factory::make_data() {
    create_data(*this);
    return std::move(_data);
}

int main() {
    Factory f;

    auto d = f.make_data();
}

但是我认为我不会推荐它。

© www.soinside.com 2019 - 2024. All rights reserved.