C++ 在c+;中定义类成员函数时是否有跳过类名的方法+;?
例如,我在Dog.h中声明了一个名为Dog的类: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); } 如果我有大量需要定义的类函数,这将有助于节省时间。(我可以将函数定
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
-如果有的话-或者关闭一个名称空间或者实现无法跨越的任何其他内容),我想对名称空间也会有同样的批评。你提到你只想