重构:在 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" 是什么意思。要使您的代码正常工作,您需要
- 在
MathFunctions.h
包含文件中为 double median(double values[], int count);
创建函数声明。
- 在你的
main.cpp
中,添加你提到的 #include "MathFunctions.h
- 在 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 的编程风格(也就是说,你不使用
new
和 delete
)。祝你一路顺风!
编辑
已将 link 更改为第一个报告问题的 Jetbrains 错误。
我的 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" 是什么意思。要使您的代码正常工作,您需要
- 在
MathFunctions.h
包含文件中为double median(double values[], int count);
创建函数声明。 - 在你的
main.cpp
中,添加你提到的#include "MathFunctions.h
- 在 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 的编程风格(也就是说,你不使用
new
和delete
)。祝你一路顺风!
编辑
已将 link 更改为第一个报告问题的 Jetbrains 错误。