簡體   English   中英

將匿名類傳遞給私有成員函數

[英]Passing anonymous classes to private member functions

是否可以使用匿名命名空間中定義的類作為私有成員函數中的參數? 我還沒有找到一種方法來在頭文件中聲明AnonymousHelperClass。

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

// C.cpp
namespace
{
  class AnonymousHelperClass
  {
    // . . . 
  };
}

C::Boing(AnonymousHelperClass &helper)
{
  // ...
}

不,因為無法在頭文件中命名類型。

但是,您可以將私有成員函數轉換為模板:

// 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未命名的命名空間[namespace.unnamed]

1.未命名的命名空間定義的行為就好像被替換為

  namespace unique { /* empty body */ } using namespace unique; namespace unique { namespace-body } 

其中翻譯單元中所有唯一的出現都被相同的標識符替換,並且該標識符與整個程序中的所有其他標識符不同。

所以在你的課上它相當於:

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 您可以將前向聲明放在SomeUniqueNameGeneratedByTheCompiler命名空間中,但由於只有編譯器知道此名稱,因此無法完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM