2015-08-18 2 views
1

Из кода ниже, составляемые в CodeBlocks я получаю ошибки в таком роде:C++ Массив объектов с копией конструктора

no matching function for call to 'student::student(student)' candidates are: 
student::student(student&) 
    no known conversion for argument 1 from 'student' to 'student&' 
student::student(std::string, int, double, float) 
    candidate expects 4 arguments, 1 provided 

Я предполагаю, что так или иначе компилятор C++ реализует конструктор копирования в определении массива. Но я не могу найти способ обойти это. Мне нужны оба конструктора в моей программе, и мне нужно инициализировать элементы массива через конструктор. Пожалуйста, предоставьте решение, которое будет работать на C++ 11.

#include <iostream> 
#include <string> 
using namespace std; 

class student{ 
    string name; 
    int rollno; 
    double marks; 
    float per; 
    /// Constructors 
    student(string n, int r, double m, float p){ 
     name = n; 
     rollno = r; 
     marks = m; 
     per = p; 
    } 
    student(student& s){ 
     name = s.name; 
     rollno = s.rollno; 
     marks = s.marks; 
     per = s.per; 
    } 
}; 

int main(){ 
    student arrays[] = { student("Anas Ayubi", 80, 980, 980/1100), 
        student("Zainab Ashraf", 78, 990, 990/1100), 
        student("Wali Ahmed", 28, 890, 890/1100) }; 
} 

ответ

4
student(student& s){ 

Ваш конструктор копий принимает свой аргумент посредством ссылки не const. Неконстантные ссылки не могут связываться с rvalues. Затем вы идете на, чтобы попытаться создать копии rvalues:

student arrays[] = { student("Anas Ayubi", 80, 980, 980/1100), 
       student("Zainab Ashraf", 78, 990, 990/1100), 
       student("Wali Ahmed", 28, 890, 890/1100) }; 

Простые исправить это объявить конструктор копирования взять референтные к-сопзИте, который может связываться с rvalues:

student (const student& s){ 

Обратите внимание, что в 980/1100 вы получаете целочисленное деление вместо деления с плавающей запятой, так что вы просто получите 0. Чтобы исправить это, заставьте те int s быть double s: 980.0/1100.

Кстати, в C++ 11 можно упростить инициализацию массива следующим образом:

student arrays[] = { {"Anas Ayubi", 80, 980, 980.0/1100}, 
        {"Zainab Ashraf", 78, 990, 990.0/1100}, 
        {"Wali Ahmed", 28, 890, 890.0/1100} }; 
+0

Спасибо за отличный ответ! Когда я пытаюсь отобразить поле «per» в программе элементов в массиве, оно отображает значение 0. Почему это происходит? –

+0

@AnasAyubi '980' и' 1100' являются как 'int', поэтому происходит целочисленное деление, а не деление с плавающей запятой. Вероятно, вы хотите что-то вроде '980.0/1100'. – TartanLlama

2

Следует student(const student& s) - отметить сопзЬ - правильное подпись конструктора копирования.

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

+0

Что вы имеете в виду временный? –

+0

'student (/*...*/)' создает временный объект, который используется для заполнения массива путем его копирования. – TartanLlama

+0

Разве это не очень неэффективный способ хранения объектов в массиве? Можем ли мы как-нибудь избежать копирования? –

1

Ваш конструктор копирования должен принять свой параметр на const, поэтому он может привязываться к временным параметрам, которые вы предоставляете.

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