Как я могу получить ошибку компиляции при случайном построении? - PullRequest
7 голосов
/ 23 сентября 2010

Дано 2 класса:

...
class Grades{
public:
     Grades(int numExams) : _numExams(numExams){
        _grdArr = new double[numExams];
     }
     double GetAverage() const;
     ...
private: // The only data members of the class
     int _numExams;
     double *_grdArr;
};

class Student{
public:
     Student(Grades g) : _g(g){
     }
...
private: // The only data members of the class
     Grades _g;
};
...

И короткая основная программа:

int main(){
     int n = 5; // number of students
     Grades g(3); // Initial grade for all students
     // ... Initialization of g – assume that it's correct
     Student **s = new Student*[n]; // Assume allocation succeeded
     for (int it = 0 ; it < n ; ++it){
          Grades tempG = g;
          // ... Some modification of tempG – assume that it's correct
          s[it] = new Student(tempG);
     }
// ...
return 0;
}

Этот код работает нормально. Но по ошибке опечатка строка:

Grades tempG = g;

изменено на:

Grades tempG = n;

и все же он проходит компиляцию. Какое простое изменение я могу сделать в коде (коде main ()), чтобы получить ошибку компиляции из-за ошибки опечатки?

Ответы [ 2 ]

22 голосов
/ 23 сентября 2010

Это потому, что у Grades есть конструктор с одним аргументом, который действует как конструктор преобразования.Такой конструктор принимает аргумент int и создает объект типа Grades.

Поэтому компиляция выполнена успешно.

Сделайте явный конструктор класса '

explicit Grades(int numExams);

Это запретит

Grades g = 2;

, но разрешит все следующие действия

Grades g = Grades(2)  // direct initialization

Grades g = (Grades)2; // cast

Grades g = static_cast<Grades>(2);

Grades g(2);          // direct initialization.
4 голосов
/ 23 сентября 2010

Добавьте ключевое слово explicit в конструктор:

explicit Grades(int ...) ...
...