有没有办法在c ++中定义类成员函数时跳过类名?

时间:2015-07-27 05:38:29

标签: c++ objective-c function class

例如,我在dog.h中声明了一个名为Dog的类:

class Dog {
public:
    void bark();
private:
    int count;
}

有什么方法可以在dog.cpp中编写以下代码:

void bark() {
   printf("count: %d", count);
}

而不是:

void Dog::bark() {
   printf("count: %d", count);
}

如果我有大量应该定义的类函数,它将有助于节省时间。 (我可以将函数定义复制粘贴到.h文件中,而不必每次都删除类名。)

在objective-c代码中,我可以在.m(它的角色就像.cpp)文件中添加一个“@implementation ... @end”范围,然后我可以像这样编写函数:

in dog.h:
- (void) bark;

in dog.m:
@implementation Dog
- (void) bark {
    printf("count: %d", count);
}
@end

所以我想也许在c ++中也有类似的方式。

你看,我可以将.m文件中的函数定义代码复制到.h文件中,只需要添加一个“;”行尾的符号。如果类函数是私有的,我甚至不需要在.h文件中声明它。所以我认为在声明一个类时,objective-c比c ++更方便。

4 个答案:

答案 0 :(得分:5)

  

有什么方法可以在dog.cpp中编写以下代码吗?

不,你不能这样做。在类定义之外定义成员函数时,必须使用类名。

来自C ++ 11标准:

  

9.3会员职能

     

5如果成员函数的定义在词法定义之外是词法定义,则成员函数名称应使用::运算符通过其类名限定。

答案 1 :(得分:2)

简单模式

在您的cpp文件中,您可以使用以下模式:

#include "dog.h"

#define _C Dog::

void _C bark () {
...
}

void _C foo () {
...
}

#undef _C

对于任何TU,宏_C的使用都是相同的。

更精细的模式

概念:直接在类定义中生成成员实现的代码。 文件结构模式:

  1. 名为dog.h
  2. 的常规头文件
  3. 带有方法实现的头文件 包括,名为" dog.hxx"
  4. cpp文件包括" dog.h"特殊宏IMPLEMENT_API定义了
  5. 常规头文件dog.h

    class Dog {
    public:
        void bark();
    private:
        int count;
    #ifdef IMPLEMENT_API
    #include "dog.hxx"
    #endif
    }
    

    dog.hxx文件:

    void bark() {
       printf("count: %d", count);
    }
    
    void foo() {
       printf("foo: %d", count+1);
    }
    

    dog.cpp文件:

    #define IMPLEMENT_API
    #include "dog.h"
    

    在更复杂的情况下,一个TU可用于第二个模式的多个实例,如下面的animals.cpp文件中所示。
    animals.cpp文件:

    #define IMPLEMENT_API
    #include "cat.h"
    #include "dog.h"
    

    另一个类cat使用与dog宏类似的语句定义为IMPLEMENT_API。 在包含dog.hcat.h的其他文件中,只会生成声明,因为IMPLEMENT_API宏只能在dog.cppanimals.cpp等TU中定义。< / p>

    优点:dog.hxxcat.hxx文件使用其类的上下文和命名空间,允许省略每个成员定义的类的完全限定名称。

    警告:如果编译器不允许同时拥有成员声明和成员定义,则成员声明应使用模式#ifdef IMPLEMENT_API <member definitions> #else <member declarations> #endif包装。

答案 2 :(得分:2)

抱歉迟到了。我不能解决太多问题。 ;)

您不需要.cpp文件来定义您的功能。您可以在类定义中执行此操作。事实上,如果你想要它内联,你必须这样做。

大多数人似乎都有.cpp迷信。 ;)我把几乎所有的函数都放在了类定义中。我的大部分课程都没有.cpp文件,但有时它们是必要的。

瞧!没有狗::也没有.cpp文件。enter code here类狗{

public:
    void bark() {
    printf("count: %d", count);
    }
private:
    int count;
}

答案 3 :(得分:-2)

friend

中将该功能标记为class
class Dog {
friend void bark (Dog &); /// mark as friend

private:
int count = 22;
};

通过此操作,您可以访问private

中的一些class Dog成员
void bark (Dog &d1)
{
std::cout << d1.count << std::endl;
}