2013-09-19 6 views
0

Я получаю ошибки компиляции для приведенного ниже кода, но тот же компилируется, если я удаляю инструкцию конструктора экземпляра.Определенный пользователем Копировать конструктор

Не мог бы сообщить мне об этом?

class MyClass 
{ 
    private: 
     int i; 
     MyClass(MyClass &); 
    public: 
     MyClass():i(0){} 
}; 

int main(){ 
    MyClass obj = MyClass(); 
    return 0; 
} 

Ошибка:

MyClass.cpp: In function ‘int main()’: MyClass.cpp:15:24: error: no matching function for call to ‘MyClass::MyClass(MyClass)’ MyClass.cpp:15:24: note: candidates are: MyClass.cpp:11:2: note: MyClass::MyClass(MyClass&) MyClass.cpp:11:2: note: no known conversion for argument 1 from ‘MyClass’ to ‘MyClass&’ MyClass.cpp:10:2: note: MyClass::MyClass() MyClass.cpp:10:2: note: candidate expects 0 arguments, 1 provided 
+4

Какое сообщение об ошибке? –

ответ

3

Это потому, что конструктор копирования является приватным и вы не реализовали его. вы публикуете его и реализуете. Вы также забудете const.

class MyClass 
{ 
private: 
    int i; 
public: 
    MyClass():i(0){} 
    MyClass(MyClass const & o){ i = o.i; } 
}; 

int main(){ 
    MyClass obj = MyClass(); 
    return 0; 
} 
+0

спасибо. Я добавляю это. –

+0

GCC 'gcc version 4.4.5 20110214' –

+0

@ user2797318, вы забыли' const' в своем конструкторе копирования. –

0

Частного невыполненными конструктор копирования используется, когда программист хочет, чтобы вы знаете, будущие программист, что они не намерены этот объект должен быть скопирован. Хотя это более распространено также включать в себя конструктор копирования в приватной секции также не реализован, как это

private: 
    obj(const obj& o); 
    obj& operator=(const obj& o); 
public: 
    obj(...) 
    { 
     ... 
    } 

Если вы получаете ошибки, потому что вы используете класс библиотеки, который имеет приватный конструктор копирования, и вы пытаетесь чтобы скопировать объект, вызвав ошибку компилятора

error C2248: 'obj::obj' : cannot access private member declared in class 'obj' 
error C2248: 'obj::operator =' : cannot access private member declared in class 'obj' 

тогда вы не пользуетесь классом по назначению.

Если вы делаете объект самостоятельно и хотите его скопировать, вам необходимо реализовать публичный конструктор, конструктор копирования и оператор присваивания, а затем предоставить код для реализации всех трех функций.

Смежные вопросы