当前位置: 首页 > 知识库问答 >
问题:

C Lambda捕获私有类成员

魏彦
2023-03-14

这是我课堂的一部分:

//...
        bool dump_dvars()
        {
            fstream& refvar{ output_file };

            for_each(_array_start, _array_start + *_array_size,
                [&refvar](const void* dvar) -> void
            {
                //work with output_file
            });

            return true;
        }

    private:
        void** _array_start;
        unsigned int* _array_size;
        fstream output_file;
    };

我想访问Lambda的私有成员变量output_文件,它位于公共成员函数dump_dvars中。当我捕获this指针时,我无法访问该变量,因为它是私有的,但我也不想将其公开!我已经读过这个问题(如何让lambda成为一个类的朋友?)但我不想创建另一个函数。因此,我目前解决这个问题的方法是创建对私有成员的引用,并通过引用捕获列表将该变量传递给我的Lambda。

这是一个好的解决方案和好的风格,还是有更好的解决方案?

共有1个答案

隗翰海
2023-03-14

你应该在lambda中捕获'this'。

下面的代码可以很好地编译g、clang、VS2010和VS2013。

#include <iostream>

class A
{
public:
    A() : x(5){}
    void f() const
    {
        ([this]()
        {
            std::cout << x << std::endl;
        })();
    }
private:
    int x;
};

int main()
{
    A a;
    a.f();
}
 类似资料:
  • 我需要捕获私有的内部调用方法。 然而,却始终得不到建议。我该怎么解决呢? 我也尝试过这个切入点: 和建议:

  • 本书之前提到了“封装”的概念,即指将一系列指令放在一个函数体内部的处理过程。而这样的做法则是为了将函数的接口与它的实现分离(函数接口指如何使用这个函数,函数实现则指如何去实现这个函数及实现具体做了些什么)。 上面提到这种封装可以命名为“功能封装”,用以区分本章将要介绍的“数据封装”。数据封装是基于这样的理念提出的:每一个结构的定义应当包括应用于本结构的函数集以及阻止对内部的无限制访问。 数据封装的

  • Singleton设计模式说我们应该在“single instance”类中定义一个私有静态属性。但是,没有适当的解释为什么数据成员必须是私有静态的。如果数据成员只是私有的,会有什么不同吗? 在以下代码中: 如果数据成员不是静态的,会有什么不同吗? 编辑:通过公开析构函数,它会改变单例设计的属性吗?

  • 注意:如果friend函数只是在类中声明并在外部实现,那么Clang和GCC都会拒绝该代码。

  • 问题内容: 是在类级别还是在对象级别的私有成员访问权限。如果是在对象级别,则以下代码不应编译 请说明在sub的messWithI()方法中访问obj的成员i是否有效 问题答案: 正如DevSolar所说的,它处于(顶级)类级别。 从Java语言规范的6.6节开始: 否则,如果将成员或构造函数声明为私有,则仅当访问发生在包含成员或构造函数的声明的顶级类(第7.6节)的主体内时,才允许访问。 请注意,