Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+;中定义类成员函数时是否有跳过类名的方法+;?_C++_Objective C_Function_Class - Fatal编程技术网

C++ 在c+;中定义类成员函数时是否有跳过类名的方法+;?

C++ 在c+;中定义类成员函数时是否有跳过类名的方法+;?,c++,objective-c,function,class,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); } 如果我有大量需要定义的类函数,这将有助于节省时间。(我可以将函数定

例如,我在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文件中声明它。所以我认为Objto-C在声明类时比C++更方便。 有没有办法在dog.cpp中编写以下代码

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

从C++11标准:

9.3会员职能

5如果成员函数的定义在词汇上超出其类定义,则应使用
运算符通过其类名限定成员函数名


类中将函数标记为
friend

class Dog {
friend void bark (Dog &); /// mark as friend

private:
int count = 22;
};
使用此功能,您可以访问
类狗中的一些
私人
成员

void bark (Dog &d1)
{
std::cout << d1.count << std::endl;
}
void树皮(狗和d1)
{
std::cout简单模式
在cpp文件中,您可以使用以下模式:

#include "dog.h"

#define _C Dog::

void _C bark () {
...
}

void _C foo () {
...
}

#undef _C
\u C
的使用对于任何TU都是相同的

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

  • 名为
    dog.h的常规头文件
  • 包含要执行的方法实现的头文件 包括在内,名为“dog.hxx”
  • cpp文件包括“dog.h”,而特殊宏
    IMPLEMENT\u API
    已定义
  • 常规头文件
    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);
    }
    
    #define IMPLEMENT_API
    #include "dog.h"
    
    #define IMPLEMENT_API
    #include "cat.h"
    #include "dog.h"
    
    dog.cpp
    文件:

    void bark() {
       printf("count: %d", count);
    }
    
    void foo() {
       printf("foo: %d", count+1);
    }
    
    #define IMPLEMENT_API
    #include "dog.h"
    
    #define IMPLEMENT_API
    #include "cat.h"
    #include "dog.h"
    
    在更复杂的情况下,一个TU可用于第二种模式的多个实例,如下面的
    animals.cpp
    文件中所示。
    anists.cpp
    文件:

    void bark() {
       printf("count: %d", count);
    }
    
    void foo() {
       printf("foo: %d", count+1);
    }
    
    #define IMPLEMENT_API
    #include "dog.h"
    
    #define IMPLEMENT_API
    #include "cat.h"
    #include "dog.h"
    
    另一个类
    cat
    被定义为
    dog
    ,使用与
    IMPLEMENT\u API
    宏类似的语句。 在另一个文件(包括
    dog.h
    cat.h
    )中,将只生成声明,因为
    IMPLEMENT\u API
    宏必须仅在TU(如
    dog.cpp
    animals.cpp
    )中定义

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


    注意:如果编译器不允许同时拥有成员声明和成员定义,那么成员声明应该使用模式
    #ifdef IMPLEMENT_API#else#endif

    来包装。很抱歉,我来晚了。我没有太多时间

    你不需要一个.cpp文件来定义你的函数。你可以在类定义中这样做。事实上,如果你想让它有一行,你必须这样做

    大多数人似乎有一个.cpp崇拜。;)我把几乎所有的函数都放在类定义中。我的大多数类没有.cpp文件,但有时它们是必需的

    瞧!没有狗::也没有.cpp文件。
    在这里输入代码
    class Dog{

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

    @firestoke,正如R Sahu所回答的:“不,你不能那样做”嗯……这真的让我很恼火。我也写了很长时间的objective-c代码。我可以通过使用“@implementation…@end”在objective-c代码中编写没有类名前缀的成员函数在.m文件中,我认为C++中可能有类似的方法……人们正在用螺丝钉拧紧。you@firestokeC++社区不应该发现这是一个大问题:)个人地,它使代码更易于阅读,代码<> CordNo:://>附加到实现。lassName::
    与维护代码所需的时间相比,成员函数的实现会逐渐消失。@firestoke:尝试按语言要求的方式编写代码是件好事。想象一下,有人问“有没有一种方法可以不用烦人的
    ne…pas来否定法语句子”?看起来像这样。它做的是P需要,某种程度上。需要大量额外的击键。但它肯定不能满足OP的要求。问题是关于成员函数。@juanchopanza您缺少它的幽默感。OP不希望必须键入
    狗::
    。此解决方案需要OP键入
    朋友
    狗&
    两次,一个变量名,然后输入prefIX所有成员都用这个变量名访问。不管它是否是好的C++,这都将是非常不方便的。@ USER481301好笑!我差点从椅子上笑下来。我得到了。如果他编码了一个DLL,把它注入IDE,当“编译按钮”被调用的函数被删除时,会怎么办?按下,检查项目中的所有文件,将dog::或任何类名放在所有函数前面,等等,并调用原始函数来编译代码,这将在将来节省他一些时间!告诉你我得到了它,它有
    @implementation
    @end
    意味着你不能可靠地识别非成员函数没有搜索到文件的顶部(或者可能是以前的
    @end
    -如果有的话-或者关闭一个名称空间或者实现无法跨越的任何其他内容),我想对名称空间也会有同样的批评。你提到你只想