2016-02-06 28 views
3

所以我正在做一个有学生,地址和成绩单类的项目。类内成员初始化是否删除赋值运算符?

学生的构造函数如下:

Student::Student(int eid, string first, string last, Address campusAddress, 
       Transcript transcript) 
{ 
    setEID(eid); 
    setFirst(first); 
    setLast(last); 
    setAddress(campusAddress); 
    this->transcript = transcript; //error that says: 
    "Transcript::operator=(const Transcript&)" (declared implicitly) cannot be referenced 
    -- it is a deleted function. 
} 

所以我想的东西是错了我的成绩单构造。但是这些指令是将Transcript的默认构造函数清空,除了初始化变量courseCount为0.(该程序从文件中读取学生数据并将课程添加到学生成绩单中)。

我一直坚持一段时间任何人都可以帮助如何解决这个删除的函数错误?

下面是谈话的构造函数,如果你需要它:

Transcript::Transcript() 
{ 
    courseCount = 0; 
} 

编辑:成绩单原型

class Transcript 
{ 
    public: 
     //Constructor 
     Transcript(); 

     double computeGPA() const; 
     void addCourse(const string& course, const int hours, const string& grade); 
     string getCourse(int index) const; 
     string getGradeEarned(const int index) const; 
     int getCourseCreditHours(const int index) const; 
     int count() const; 

     string toString() const; 

    private: 
     const int MAX_STUDENT_COUNT = 50; 
     string courseTaken[50]; 
     int courseCreditHours[50]; 
     string gradeEarned[50]; 
     int courseCount = 0; 

     int computeTotalCreditHours() const; 
     int computeTotalQualityPoints() const; 
}; 
+0

您是否熟悉赋值运算符的概念?你能向我们展示成绩单的代码吗? – templatetypedef

+0

也许你应该发布'Transcript'类的原型。 – cxxl

+0

错误信息非常清楚,你需要实现“operator =”,顺便说一句,如果你使用C++ 11,你可以使用std :: move如果你实现了“&&移动拷贝构造函数” – kaitian521

回答

4

这有什么好做Transcript的构造。在报告错误的时候,Transcript类成员没有被构建。它已经建成。

class A { 

public: 

    A() {} 

    // ... 

}; 

class B { 

    int c; 
    A a; 

public: 

    B() : c(0) // a gets constructed at this point 
    { 
     a=A(); 
    } 
}; 

这是一个类似于您的情况的例子。当构造B的实例时,B的所有类成员(包括a)都由B的构造函数的初始化列表构建,并在注释指示的位置构建。

当时“a = A();”发生,a已经被构建,a=A();调用A的赋值运算符。

因为您的Transcript类具有const类成员,所以它不能有默认的赋值运算符。默认的赋值操作符实际上是逐个分配每个类成员,但由于其中一个类成员是const,因此无法分配,因此应该实现自己的赋值操作符。

但是,很明显,你的意思是声明静态常量类成员,在这种情况下:

static const int MAX_STUDENT_COUNT = 50; 

这可能是为什么你的类的赋值运算符(不是构造)已被删除的原因,你得到这个错误。

+0

感谢它的工作!你救了我的屁股 –

0

使用构造函数初始化列表。

大概是这样的:

Student::Student(int eid, string first, string last, Address campusAddress, Transcript transcript) : 
    eid(eid), first(first), last(last), address(campusAddress), transcript(transcript) { 
} 

大多数C++类实际上并不需要在构造函数的身体任何东西,因为他们所有的成员都被初始化这种方式。