在另一个命名空间中如何定义友元函数

huangapple go评论64阅读模式
英文:

C++ how do define friend function in another namespace

问题

我有一个类声明类似于这样;

#include "other.h"
class A{
          public:
            A(){};
          private:
            friend Data someNamespace::function(A* elem);
        }

现在在另一个头文件中,我有

//other.h
#include "A.h"
namespace someNamespace {
       Data function(A* elem);
    }

以及 .cpp 文件

//other.cpp
#include "other.h"
Data someNamespace::function(A* elem){
  // 在这里做一些事情
}

我无法弄清楚如何使命名空间函数成为第一个类的友元。命名空间中的函数无法访问类A的私有变量。我漏掉了什么?

英文:

I have a class declaration similar to this;

#include "other.h"
class A{
          public:
            A(){};
          private:
            friend Data someNamespace::function(A* elem);
        }

Now in another header file i have

//other.h
#include "A.h"
namespace someNamespace {
       Data function(A* elem);
    }

ANd .cpp file

//other.cpp
#include "other.h"
Data someNamespace::function(A* elem){
  // do something here
}

I cant figure out how to make the namespace function as a friend to the first class. function in namespace cannot acces private vairables of class A. What am i missing?

答案1

得分: 1

这是一种方法。前向声明class A,以便您可以在命名空间中声明Data function(A* elem),以便您可以在类A内部命名someNamespace::function

struct Data {};

class A;  // <-- *** 您需要这个 ***

namespace someNamespace {
    Data function(A* elem);
}

class A {
    friend Data someNamespace::function(A* elem);
};

Data someNamespace::function(A* elem) {
  return Data();
}

如果这些代码在多个文件中

如果代码分散在不同的文件中,那么可以想象一个名为other.h的文件,其内容如下:

#include "data.h"  // 用于定义`Data`

class A;  // 这样`A*`才有意义

namespace someNamespace {
   Data function(A* elem);
}

#include "A.h"  // 如果需要`A`的其余定义。
                // 遵循“使用时包含”的原则。

// 在此处添加其余的“other”声明
英文:

Here's one way. Forward declare class A so that you can declare Data function(A* elem) in your namespace so that you can name someNamespace::function within the class A.

struct Data {};

class A;  // <-- *** You need this ***

namespace someNamespace {
    Data function(A* elem);
}

class A {
    friend Data someNamespace::function(A* elem);
};

Data someNamespace::function(A* elem) {
  return Data();
}

If this were multiple files

If the code appears in separate files, then one could imagine an other.h file looking like this:

#include "data.h"  // for the definition of `Data`

class A;  // so that `A*` makes sense

namespace someNamespace {
   Data function(A* elem);
}

#include "A.h"  // If the rest of the definition of `A` is needed.
                // "Include what you use" principle.

// remaining "other" declarations here

huangapple
  • 本文由 发表于 2023年6月22日 02:35:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/76526212.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定