在我看过的每一节关于C++的课和书中,都有一个类是这样写的:
header.h
class MyClass
{
...
int myMethod(int my_para);
};
source.cpp
...
int
MyClass::myMethod(int my_para)
{
...
}
但我确实发现MyClass::
只是增加了C++的自然混乱和困惑,尤其是当MyClass
实际上更像MySomethingSomethingCreator
时。我想用更多的名称空间风格来写我的类定义,比如:
header.h
class MyClass
{
...
int myMethod(int my_para);
};
source.cpp
class MyClass
{
...
int myMethod(int my_para)
{
...
}
}
现在,我从尝试中知道,完全这样做是行不通的,但有没有办法做类似的事情——只是去除一点噪音?我对在类声明中定义函数不感兴趣——这是魔鬼的工作!
但有没有类似的方法
否。
MyClass::只是增加了C++的自然混乱和困惑
这只是一个新的C++程序员必须学会接受的一件小事。一旦你习惯了,它就不再令人困惑。
MyClass::只会增加C++的自然混乱和困惑
我不同意你的意见。想象一下,您正在使用一个巨大的代码数据库,并且在.cpp
文件中遇到一个函数的定义,如下所示。
.
.
.
.
int myfunc(std::string some_arg)
{
//whatever can be here
}
.
.
.
.
.
现在你会想,这是某个类的命名空间或方法中的函数吗。当然,您建议的类说明符会出现在上面,但在中可能有上千行,甚至一万行,这可能是人们不想处理的。有人想通过直接查看它来了解它是否是一种方法或函数。
MyClass::
说明符在很大程度上用于此目的。
您不能。不过,这通常不是问题。事实上,有充分的理由想要用免费函数来实现这一点。John Lakos在大规模C++卷I(2020(第155–156页中指出,你可以(也可能想要(这样做:
// foo.h
namespace my_product {
int foo(int);
} // namespace my_product
然后
// foo.cpp
#include <my_product/foo.h>
int my_product::foo(int x) {
return x * 2;
}
这样做的好处是:假设您想将签名更改为float
,并在.cpp
中将其更改为float my_product::foo(float x)
。如果这样做,float my_product::foo(float x)
只能定义函数,而不能声明它,因此会出现编译错误:https://godbolt.org/z/eGbv3rTx5
error: out-of-line definition of 'foo' does not match any declaration in namespace 'my_product'
float my_product::foo(float x) {
^~~
而如果.cpp文件是
// foo.cpp
#include <my_product/foo.h>
namespace my_product {
float foo(float x) {
return x * 2;
}
} // namespace my_product
当你试图使用该函数时,你必须等待整个项目的构建,然后得到一个链接错误:https://godbolt.org/z/soo7r97fG
undefined reference to `my_product::foo(int)'
我已经开始养成这样定义函数的习惯,这样我就可以立即出现编译错误,而不是等待一个潜在的大构建只得到一个链接错误,这需要修复头部(希望是正确的!(,然后再次等待进行大重建。