你能在重新打开的类环境中定义C++方法,而不是用类名作为前缀吗



在我看过的每一节关于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)'

我已经开始养成这样定义函数的习惯,这样我就可以立即出现编译错误,而不是等待一个潜在的大构建只得到一个链接错误,这需要修复头部(希望是正确的!(,然后再次等待进行大重建。

最新更新