C ++, я могу перегрузить оператор присваивания точки класса? - PullRequest
0 голосов
/ 13 ноября 2018

Можно перегрузить оператор присваивания класса A, но не уверен, разрешено ли перегрузить оператор присваивания типа указателя класса A. законный вопрос или нет ...? Если да, то как?

Например, я хотел бы сделать ref_count ++ всякий раз, когда у нас есть указатель на него ниже.

class A{
   public:
         A(){}
         ~A(){}
         int ref_count{0};
}

main()
{
        A* a1 = new A();   //line 1
        A* a2 = a1;       //line 2
 }

После выполнения строки 1 A.ref_count равно 1 После выполнения строки 2 A.ref_count равен 2

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Похоже, вы не указатель с подсчетом ссылок.Сначала давайте рассмотрим, почему ваше решение не работает:

  1. Здесь: A* a1 = new A(); вы делаете присвоение указателя, не назначение класса.Вы не можете перегрузить эту операцию.
  2. В вашем определении Class A вы используете подсчет ссылок.Это не хорошее решение, что если вам нужен новый класс (Class B), который также требует подсчета ссылок?Вы должны реализовать это снова и снова.Это не красиво или многократно.

Итак, что мы можем сделать?Ну, это зависит от того, почему вы не хотите подсчитывать ссылки.Кажется, ты не хочешь управлять памятью.Fortunatley, C ++ предоставляет конструкцию для этого уже.Это std::shared_ptr.Вы можете использовать это так:

{
  std::shared_ptr<A> a1 = std::make_shared<A>(); // Reference count is set at 1
  {
    std::shared_ptr<A> a2 = a1; // Reference count is incremented to 2
  } // Reference count is decremented to 1
} // Reference count is decremented to 0 and the memory is released.
0 голосов
/ 13 ноября 2018

Я полагаю, вы имеете в виду присвоение указателя. Краткий ответ: нет , вы не можете.

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