c++ - 没有类声明的友元成员函数

标签 c++ encapsulation friend forward-declaration member-functions

可能有一个非常简单的修复方法,但目前让我感到困惑。所以,我正在编写 C++ 类以达到以下效果:

标题.h:

#pragma once
//...
class arrayObj
{
private:
   // some variables...
public:
   //constructor, destructor, getters, etc...
   friend void objManager::foo();
};
//...
class objManager
{
private:
   //...
   std::vector<std::shared_ptr<arrayObj>> array;
public:
   void foo();
   //other methods...
};

现在,按原样,我的编译器将找不到为友元包含声明的 objManager(或成员函数)的类声明。但是,由于 objManager 声明位于 arrayObj 之前,因此不再为共享指针的内部 vector 声明 arrayObj。有没有办法在这个实例中转发声明 objManager 或以其他方式解决这个问题而不将 objManager 分解为单独的类?

最佳答案

您需要转发声明arrayObj,然后放置objManager 的完整定义,最后放置arrayObj 的定义:

class arrayObj;

class objManager {
    std::vector<std::shared_ptr<arrayObj>> array; // OK, fwd-declare is fine for this

public:
    void foo();

    // etc.
};

class arrayObj {
public:
    friend void objManager::foo();
    // etc.
};

为了声明一个 friend ,那个方法必须已经被看到,所以它必须先行。前向声明是 vector 的结果。

关于c++ - 没有类声明的友元成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27072692/

相关文章:

c++ - 使用模板将一组成员函数声明为友元

c++ - 警告定义在命名空间内声明的友元运算符

c++ - WSARecv() 可以立即返回数据吗?

c++ - 当使用私有(private)成员变量时,传递 lambda 是否违反封装?

java - 封装 Integer.parseInt() 的好方法

c++ - 原生类型的封装会影响效率吗?

c++ - wxThread 文档示例有用还是不好的编码实践?

c++ - 在 std::all_of 中调用一个函数

c++ - 放置新签名

c++ - 带有原始指针的 max_element 的索引