重构:在 CLion 中移动 (F6) - 为什么它会这样工作?

Refactoring: Move (F6) in CLion - why does it work like that?

我的 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 创建的文件?我应该在 main.cpp 中包含 MathFunctions.cpp 而不是头文件吗?

不幸的是,这是一个由 https://youtrack.jetbrains.com/issue/CPP-9329 跟踪的 CLion 错误,请创建一个 Jetbrains 帐户并为此问题投票。

我不确定你说的 "workaround" 是什么意思。要使您的代码正常工作,您需要

  1. MathFunctions.h 包含文件中为 double median(double values[], int count); 创建函数声明。
  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() 不是 "method",它是 "function",或者更准确地说是 "free-standing function"(即不属于 class).
  • median() 不是真正的 C++,是 C,因为它使用低级 C 数组。您可能想改用 std::vector<double>
  • C 和 C++ 是低级的,可能会造成混淆,这取决于您使用的是哪种语言 :-) 我建议选择一本关于 modern C++ 的好书.现代 C++ 至少指 C++11 和一种你几乎从不执行 直接 内存 allocation/deallocation 的编程风格(也就是说,你不使用 newdelete)。祝你一路顺风!

编辑

已将 link 更改为第一个报告问题的 Jetbrains 错误。