Рефакторинг: Move (F6) в CLion — почему это так работает?

У меня в main.cpp есть эта функция:

double median(double values[], int count) {
int i, j, n = count, t;
for (i = 1 ; i <= n - 1 ; i++)
{
for (j = 1 ; j <= n - i ; j++)
{
if (values[j] <= values[j + 1])
{
t = (int) values[j];
values[j] = values[j + 1];
values[j + 1] = t;
}
}
}
if ( n % 2 == 0)
return (values[n / 2] + values[n / 2 + 1]) / 2.0 ;
else
return values[n / 2 + 1];
}

и я хочу переместить эту функцию в другой файл. Итак, я нажимаю на эту функцию и затем нажимаю F6, а затем я пишу имя файла, например. MathFunctions и тогда я получаю:

MathFunctions.h:

#ifndef PROJECT_NAME_MATHFUNCTIONS_H
#define PROJECT_NAME_MATHFUNCTIONS_H

#endif //PROJECT_NAME_MATHFUNCTIONS_H

MathFunctions.cpp:

#include "MathFunctions.h"
double median(double values[], int count) {
int i, j, n = count, t;
for (i = 1 ; i <= n - 1 ; i++)
{
for (j = 1 ; j <= n - i ; j++)
{
if (values[j] <= values[j + 1])
{
t = (int) values[j];
values[j] = values[j + 1];
values[j + 1] = t;
}
}
}
if ( n % 2 == 0)
return (values[n / 2] + values[n / 2 + 1]) / 2.0 ;
else
return values[n / 2 + 1];
}

Я новичок в C ++, и я не понимаю, почему это так работает. Я бы предпочел, чтобы он поместил объявления методов, таких как:

double median(double values[], int count);

В файле * .h и внутреннюю часть метода в файле * .cpp, а затем включите файл * .h в мой main.cpp следующим образом:

#include "MathFunctions.h"

Может кто-нибудь объяснить мне, почему это так работает? Что я должен делать с файлами, созданными CLion? Должен ли я включить MathFunctions.cpp вместо файла заголовка в моем main.cpp?

0

Решение

К сожалению, это ошибка CLion, отслеживаемая https://youtrack.jetbrains.com/issue/CPP-9329, пожалуйста, создайте учетную запись Jetbrains и проголосуйте за эту проблему.

Я не уверен, что вы подразумеваете под «обходным путем». Чтобы ваш код работал, вам нужно

  1. Создайте объявление функции для double median(double values[], int count); в MathFunctions.h включить файл.
  2. В вашем main.cpp, добавлять #include "MathFunctions.h как вы упомянули
  3. В CMakeLists.txt (а это не специфично для CLion, вам необходимо знать основы CMake), добавьте файл MathFunctions.cpp к списку исходных файлов для вашего исполняемого файла.

Например, если у вас есть созданный в CLion файл CMakeLists.txt, у вас должно быть что-то похожее на

set(SOURCE_FILES main.cpp MathFunctions.cpp)
add_executable(foo ${SOURCE_FILES})

Некоторые другие случайные комментарии:

  • median() это не «метод», это «функция» или, точнее, «автономная функция» (то есть функция, которая не является частью класса).
  • median() на самом деле это не C ++, это C, поскольку он использует низкоуровневый массив C. Вы можете использовать std::vector<double> вместо.
  • C и C ++ являются низкоуровневыми и, в зависимости от того, с каких языков вы пришли, могут сбивать с толку 🙂 Я предлагаю выбрать хорошую недавнюю книгу о современный C ++. Современный C ++ относится как минимум к C ++ 11 и стилю программирования, в котором вы почти никогда не выполняете непосредственный выделение / освобождение памяти (то есть вы не используете new а также delete). Удачи в вашем путешествии!

редактировать

Изменена ссылка на ошибку Jetbrains на первую, сообщающую о проблеме.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]