程序错误,由于在VS2010中使用std::unique_ptr

Program Error, Due to the use of std::unique_ptr in VS2010?

本文关键字:std unique ptr 错误 VS2010 程序      更新时间:2023-10-16

我一直在写一个程序,当达到最大大小时,数组将动态增长。我使用了std::unique_ptr,但我不确定是什么原因导致了错误。我正在使用VS2010。

错误为:
错误C2027:使用未定义的类型"DyArray::Impl"c:\program files(x86)\microsoft visual studio 10.0\vc\include\memory 2067

这是代码

DyArray.h

#pragma once
#include <iostream>
#include <memory>
class DyArray
{
public:
    DyArray(int IntialSize, int IncrementSize)
    {
    }
    ~DyArray()
    {
    }
    void Insert(int Data);
    void Set(int Position,int Data);
    int Get(int Position);
    void Print();
private:
    DyArray(const DyArray&);
    DyArray& operator=(const DyArray&);
    struct Impl;
    std::unique_ptr<Impl> m_Impl;
};

DyArray.cpp

#include "LinkedList.h"
#include <iostream>
struct DyArray::Impl
{
    typedef struct
    {
        int* array;
        size_t used;
        size_t size;
    }Array;
public:
    Array* m_DyArray;
    size_t m_InitalSize;
    size_t m_IncrementSize;
    Impl(Array* DyArray,int IntialSize,int IncrementSize):m_DyArray(DyArray),m_InitalSize(IntialSize),m_IncrementSize(IncrementSize)
    {
        m_DyArray->array = (int*)malloc(m_InitalSize * sizeof(int));
        m_DyArray->used = 0;
        m_DyArray->size = m_InitalSize;
    }
    ~Impl()
    {
        free(m_DyArray->array);
        m_DyArray->array = NULL;
        m_DyArray->used = m_DyArray->size = 0;
    }
    void insertArray(int element)
    {
        if (m_DyArray->used == m_DyArray->size)
        {
            m_DyArray->size += m_IncrementSize;
            m_DyArray->array = (int*)realloc(m_DyArray->array,m_DyArray->size*sizeof(int));
        }
        m_DyArray->array[m_DyArray->used++] = element;
    }
    void Display()
    {
        std::cout<<"n";
        for (int i = 0; i< m_DyArray->used;i++)
        {
            std::cout<<m_DyArray->array[i]<<" ";
        }
    }
};
void DyArray::Insert( int Data )
{
    m_Impl->insertArray(Data);
}
void DyArray::Print()
{
    m_Impl->Display();
}

Main.cpp

#include "DyArray.h"
#include <iostream>
void main()
{
    DyArray dyarray(2,3);
    dyarray.Insert(12);
    dyarray.Insert(14);
    dyarray.Insert(55);
    dyarray.Insert(23);
    dyarray.Insert(444);
    dyarray.Insert(23);
    dyarray.Print();
}

类的析构函数需要销毁唯一指针,而该指针又需要删除它管理的Impl。只有当Impl是一个完整的(即完全定义的)类型时,它才能做到这一点。

在源文件中定义析构函数,在Impl的定义之后,而不是在类定义中。

如果您希望它创建一个Impl并初始化指针,您还需要在那里定义构造函数。