将匿名类传递给私有成员函数

Passing anonymous classes to private member functions

本文关键字:成员 函数      更新时间:2023-10-16

是否可以使用在匿名命名空间中定义的类作为私有成员函数的参数?我还没有找到一种在头文件中声明AnonymousHelperClass的方法。

// C.h
class C
{
  // ...
private:
  void Boing(AnonymousHelperClass &helper);
};

// C.cpp
namespace
{
  class AnonymousHelperClass
  {
    // . . . 
  };
}
C::Boing(AnonymousHelperClass &helper)
{
  // ...
}

不能,因为在头文件中没有办法命名类型。

但是,您可以将private成员函数转换为模板:

// C.h
class C
{
public:
    void Foo();
private:
    template <typename TAnonymousHelper>
    void Boing(TAnonymousHelper&);
};

然后在源文件中定义它,并与AnonymousHelperClass:

一起使用。
// C.cpp
#include "C.h"
namespace
{
    class AnonymousHelperClass { };
}
template <typename TAnonymousHelper>
void C::Boing(TAnonymousHelper& x) { }
void C::Foo()
{
    AnonymousHelperClass x;
    Boing(x);
}

虽然实际上,可能更容易的方法是重新编写逻辑,使私有成员函数可以是.cpp文件中的名称空间作用域函数。

不,因为未命名的命名空间(这是它们的实际名称)在c++标准中是这样定义的:

7.3.1.1未命名的命名空间[namspace . Unnamed]

1。未命名的命名空间定义的行为就像被

取代一样。
    namespace unique { /* empty body */ }
    using namespace unique;
    namespace unique { namespace-body }

,其中翻译单元中出现的所有unique都被替换为相同的标识符和此标识符不同于所有其他标识符整个程序中的标识符。

对于你的类它相当于:

namespace SomeUniqueNameGeneratedByTheCompiler {}
using namespace SomeUniqueNameGeneratedByTheCompiler;
namespace SomeUniqueNameGeneratedByTheCompiler
{    
    class AnonymousHelperClass    
    {    
        // . . .     
    };    
}

因此,AnonymousHelperClass级的完全资格是::SomeUniqueNameGeneratedByTheCompiler::AnonymousHelperClass,而不是::AnonymousHelperClass。所以即使你这样做了:

class AnonymousHelperClass; // Forward declaration
class C     
{     
  // ...     
private:     
  void Boing(AnonymousHelperClass &helper);     
};  

前向声明指向不同的AnonymousHelperClass。您可以将forward声明放在SomeUniqueNameGeneratedByTheCompiler名称空间中,但是由于只有编译器知道这个名称,所以不能这样做。