【问题标题】:Create getter and setter members for a C++ class in Vim在 Vim 中为 C++ 类创建 getter 和 setter 成员
【发布时间】:2010-11-02 17:12:50
【问题描述】:

我正在创建一个包含许多双(或其他东西,类型无关紧要)成员的类。

class CalcParameters {
public:
  CalcParameters() {}
  ~CalcParameters() {}

  // getters and setters here

private:
  double _param1;
  double _param2;
  ...
};

是否可以在 Vim 中编写脚本为每个参数自动生成公共 getter 和 setter?

喜欢

double param1() const { return _param1; }
void setParam1(double param1) { _param1 = param1; }
...

注意

此代码不是真实代码的 sn-p,而只是我为说明问题而编写的内容。在我的真实工作代码中,成员被命名,并且除了属性之外,setter 还具有验证逻辑。但是当编写一个包含所有成员的骨架类时,让 Vim 为我创建基本的 getter 和 setter 会很好。这可能吗?

【问题讨论】:

  • 您的对象设计可能有问题。你永远不应该需要“许多 getter 和 setter”。
  • 这确实可以用 Vim 宏来完成。事实上,很容易。但无论如何,这段代码都被破坏了。 @Vitor Py:我建议重新考虑你的设计,而不是使用编辑器来自动化你一开始不应该做的事情。
  • @Charles: _ + 小写字母适用于成员名称。只有 _ + 大写是全局保留的。
  • @Roger:前导下划线允许什么和不允许什么有一些规则(取决于下一个字符和链接)。我更喜欢通过没有前导下划线来避免整个问题。
  • @David:是的,对于涉及下划线的保留标识符有 3 条简单的规则。我们是否应该通过在标识符中禁止下划线来“避免整个问题”?

标签: c++ vim


【解决方案1】:

对于简单的数据类,有时另一个不错的选择是使用 boost::tuple(或 C++0x 中的 std::tuple):

typedef tuple<int, char> MyDataElement;
MyDataElement data = make_tuple(1,'c');
int whatever = get<0>(data); // 1

另外,三思而后行,你也可以考虑使用Boost Property Map

最后,对于vim脚本,当然可以了。我一直在调查,你可以做这样的事情(假设你用前缀标识成员变量,比如m_):

:let bl = getbufline("" ,1, "$")

这将加载缓冲区的所有行,然后通过包含“m_”的内容过滤它们:

:let xx = filter(bl, 'v:val =~ "m_.*"')

然后您可以研究如何从数组xx 中提取实际变量名称,等等。

【讨论】:

  • 这适用于不同参数类型的固定长度容器
  • @Steve:这样可以看到纯数据(POD)类,加上每个参数的名称,不存在于元组中。
【解决方案2】:

我很久以前写过ftplugin for this purpose

这个想法是输入;AA 并回答 Vim 提出的问题。它具有原始形式的 const 正确性理解(即 int 将被复制,而 string 将由 const-ref 交换)

现在我应该改写它,因为我知道如何获取已写入数据成员的类型,加上几个functions aimed at converting identifiers(成员 getter setter 参数 局部变量 常量/下划线分隔的单词 小写/大写驼峰式大小写)。唉,我已经被介绍给 Demeter,我倾向于尽量减少对 getter 和 setter 的使用,因此我需要对 ftplugin 进行现代化改造。

编辑:从那时起,我为我的lh-refactor 插件编写了两种新的重构方法:Extract SetterExtract Getter。如上所述,提取方法知道如何根据成员变量的名称构建 setter 和 getter 的名称。

【讨论】:

    【解决方案3】:

    如果这确实是您的类的外观,请将它们按顺序存储在vector&lt;double&gt; 中,并通过size_tvector 提供一个单一的getter 索引,以及一个单独的paramCount() 方法来测量向量长度使用size()

    【讨论】:

    • 我的课看起来不像这样。我有一组命名参数(如 pH 值、浓度、扩散率……)。实际上,我已经编写了该类和 7 或 8 个 getter/setter 对,但我很好奇是否可以在 Vim 中自动执行此操作。
    • @Vitor Py - 我明白了 - 如果它们不是通用的,那更有意义,就像您的代码一样。感谢上下文。我想因为它们都是double,你可以使用enum 来索引它们,但仍然没有真正回答你的问题。
    【解决方案4】:

    将相关数据移出private 部分并进入public 部分。没有人说所有成员数据都必须是私有的:如果它是接口的一部分,那么它就应该是公开的,而那些冗长、多余、愚蠢的 getter 和 setter 都该死。

    在编程中,如果某事可以通过脚本完成,那么就不应该这样做。

    【讨论】:

    • 我添加了一个注释以提供有关该问题的一些背景信息。
    【解决方案5】:

    是的。以这种方式可以使用 Vim。

    VimCasts has a relevant video 描述了自动化此类流程的一种更简单的方法,只不过是一个宏、标记以及一些拉动和粘贴。

    但这不是我解决问题的方式。相反,我会输入 :q!重新开始。几乎总是使用 getter 和 setter C++ 风格很差,不可取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      相关资源
      最近更新 更多