2012-03-09 4 views
1

Есть ли способ, которым я могу передать свой собственный класс только по ссылке?классы C++ могут передаваться только по ссылке

В принципе, у меня есть следующий класс:

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

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

+2

Да, сделайте его конструктор копирования закрытым. –

ответ

3

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

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; 
+0

Я никогда не предлагал * реализовать * конструктор копирования. – Puppy

10

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

+1

Или в pre-C++ 11 наследуется от 'boost :: noncopyable'. –

2

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

+0

+1 для упоминания друга. – innochenti