Два способа инициализации класса? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть некоторые концептуальные проблемы с классами, и я хочу убедиться, что все делаю правильно.

Я программирую на Arduino и использую некоторые библиотеки для своего проекта. Библиотеки реализуют класс, который я могу создать в своем проекте.

Например, библиотека AdafruitMotorShieldV2 реализует класс Adafruit_MotorShield, и в этом примере они создают экземпляр класса в переменной AFMS. Пока все ясно.

#include <Adafruit_MotorShield.h>

// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

Однако я придумал и другие библиотеки, такие как DeadReckoner, где в примере класс создается как:

#include <DeadReckoner.h>
DeadReckoner deadReckoner(&leftTicks, &rightTicks, TICKS_PER_REV, RADIUS, LENGTH);

Здесь я не уверен, что происходит.

DeadReckoner (заглавные буквы) - это имя класса и, конечно же, имя конструктора. Я предполагаю, что deadReckoner (подчеркивание) - это переменная, в которой создается экземпляр DeadReckoner, но почему вызов отличается от вызова библиотеки Adafruit?

Другими словами: эквивалентны ли эти два вызова?

DeadReckoner deadReckoner(&leftTicks, &rightTicks, TICKS_PER_REV, RADIUS, LENGTH);
DeadReckoner deadReckoner = DeadReckoner(&leftTicks, &rightTicks, TICKS_PER_REV, RADIUS, LENGTH);

Это соответствующий код внутри DeadReckoner.h, если необходимо

class DeadReckoner {

public:
    DeadReckoner(volatile unsigned long *, volatile unsigned long *, unsigned long, unsigned long, int, double, double);
    // other methods of the class
}

1 Ответ

0 голосов
/ 28 мая 2020

в первую очередь вы должны изменить метку с C на C ++

первый - это подрядчик DeadReckoner, который получает некоторые ссылки в качестве параметров.

второй - оператор присваивания DeadReckoner, который получает Результат подрядчика DeadReckoner. посмотрите на h-файл, вы найдете подпись, похожую на эту: DeadReckoner & DeadReckoner :: operator = (const DeadReckoner &)

результат двух строк будет одинаковым, но первая строка создает объект DeadReckoner . в то время как второй создает объект DeadReckoner, он использует оператор присваивания, чтобы скопировать его в другой объект DeadReckoner.

...