c++ - 头文件和源文件中的 typedef 返回类型 - 最佳实践是什么?

标签 c++ class scope typedef member-functions

我有一个具有长返回类型的成员函数的类:

/* 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::myTypefoo 的私有(private)部分中定义.但是,公共(public)方法的返回类型不能是真正私有(private)的。如果不允许上述定义,您可以编写:
 decltype( declval<foo>().someFunction() ) foo::someFunction() {}
因此,不允许上述定义真的没有意义。
Live example

关于c++ - 头文件和源文件中的 typedef 返回类型 - 最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64275183/

相关文章:

c# - 使用 C# 插件扩展 C++ 应用程序

c++ - 如何在 C++ 中的不同翻译单元之间共享枚举实例?

java - 如何正确确定锁的范围

binding - let-rebinding 和标准赋值有什么区别?

c++ - 如何为 boolinq 实现 First 和 FirstOrDefault?

c++ - 无法追踪潜在的内存覆盖。 Windows 怪异

c++ - 默认声明的属性? (状态设计模式)

java - 更新文本文件而不丢失信息

c++ - 为什么函数返回垃圾值?

java - 如何通过 Weld 获得Java SE中的ApplicationScoped生产者?