C ++ классы могут быть переданы только по ссылке - PullRequest
1 голос
/ 10 марта 2012

Могу ли я сделать так, чтобы мой пользовательский класс передавался только по ссылке?

В основном у меня есть следующий класс:

class A{
private:
  int _x;
public:
  A(int y){
    _x = y;
  }
};

Могу ли я сделать это туда, где я могу ТОЛЬКО передать его по ссылке? И в противном случае он выдаст ошибку времени компиляции?

Ответы [ 3 ]

10 голосов
/ 10 марта 2012

Вы можете предотвратить копирование, объявив конструктор копирования закрытым (или удаленным в C ++ 11).

3 голосов
/ 10 марта 2012

Несколько человек предложили сделать конструктор копирования закрытым. Это в основном хорошее решение проблемы, однако оно не является полным. Это все еще позволяет самому типу случайно передавать себя по значению. Более полное решение - объявить конструктор копирования закрытым, а затем никогда не реализовывать его.

class A{
private:
  // Prevent value copying
  A(const A&);

  int _x;
public:
  A(int y){
    _x = y;
  }
};

Примечание. Как указывает @DeadMG, в C ++ 11 использование delete является предпочтительным.

A(const A&) = delete;
2 голосов
/ 10 марта 2012

Да, объявление частного конструктора копирования (но все еще его реализация) позволяет дружественным функциям или дочерним классам по-прежнему использовать приватную функцию / члены класса, поэтому конструктор копирования по-прежнему будет доступен.Вот почему вы объявляете это частным и не реализуете его.

...