gpt4 book ai didi

c++ - 如何禁止在工厂方法之外创建/复制 obj?

转载 作者:行者123 更新时间:2023-11-30 01:34:27 25 4
gpt4 key购买 nike

我有一个类,它具有非常重的负载,因此创建/复制/移动此类的实例非常昂贵。由于在应用程序完成初始化后它们不会更改,因此无需创建此类的临时对象。我只需要在容器 (std::map) 中缓存对象,并在需要时提供“const 引用”。

必须强调的是,我正在寻找一种解决方案,可以避免在将对象添加到容器之前进行双重创建或不必要的复制(我认为@getsoubl 提出的解决方案无法解决问题,因为它不能消除双倍创建或不必要的复制)。

所以我想将构造方法安排到类主体的“私有(private)/ protected ”部分,以禁止在“工厂方法”之外进行任何创建/复制/移动。以下是我的原始解决方案:

class MyClass {
public:
// methods of the class
static const MyClass & findObject( int iKey ) {
auto pair = mapObjects.try_emplace( iKey, iKey );
if ( pair.second )
cout << "New object has been created" << endl;

return pair.first->second;
};

// deleted
MyClass() = delete;
MyClass( MyClass & ) = delete;
MyClass( MyClass && ) = delete;
MyClass( const MyClass & ) = delete;
MyClass( const MyClass && ) = delete;
MyClass & operator=( MyClass & ) = delete;
MyClass & operator=( MyClass && ) = delete;
MyClass & operator=( const MyClass & ) = delete;
MyClass & operator=( const MyClass && ) = delete;

private:
// vars of the class
static map<int, MyClass> mapObjects;

// vars of instance
string some_heavy_payload;

// methods of instance
MyClass( int iKey ) :
some_heavy_payload( std::to_string( iKey ) ) {};
};

map<int, MyClass> MyClass::mapObjects;

int main() {
const MyClass & obj = MyClass::findObject( 1 );
return EXIT_SUCCESS;
};

但我陷入了一个矛盾,即“std::try-emplace”不能同时调用 MyClass 的构造函数。编译器报告:“错误:‘MyClass::MyClass(int)’在此上下文中是私有(private)的”。

所以我尝试了解决方案2:

class MyClass {
public:
// methods of the class
static const MyClass & findObject( int iKey ) {
if ( mapObjects.find( iKey ) == mapObjects.cend() )
mapObjects[iKey] = MyClass( iKey );

return mapObjects[iKey];
};

// deleted
MyClass() = delete;
MyClass( MyClass & ) = delete;
MyClass( MyClass && ) = delete;
MyClass( const MyClass & ) = delete;
MyClass( const MyClass && ) = delete;
MyClass & operator=( MyClass & ) = delete;
MyClass & operator=( const MyClass & ) = delete;
MyClass & operator=( const MyClass && ) = delete;

private:
// vars of the class
static map<int, MyClass> mapObjects;

// vars of instance
string some_heavy_payload;

// methods of instance
MyClass( int iKey ) {
some_heavy_payload = std::to_string( iKey );
};
MyClass & operator=( MyClass && src ) {
some_heavy_payload = std::move( src.some_heavy_payload );
return *this;
};
};

map<int, MyClass> MyClass::mapObjects;

int main() {
const MyClass & obj = MyClass::findObject( 1 );

return EXIT_SUCCESS;
};

这次我得到一个错误:“使用已删除的函数‘MyClass::MyClass()’”。我猜这是由 std::map 的“[]”运算符导致的,因为它试图调用 MyClass 的默认构造函数。

我怎样才能完成它?

最佳答案

如果您想锁定创建,只需将 key 传递给允许进入的每个人!

class MyClass {
class Key {
Key() = default;
friend class MyClass;
};
MyClass(MyClass const&) = delete;
MyClass& operator=(MyClass const&) = delete;
static map<int, MyClass> mapObjects;
public:
static MyClass const& findObject(int iKey) {
auto [iter, created] = mapObjects.try_emplace(iKey, Key(), iKey );
if (created)
std::cout << "New object has been created\n";
return iter->second;
};

MyClass(Key, int iKey)
: some_heavy_payload(std::to_string(iKey))
{}
private:
string some_heavy_payload;
};

关于c++ - 如何禁止在工厂方法之外创建/复制 obj?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56356914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com