Конструкторы по умолчанию все инкапсулированы в заголовочные файлы - PullRequest
1 голос
/ 05 октября 2011

Сегодня в моем классе у нас было упражнение по наследству.Мы должны были написать класс UnderGrad, унаследованный от класса Student, унаследованного от класса Person.

Person имел 3 переменные для класса: имя, адрес и день рождения.

У ученика был идентификационный номер, степень магистра и тип степени.

И, наконец, у старшекурсника были переменные предыдущей средней школы и кредиты.

Когда я писал заголовочный файл для каждого из классов,конструктор по умолчанию выглядел примерно так:

   //snippet from UnderGrad.h
 Undergrad(string nm = "", string add = "", string bday = "", int id = 0, string maj = "", string degtyp = "", string hs = "", int cred = 0) : Student(nm,add,bday,id,maj,degtyp) {

     highSchool = hs;
     credits = cred;
};


//snippet from Student.h
Student(string nm = "", string add = "", string bday = "", int id = 0, string maj = "", string degtyp = "") : Person(nm,add,bday){
     stuId = id;
     major = maj;
     degreeType = degtyp;
};

//snippet from Person.h
Person(string nm = "", string add = "", string bday = ""){
     name = nm;
     address = add;
     bDay = bday;
};

Мой профессор сказал, что это нечитабельно и что на самом деле это не так.

Мне было интересно, что не так с созданием конструкторов по умолчанию, этопуть?Что-то не так?Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Без использования контекста кода я бы изменил лишь несколько вещей в этих конструкторах.

  1. Я бы рассмотрел перемещение определений конструкторов в отдельные исходные файлы. Это позволит изменять определения, не вызывая перекомпиляцию остальной части вашего кода. Для небольших программ или очень простых конструкторов, которые вряд ли изменятся без изменения заголовка, это, вероятно, не стоит усилий.

  2. Я бы изменил определения конструкторов, чтобы использовать список инициализаторов членов вместо назначения членов в теле конструктора. (См. Ответ от Алса для объяснения).

  3. Я бы удалил точки с запятой в концах определений функций, они совершенно не нужны.

  4. Я бы разбил длинные конструкторы на несколько строк, чтобы избежать чрезмерно длинных строк кода (длинные строки могут не помещаться в вашем редакторе, и может быть сложно выполнять сравнения и слияния).

  5. Похоже, что у вас есть using namespace ::std или using ::std::string где-то в вашем заголовочном файле. Это плохая практика, потому что это означает, что к коду, включающему ваши заголовки, будет применен этот using. Это может изменить смысл клиентского кода или привести к неоднозначности клиентского кода и невозможности его компиляции. Я бы удалил using и вместо этого использовал бы полное имя для std::string.


Эти изменения введены в действие:

//snippet from UnderGrad.h
Undergrad(
    std::string nm = "",
    std::string add = "",
    std::string bday = "",
    int id = 0,
    std::string maj = "",
    std::string degtyp = "",
    std::string hs = "",
    int cred = 0) :
        Student(nm,add,bday,id,maj,degtyp),
        highSchool(hs),
        credits(cred)
{
}

//snippet from Student.h
Student(
    std::string nm = "",
    std::string add = "",
    std::string bday = "",
    int id = 0,
    std::string maj = "",
    std::string degtyp = "") :
      Person(nm,add,bday),
      stuId(id),
      major(maj),
      degreeType(degtyp)
{
}

//snippet from Person.h
Person(std::string nm = "", std::string add = "", std::string bday = "") :
    name(nm), address(add), bDay(bday)
{
}
0 голосов
/ 05 октября 2011

Семантически хорошо, хотя вы можете использовать инициализаторы для строк-членов вместо назначения каждой из них.

Стилистически, твои строки немного длинные, но это все, с чем я мог бы столкнуться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...