如果这个问题已经被问到了,请原谅我,我没有找到对我的具体问题的答案。
我正在制作一个库中的类,我希望某些类能够创建和销毁,而其他类则可以访问其他公共函数。使用 friend class
也不是我想要的,因为友元类将获得访问成员变量和成员函数的权限,而我不希望它们这样做。我偶然发现了这个习语,它几乎可以实现我想要的功能,但析构函数由于不能接受额外的参数而无法使用。使用该习语,我获得:
class B;
class A
{
public:
class LifecycleKey
{
private:
LifecycleKey() {}
friend class B;
};
A(LifecycleKey); // Now only class B can call this
// Other public functions
private:
~A(); // But how can I get class B to have access to this?
void somePrivateFunction();
// Members and other private functions
};
正如上述代码所提到的,该解决方案不允许只有
class B
可以访问析构函数。虽然以上问题都不是致命的问题,因为我可以将构造函数和析构函数设为公共,然后说“RTFM”。
我的问题是:
是否有一种方法可以限制对特定类的构造函数和析构函数的访问(但仅限于构造函数和析构函数),同时遵循更为常见的语法(如果人们想要在堆栈上放置东西,则通过delete进行销毁等)?
非常感谢任何帮助!
解决方案:
在
A.h
中。class B;
class A
{
protected:
A() {}
virtual ~A() {}
A(const A&); // Implement if needed
A(A&&); // Implement if needed
public:
// Public functions
private:
void somePrivateFunction();
// Members and other private functions
};
在B.h
中
class B
{
public:
B();
~B();
const A* getA() const;
private:
A* m_a;
}
在B.cpp
中
namespace {
class DeletableA : public A {
public:
DeletableA() : A() {}
DeletableA(const DeletableA&); // Implement if needed
DeletableA(DeletableA&&); // Implement if needed
~DeletableA() {}
}
}
#include B.h
B::B() : m_a(new DeletableA()) {}
B::~B() { delete static_cast<DeletableA*>(m_a); }
const A* B::getA() const { return m_a; }
另外,如果需要在B.h
或A.h
中使用 DeletableA
类(由于内联、模板化或希望所有与class A
相关的类都在A.h
中),可以在构造函数上使用 "pass key" 将其移动到那里,以便没有其他类可以创建它。即使析构函数将被公开,也不会有其他类获得 DeletableA
去删除。
显然,这种解决方案要求 class B
知道如何创建 Deletable A
实例(或者如果在 A.h
中未公开,则知道如何创建该类)并仅存储通过公共函数公开的 A*
,但是,这是建议中最灵活的设置。
虽然某些其他类仍然可以创建 class A
的子类(因为 class A
不是“final”),但是您可以在A的构造函数中添加另一个“pass key”来阻止这种行为,如果您愿意。
LifecycleKey
应该定义为默认构造函数= default;
而不是{}
。另外,通过隐藏析构函数,你解决了什么问题? - Deduplicator