Простите меня, если это уже было задано, я не нашел ответов на свой конкретный вопрос.Ограничение доступа к конструктору и деструктору C++
У меня есть класс в библиотеке Я делаю это, чтобы определенные классы могли создавать и уничтожать, а другие классы - иметь доступ к другим публичным функциям. Наличие friend class
не то, что я хочу, так как класс friend получит доступ к переменным-членам и функциям-членам, которых я не хочу. Я наткнулся на this idiom, который почти работает, за исключением деструктора, поскольку он не может принимать дополнительные параметры. С этой идиомой, я получаю:
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
иметь доступ к деструктору.
В то время как ни одна из вышеперечисленных проблем не является нарушителем транзакций на любом участке, поскольку я всегда могу просто сделать ctor и dtor public и просто сказать «RTFM».
Мой вопрос:
Есть какой-то способ, чтобы ограничить доступ к CTOR и dtor конкретных классов (но только CTOR и dtor), придерживаясь более хорошо известный синтаксис (имеющий вещи быть на стек, если люди хотят, уничтожая через удаление и т. д.)?
Любая помощь очень ценится!
РЕШЕНИЕ
в 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; }
В качестве альтернативы, если DeletableA
класса необходим в B.h
или A.h
(из-за встраивание, шаблоны, или желание иметь все class A
связанные классы в A.h
), он может быть перемещен туда с «ключом доступа» на конструкторе так нет другие классы могут его создать. Несмотря на то, что деструктор будет выставлен, ни один другой класс никогда не получит DeletableA
для удаления.
Очевидно, что это решение требует, чтобы class B
знать, чтобы сделать экземпляры Deletable A
(или сделать класс в целом, если она не подвергаются в A.h
) и хранить только A*
, которые подвергаются через общественные функции, но, это самое которая была предложена.
Пока еще возможно для некоторых других классов, чтобы сделать подкласс class A
(с class A
не является «окончательным»), вы можете добавить еще один «ключ» передать в конструктор А, чтобы предотвратить такое поведение, если вы хотите.
Это много вопросов в одном вопросе. – 101010
Не имеет ли частный деструктор немного рывок? «Вот объект, вы не можете его удалить». – tadman
Ну, это концептуально один вопрос, но несколько подробный. Хотите, чтобы я укоротил его? Я отредактирую, чтобы сократить его. – EncodedNybble