类内成员初始化是否删除赋值运算符?

时间:2016-02-06 01:20:56

标签: c++ c++11 constructor

所以我正在做一个包含Student,Address和Transcript课程的项目。

学生构造函数如下:

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构造函数出了问题。但是指令是将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;
};

2 个答案:

答案 0 :(得分: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类成员({1}}都由B的构造函数&#39构建; s 初始化列表,在评论指示的位置。

到时候" a = A();"发生了,a已经构建,a=A();调用了A的赋值运算符。

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

但是,显然你想要声明一个静态const类成员,在这种情况下:

static const int MAX_STUDENT_COUNT = 50;

这可能是您的类的赋值运算符(不是构造函数)已被删除,并且您收到此错误的原因。

答案 1 :(得分:0)

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

可能是这样的:

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

大多数C ++类实际上并不需要构造函数体中的任何内容,因为它们的所有成员都是以这种方式初始化的。