Я действительно не понимаю, почему я получаю ошибку при создании общего указателя класса шаблона - PullRequest
1 голос
/ 24 июня 2019

Я не понимаю сообщение об ошибке, которое я получаю, и я не знаю, как это исправить;

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;
}

сообщение об ошибке:

main.cpp: In function ‘int main()’:
main.cpp:10:25: error: cannot bind non-const lvalue reference of type ‘shared_pointer<int>&’ to an rvalue of type ‘shared_pointer<int>’
  shared_pointer<int> a= shared_pointer<int>(wsk);

In file included from main.cpp:2:0:
smartpp.cpp:14:2: note:   initializing argument 1 of ‘shared_pointer<T>::shared_pointer(shared_pointer<T>&) [with T = int]’
  shared_pointer( shared_pointer& a)

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Ваша проблема в функции конструктора копирования:

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++;
}
0 голосов
/ 24 июня 2019

Определить оператор присваивания перемещения

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

Есть много вещей, которые вам не хватает. Я перечислю некоторые.

~shared_pointer() не уменьшает счетчик ссылок. Из-за этого int* wsk=&b;: ваш dtor удалит указатель в стеке, вы НЕ ДОЛЖНЫ этого делать. howManyObjects не должно быть статичным. Это также должно быть изменено атомарно, если вы заботитесь о безопасности потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...