【问题标题】:Implement class without scope resolution operator?实现没有范围解析运算符的类?
【发布时间】:2014-07-22 22:19:38
【问题描述】:

如果我在头文件中声明我的类,有没有办法在没有那些烦人的范围解析运算符的情况下实现该类?我不喜欢为每个成员重写类名。我想我以前曾尝试过这样做:

在 A.h

#if !defined(a_h)
#define a_h
class A {
    int function (int);
    int foo (void);
};
#endif

在 A.cpp 中

#include "A.h"
class A { 
     int function (int number) {
         return 2* number;
     }
    int foo (void){
        return 2;
    }
}

但出现了一些错误(很遗憾,现在无法测试)。

【问题讨论】:

  • 我知道。我想知道是否有一种解决方法可以节省打字...
  • 可以在header中内联实现
  • 那么没有别的办法了吗?也许是某种宏?
  • 我不想让它内联我读到它可能会因为几个翻译单元或其他东西而变得糟糕..
  • 这真的太简单了,无法尝试做一些不合时宜的事情。只需在 imp 文件中输入您的标题复制/粘贴定义,输入一次your_class:: 并将其复制/粘贴到它所属的位置。或者,学习另一种语言。

标签: c++


【解决方案1】:

您可以使用预处理器宏来简化操作。

#include "A.h"
#ifdef _
#undef _
#endif
#define _(fun) A::fun

int _(function)(int number)
{
   return 2* number;
}

int _(foo)(void)
{
   return 2;
}

但是...

你不应该仅仅因为你可以做某事。

使用预处理器宏来隐藏语言的重要结构是不明智的。在你走这条路之前,有一些事情需要考虑。

  1. 与在任何有用的程序中编写其余代码所花费的时间相比,编写 <ClassName>:: 所花费的时间逐渐减少。

  2. 您在调试和维护程序上所花费的时间将远远高于您在编写<ClassName>:: 时所花费的时间。

  3. .cpp 文件中有多个类时,如果对所有类采用相同的策略,您将很难清楚地看到哪个函数对应于哪个类。

  4. 在调试时,您会感到沮丧的是,当您单步执行某个函数时,您将无法看到完全限定的函数名称。

  5. 为了在实现类的成员函数时节省几个按键而付出的代价太高昂了。

我说的是经验。我在一个类名之一是INR_DynamicallyTypedLowFidelityLeafComponentRepresentation 的项目中工作。我不会使用预处理器宏来隐藏那么长的名称。

【讨论】:

  • 谢谢,可以试试。
  • 要小心,如果你在许多其他文件中包含该头文件,你的编译时间会爆炸!
  • 如果我在文件末尾抛出一个 undef _ 应该是安全的吗?为什么编译时间会爆炸?
  • @Emil 很安全,但很恶心。
  • 嗯,我认为 mysuperlongclassnameincamelcase::fun 更恶心 :D
猜你喜欢
  • 2010-09-09
  • 2012-04-20
  • 2018-04-24
  • 1970-01-01
  • 2013-06-13
  • 2015-12-18
  • 2014-10-05
  • 2013-05-31
  • 2016-05-17
相关资源
最近更新 更多