在c++中定义类成员函数时是否有办法跳过类名?
is there a way to skip class name while define a class member function in c++?
例如,我在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代码中,我可以添加一个"@implementation…"@end"作用域在.m(它的作用类似于。cpp)文件中,那么我可以像这样编写函数:in dog.h:
- (void) bark;
in dog.m:
@implementation Dog
- (void) bark {
printf("count: %d", count);
}
@end
所以我认为c++中也有类似的方法。
你看,我可以将。m文件中的函数定义代码复制到。h文件中,只需要在行尾添加一个";"符号。如果类函数是私有的,我甚至不需要在.h文件中声明它。所以我认为objective-c在声明类时比c++更方便。
是否有任何方法,我可以只是写下面的代码在狗。cpp?
不,你不能那样做。在类定义之外定义成员函数时,必须使用类名。
来自c++ 11标准:
9.3成员函数5如果成员函数的定义在词法上超出其类定义,则成员函数名应使用
::
操作符由其类名限定。
简单模式
在您的cpp文件中,您可以使用以下模式:
#include "dog.h"
#define _C Dog::
void _C bark () {
...
}
void _C foo () {
...
}
#undef _C
宏_C
的使用对于任何TU都是一样的。
更详细的模式
概念:直接在类定义中生成成员实现的代码。文件结构模式:
- 命名为
dog.h
的常规头文件 - 包含方法实现的头文件包含,命名为"dog.hxx"
- 包含"dog.h"的cpp文件,而特殊宏
IMPLEMENT_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);
}
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.h
或cat.h
的文件中,只会生成声明,因为IMPLEMENT_API
宏必须只在像dog.cpp
或animals.cpp
这样的TU中定义。
优点:dog.hxx
或cat.hxx
文件使用其类的上下文和名称空间,允许在每个成员定义中省略类的完全限定名。
注意:如果编译器不允许同时拥有成员声明和成员定义,则成员声明应使用模式#ifdef IMPLEMENT_API <member definitions> #else <member declarations> #endif
进行包装。
大多数人似乎都有。cpp的迷恋。,)我把几乎所有的函数都放在了类定义中。我的大多数类都没有.cpp文件,但有时它们是必要的。
瞧!没有Dog::和.cpp文件。enter code here
类狗{
public:
void bark() {
printf("count: %d", count);
}
private:
int count;
}
将函数标记为class
中的friend
class Dog {
friend void bark (Dog &); /// mark as friend
private:
int count = 22;
};
可以访问class Dog
private
成员。void bark (Dog &d1)
{
std::cout << d1.count << std::endl;
}
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何定义一个纯抽象基类