我真的不明白为什么我在创建模板类共享指针时收到错误消息

时间:2019-06-24 18:07:46

标签: c++ pointers

我不明白即时消息,我也不知道该如何解决;

y=A*x1 + B*x2 + C*x3 + D

错误消息:

template<typename T>
class shared_pointer
{
    private:
        static int howManyObjects;
        T* pointer;
    public:
        shared_pointer( T* p=nullptr)
        {
            pointer=p;
        }
        shared_pointer( shared_pointer& a)
        {
            a.pointer=this->pointer;
            howManyObjects++;
        }
        ~shared_pointer()
        {
            if(howManyObjects==1) delete pointer;
        }

        T& operator *()
        {
            return *pointer;
        }
        T* operator ->()
        {
            return pointer;
        }
};
template<typename T>
int shared_pointer<T>::howManyObjects=0;

int main()
{
    int b=5;
    int* wsk=&b;
    shared_pointer<int> a= shared_pointer<int>(wsk);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您的问题出在复制构造函数中:

shared_pointer( shared_pointer& a)
{
    a.pointer = this->pointer;
    howManyObjects++;
}

因此,根据参数a之前的空格,您可能知道根据复制构造函数规则它必须是const。但是,当您尝试在其中放置const时,出现以下错误:

shared_pointer(const shared_pointer& a)
{
    a.pointer = this->pointer; // Compilation error: assignment of member ‘shared_pointer<int>::pointer’ in read-only object
    howManyObjects++;
}

因此,您尝试删除了const,并在帖子中看到了所显示的错误。问题不是您尝试放入的const,而是分配方向。您不想修改参数值,而是当前对象的值。将复制构造函数更改为以下内容,一切都会很好:

shared_pointer(const shared_pointer& a)
{
    this->pointer = a.pointer; // Pay attention that this get the value of a, and not the opposite.
    howManyObjects++;
}

答案 1 :(得分:0)

定义移动分配运算符

shared_pointer& operator=(shared_pointer&& other)
{
    pointer = other.pointer;
    return *this;
}

您缺少很多东西。我列出了一些。

~shared_pointer()不会减少引用计数。 因此,int* wsk=&b;:您的dtor将删除堆栈中的指针,您不应这样做。 howManyObjects不应为静态。如果您关心线程安全性,也应该对其进行原子更改。