如何让 CLion 插入生成的代码....在 .cpp 文件中

How to make CLion insert generated code.... in .cpp files

在 CLion 中生成代码总是导致在头文件中实现方法,我一直被告知它们应该放在 .cpp 文件中,我如何才能改变这种行为,甚至可能吗?

示例:

在包含 main.cpp 和测试 class(test.hpp 和 test.cpp)的项目中。

CMake文件如下:

cmake_minimum_required(VERSION 3.3)
project(testClion)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp
                test.cpp
                test.hpp)
add_executable(testClion ${SOURCE_FILES})

(注意这是clion默认提供的文件,我什么都没改)

test.hpp

#ifndef TESTCLION_TEST_HPP
#define TESTCLION_TEST_HPP

class test
{
 protected:
  int test;
};


#endif //TESTCLION_TEST_HPP

test.cpp

#include "test.hpp"

在 test.hpp 或 test.cpp 中按 ALT + INSERT 并生成 getters/setters 只会更改 test.hpp:

test.hpp

#ifndef TESTCLION_TEST_HPP
#define TESTCLION_TEST_HPP

class test
{

 public:
  int getTest() const
  {
    return test;
  }
  void setTest(int test)
  {
    test::test = test;
  }
 protected:
  int test;
};


#endif //TESTCLION_TEST_HPP

CLion 实际上在 header 文件中声明了方法,并在 .cpp 文件中定义了它们,前提是 'knows' 这两个文件都是相关的。我注意到在创建新的源文件时,您必须重新加载 cmake(CMake 工具栏 > "Reload CMake Project" 图标)以便 IDE 考虑 .cpp 文件,特别是如果您使用 file(GLOB xxx)列出源文件。

另请检查:

  • .cpp 文件被列为使用 cmake 构建的二进制文件的来源
  • 它正确地包含了相关的 header
  • 源文件和 header 文件具有相同的基本名称

注意:如果需要,CLion 提供了一种将方法实现移动到源文件的简单方法。将光标置于 header 文件中的方法,按 Alt + Enter 并单击 Move function definition to source file

我刚开始使用 CLion 时遇到了同样的问题。我能够通过使用 Intention Actions 菜单(黄色地球)定义在何处实施这些方法。我因尝试使用错误的热键而感到困惑。

当前版本 2016.1.2:

  1. 将光标置于方法上。
  2. 通过将鼠标悬停在附近并单击地球仪或按热键打开 Intention Actions 菜单
    • Windows 默认:alt + enter
    • OS X 默认值:option + enter
  3. Select相关动作。
    • Generate definition for function 'someFunction' 在源文件中添加定义。
    • Create new function 'someFunction()' 将定义添加到头文件中(已在源代码中完成实现)。

好的,我有一个实际的解决方案给你。我遇到了同样的问题,我可以做 alt + enter 并且我只能按方法自动生成。您可以使用 alt + insert 解决此问题。这会在 Clion 中调出生成菜单。从这里 select generate definitions 将弹出一个菜单,您可以在其中 select 所有定义或 select select 您实际想要生成的一些定义。

Clion 足够聪明,知道您是否已经 生成了一个定义,因此您不必担心此处出现重复定义。我发现对于 QT,某些 classes 具有 Meta Object 编译器覆盖,将在此处显示,因此我确保在创建定义时不会 select 那些,但对于大多数正常用例 selecting generate definitions 列表中的每个元素只会生成您在 header 中实际定义的内容。

请注意,您也可以右键单击您的 class 名称并转到 Generate...,您将获得相同的选项。

编辑:请注意,如果您真的想要原作者的行为,您可以 select "generate in place" 选项,一旦您进入生成定义函数 selection screen