(C ) Почему я видел, как некоторые программисты делали это с классами, когда меня учили разделять объявления и реализации?

#c #class #layout #conventions #declare

#c #класс #макет #соглашения #объявить

Вопрос:

Мне показали этот код, и он компилируется. Никаких сюрпризов, но почему это было организовано так, как это было? Почему нет class.cpp ? (Редактировать: я имею в виду не с точки зрения пробелов, я имею в виду с точки зрения размещения.)

 /// main.cpp ///
#include <iostream>
#include "class.h"

int main() {
    Pet a(4);
    double x;
    std::cout << "How much does this weigh? "; std::cin >> x;
    Pet b(x);
    Pet c(b);
    std::cout << "You have " << a.getTotal() << " pets." << std::endl;
    std::cout << "a weighs " << a.getWeight() << " pounds." << std::endl;
    std::cout << "b weighs " << b.getWeight() << " pounds." << std::endl;
    std::cout << "c weighs " << c.getWeight() << " pounds." << std::endl;
    return 0;
}
  
 /// class.h ///
#ifndef CLASS_H_
#define CLASS_H_

class Pet {
private:
    double weight;
    static int total;
public:
    Pet()                           { weight = 0; upTotal(); }
    Pet(double w)                   { weight = w; upTotal(); }
    Pet(const Petamp; that)            { this->weight = that.weight; upTotal(); }
    double getWeight()              { return weight; }
    void setWeight (double w)       { weight = w; }
    int getTotal()                  { return total; }
    void upTotal()                  {   total; }
    void downTotal()                { --total; }
};

int Pet::total = 0;

#endif // CLASS_H_
  

Мне сказали, что хорошей практикой является разделение объявлений классов на заголовочные файлы и оставлять внутренности для исходного файла. Но здесь эти функции определяются в заголовочном файле, а не просто объявляются.

После этого я больше не думал об этом, пока не заглянул в заголовочный файл, принадлежащий IDE для графических интерфейсов, и я вижу, что многие методы класса организованы точно так же. Почему это?

Комментарии:

1. Нет ничего плохого в том, что объявления используют встроенные определения для небольших методов по соображениям производительности. С Pet::total другой стороны, переменная была бы проблемой, если class.h бы когда-либо была включена в несколько .cpp файлов. Каждый .cpp получит свою собственную копию переменной, нарушая правило единого определения .

2. Если вы ленивы и / или это просто тривиальное определение, это нормально.

3. @RemyLebeau Как мне избежать этого при включении его в несколько .cpp файлов?

4. Неприятный код. Нет const корректности. getTotal должно быть static . Оператор присваивания, созданный компилятором, неадекватен. И так далее.

5. @Patricko’Brien: запись int Pet::total = 0; в одном cpp-файле.