具有复制构造函数的 C++ 对象数组
C++ Array of Objects with a copy constructor
从下面在 CodeBlocks 中编译的代码中,我得到了这种类型的错误:
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) };
}
应该是 student(const student& s)
- 注意 const - 复制构造函数的正确签名。
这是因为您试图将临时对象绑定到引用,在这种情况下需要常量引用。
您的复制构造函数应通过 const
引用获取其参数,以便它可以绑定到您提供的临时对象。
student(student& s){
您的复制构造函数通过非常量引用获取其参数。非常量引用不能绑定到右值。然后您继续尝试创建右值的副本:
student arrays[] = { student("Anas Ayubi", 80, 980, 980/1100),
student("Zainab Ashraf", 78, 990, 990/1100 ),
student("Wali Ahmed", 28, 890, 890/1100) };
解决这个问题的简单方法是声明复制构造函数采用常量引用,可以绑定到右值:
student (const student& s){
请注意,在 980/1100
中,您得到的是整数除法而不是浮点除法,因此您只会得到 0
。要解决此问题,请将 int
强制为 double
: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} };
从下面在 CodeBlocks 中编译的代码中,我得到了这种类型的错误:
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) };
}
应该是 student(const student& s)
- 注意 const - 复制构造函数的正确签名。
这是因为您试图将临时对象绑定到引用,在这种情况下需要常量引用。
您的复制构造函数应通过 const
引用获取其参数,以便它可以绑定到您提供的临时对象。
student(student& s){
您的复制构造函数通过非常量引用获取其参数。非常量引用不能绑定到右值。然后您继续尝试创建右值的副本:
student arrays[] = { student("Anas Ayubi", 80, 980, 980/1100),
student("Zainab Ashraf", 78, 990, 990/1100 ),
student("Wali Ahmed", 28, 890, 890/1100) };
解决这个问题的简单方法是声明复制构造函数采用常量引用,可以绑定到右值:
student (const student& s){
请注意,在 980/1100
中,您得到的是整数除法而不是浮点除法,因此您只会得到 0
。要解决此问题,请将 int
强制为 double
: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} };