Я пытаюсь построить структуру с помощью конструктора и деструктора в C ++ (это плохая вещь? Должен ли я использовать класс вместо этого?), Потому что я не хотел бы писать ненужные 10 строк для удаления struct.member каждый раз, когда члены должны быть освобождены
Члены структуры в основном являются указателями на другие типы.
Однако, кроме того, что указатель члена является уникальным указателем, я также хочу иметь возможность назначить копию другого указателя указателю на член в структуре. Следовательно, если я попытаюсь освободить эту память внутри деструктора структуры, она может быть уже освобождена, что приведет к сбою. (особенно если скопированный указатель был из другого объекта той же структуры)
ptr для ptr-типов вместо ptr-типов в структуре также не решит проблему (я думаю), поскольку я также хочу позволить члену иметь возможность быть уникальным указателем на объект.
Возможное решение, о котором я подумал, состоит в том, чтобы иметь и ptr-to-ptr, и ptr, на который должен указывать ptr-to-ptr. Но это было бы довольно неэффективно.
Каким будет мое лучшее решение?
Я надеюсь (но сомневаюсь), что мой вопрос достаточно ясен.
Вот пример кода, который может помочь.
struct GraphicsDesc
{
public:
ID3D11VertexShader* pSolidColorVS;
ID3D11PixelShader* pSolidColorPS;
ID3D11InputLayout* pInputLayout;
ID3D11ShaderResourceView* pColorMap;
ID3D11SamplerState* pSampler;
ID3D11BlendState* pBlendState;
ID3D11Buffer* pVertexBuffer;
UINT VertexSize;
D3D_PRIMITIVE_TOPOLOGY Topology;
GraphicsDesc()
{
pSolidColorVS = nullptr;
pSolidColorPS = nullptr;
pInputLayout = nullptr;
pColorMap = nullptr;
pSampler = nullptr;
pBlendState = nullptr;
pVertexBuffer = nullptr;
VertexSize = 0;
Topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
}
virtual ~GraphicsDesc()
{
if (pVertexBuffer) {
pVertexBuffer->Release();
}
if (pBlendState) {
pBlendState->Release();
}
if (pSampler) {
pSampler->Release();
}
if (pColorMap) {
pColorMap->Release();
}
if (pInputLayout) {
pInputLayout->Release();
}
if (pSolidColorPS) {
pSolidColorPS->Release();
}
if (pSolidColorVS) {
pSolidColorVS->Release();
}
}
};