Я работаю над созданием класса-оболочки для обеспечения функции RAII. оригинальный вариант использования следующим образом:RAII - хранить `void * &` или `void **`
void* tid(NULL);
OpenFunc(&tid);
CloseFunc(&tid);
После того как я Вводится новый класс-обертку, я ожидаю, что в будущем использование будет выглядеть следующим образом:
void* tid(NULL);
TTTA(tid);
или
TTTB(tid);
Вопрос :
Какая реализация TTTA
или TTTB
лучше? Или они все плохие, и, пожалуйста, представите лучшую.
Одна вещь, которую я озабоченность в том, что после того, как ресурс выделен, то id
будет доступен за пределами класса TTTA
или TTTB
до id
разрушается. Основываясь на моем понимании, мой дизайн не должен иметь побочного эффекта для этого.
Спасибо
class TTTA : boost::noncopyable
{
public:
explicit TTTA(void *id)
: m_id(id)
{
OpenFunc(&m_id); // third-party allocate resource API
}
~TTTA()
{
CloseFunc(&m_id); // third-party release resource API
}
private:
void* &m_id; // have to store the value in order to release in destructor
}
class TTTB : boost::noncopyable
{
public:
explicit TTTB(void *id)
: m_id(&id)
{
OpenFunc(m_id); // third-party allocate resource API
}
~TTTB()
{
CloseFunc(m_id); // third-party release resource API
}
private:
void** m_id; // have to store the value in order to release in destructor
}
// Передаем в сравнении указателей
class TTTD
{
public:
TTTD(int* id) // Take as reference, do not copy to stack.
: m_id(&id)
{
*m_id = new int(40);
}
private:
int** m_id;
};
class TTTC
{
public:
TTTC(int* &id)
: m_id(id)
{
m_id = new int(30);
}
private:
int* &m_id;
};
class TTTB
{
public:
TTTB(int* id)
: m_id(id)
{
m_id = new int(20);
}
private:
int* &m_id;
};
class TTTA
{
public:
TTTA(int** id)
: m_id(id)
{
*m_id = new int(10);
}
private:
int** m_id;
};
int main()
{
//////////////////////////////////////////////////////////////////////////
int *pA(NULL);
TTTA a(&pA);
cout << *pA << endl; // 10
//////////////////////////////////////////////////////////////////////////
int *pB(NULL);
TTTB b(pB);
//cout << *pB << endl; // wrong
//////////////////////////////////////////////////////////////////////////
int *pC(NULL);
TTTC c(pC);
cout << *pC << endl; // 30
//////////////////////////////////////////////////////////////////////////
int *pD(NULL);
TTTD d(pD);
cout << *pD << endl; // wrong
}
В C++ вы обычно используете ссылки для изменения объектов внутри функции. –
Основываясь на моем понимании, оба «TTTA» и «TTTB» эквивалентны. – q0987
Нет, один использует ссылку, другой использует указатель. –