我有一个具有长返回类型的成员函数的类:
/* MyClass.hpp */
namespace foo
{
class MyClass
{
public:
SomeNameSpace::Lengthy_return_type_name someFunction(params...);
};
}
我想让它更具可读性,而不会让读者感到困惑,而且我不一定想将 typedef 暴露给外界。所以在 MyClass.hpp 中,我在 MyClass 中添加了以下 typedef:/* MyClass.hpp */
namespace foo
{
class MyClass
{
private:
typedef SomeNameSpace::Lengthy_return_type_name myType;
public:
myType someFunction(params...);
};
}
现在,在 MyClass.cpp 中,我遇到了一个难题,因为 myType 不可见,无法用作返回类型。如果我公开了 typedef,我可以使用 MyClass::myType,但我不喜欢这样,因为我认为它令人困惑并且还暴露了 myType。我还可以将 typedef 添加到 MyClass.cpp 的顶部,但这可能会影响其含义,因为读者必须进行一些挖掘才能找出类型所指的内容。这是我想太多了吗?在这种情况下,最佳做法是什么?
最佳答案
简短的回答是:公开别名。没有理由将其设为私有(private)。
为了说明,我把你的例子更进一步。假设 myType
不仅是别名,而且是一种新类型:
struct foo {
private:
struct myType {};
public:
myType someFunction();
};
现在让我们看看这带来了什么:是myType
真的私密吗?不。来电者可以做
foo f;
auto x = f.someFunction();
using myMyType = decltype(x);
Tada,用户有 myType
的别名调用myMyType
.公共(public)函数的返回类型不是私有(private)的!只有名字foo::myType
是私有(private)的,但用不同名称引用的类型很常见。试图隐藏这个名字是没有意义的。您唯一实现的就是强制用户使用不同的名称。还要考虑到人们可能期望定义
foo::myType foo::someFunction() {}
编译失败,因为 foo::myType
在 foo
的私有(private)部分中定义.但是,公共(public)方法的返回类型不能是真正私有(private)的。如果不允许上述定义,您可以编写: decltype( declval<foo>().someFunction() ) foo::someFunction() {}
因此,不允许上述定义真的没有意义。Live example
关于c++ - 头文件和源文件中的 typedef 返回类型 - 最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64275183/