Как выполнить этот вызов функции - PullRequest
0 голосов
/ 21 июня 2019

Учитывая два операнда

Eigen::Quaterniond eigen_quat;  
tf::Quaternion tf_quat;

И функция

void tf::quaternionEigenToTF (const Eigen::Quaterniond &e, tf::Quaternion &t)

Как вы выполняете вызов функции?

Я ищу простую строку кода, которая служит примером того, как выполнить вызов функции; сейчас немного запутался с *, &, const и т. д. Не стесняйтесь редактировать заголовок вопроса.

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Что такое &?

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

void addOne(int& i) {
    i += 1; 
}

int main() {
    int x = 10; 

    addOne(x); // increments x by one

    std::cout << x << std::endl; // Prints 11
}

Поскольку мы взяли x по ссылке, когда мы изменили x внутри функции, было изменено и исходное значение x.

Что такое const?

Когда переменная объявлена ​​как const, это означает, что вы не можете ее изменить. Например:

const int x = 5;

x = 6; // ERROR: can't modify a const variable

Если у вас есть ссылка const, это означает, что это ссылка на переменную, но вы не можете изменить переменную с помощью этой ссылки. Например:

int x = 4;

x++; // It's fine to modify x

const int& x_ref = x; // Get a const reference to x

x_ref++; //Can't modify x_ref: x_ref is const

Зачем использовать const ref в качестве параметра функции?

Вы должны использовать ссылку const в качестве параметра функции, когда у вас есть объект, который дорого копировать, но вы хотите гарантировать, что он не будет изменен функцией, которой вы его передаете.

Функция, которую вы дали, принимает Eigen::Quaterniond по ссылке, избегая копирования, но гарантирует пользователю, что объект Eigen::Quaternoind не будет изменен функцией.

void tf::quaternionEigenToTF (const Eigen::Quaterniond &e, tf::Quaternion &t)

Как мне это назвать?

Вы можете вызвать его как любую другую функцию:

igen::Quaterniond eigen_quat;  
tf::Quaternion tf_quat;

// Call the function
tf::quaternionEigenToTF (eigen_quat, tf_quat); 
1 голос
/ 21 июня 2019

Ссылка - & - это как если бы вы давали две переменные разным концам одной и той же палки. Они оба выглядят по-разному, но на самом деле под ними одно и то же. Вы используете его, как обычную переменную:

    int var{10};
    int & same_var = var; // Reference to var
    std::cout << same_var << std::endl; // Prints 10
    same_var += 10; // Both same_var and var get modified,
                    // as they're both sharing the same state
    std::cout << same_var << std::endl; // Prints 20

Указатель - * - Этот плохой парень - новый блок памяти, в котором содержится адрес того, на что он указывает. Вы можете получить ссылку (&) на объект, на который он указывает, разыменовав его:

    int var {1};
    int * ptr = &var; // Take the address of var, store it in a pointer
    std::cout << *ptr << std::endl; // Dereference the pointer - prints '1'

Теперь, когда вы можете увидеть, как мы создаем указатели и ссылки, вы можете посмотреть на вызов этой функции.

void tf::quaternionEigenToTF (const Eigen::Quaterniond &e, tf::Quaternion &t)

Эта функция принимает 2 параметра, одну константную ссылку Eigen :: Quaterniond и одну ссылку tf :: Quaternion.

Оба эти объекта являются ссылками, поэтому, как мы видели выше, они представляют собой разные имена для одних и тех же объектов, eigen_quat и tf_quat в вашем случае.

Спецификатор const означает, что функция обещает не редактировать состояние передаваемого вами объекта (компилятор обеспечивает это, не позволяя ему вызывать какие-либо неконстантные функции-члены для объекта const).

Итак, давайте приступим к делу!

Путем небольшого количества волшебного копирования-вставки из 1019 * ответа 0x499602D2:

quaternionEigenToTF( eigen_quat, tf_quat )

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

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