首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++中的生成器 - 无效使用非静态数据成员

在 C++ 中,生成器是一种特殊的函数,它可以在其内部生成一系列值并返回它们。生成器函数使用关键字 yield 来返回一系列值,而不是使用传统的 return 语句。

在 C++ 中,生成器函数的定义方式与普通函数类似,但需要使用关键字 generator 来声明。生成器函数的返回类型应该是一个迭代器,它可以用来迭代生成器函数返回的值。

在生成器函数中,可以使用非静态数据成员来生成一系列值。但是,在使用非静态数据成员时,需要注意以下几点:

  1. 生成器函数的每次调用都应该返回一个新的迭代器,而不是修改原来的迭代器。
  2. 如果生成器函数使用了非静态数据成员,则应该将其声明为 mutable,以便在生成器函数中进行修改。
  3. 如果生成器函数使用了非静态数据成员,则应该在生成器函数中使用 this 指针来访问它们。

以下是一个使用非静态数据成员的生成器函数示例:

代码语言:c++
复制
class MyGenerator {
public:
    generator<int> generate() {
        for (int i = 0; i < 10; ++i) {
            co_yield i;
        }
    }
};

int main() {
    MyGenerator gen;
    for (int i : gen.generate()) {
        std::cout << i << std::endl;
    }
    return 0;
}

在这个示例中,MyGenerator 类包含一个生成器函数 generate(),它使用 co_yield 来生成一系列值。生成器函数的返回类型是 generator<int>,它是一个迭代器,可以用来迭代生成器函数返回的值。

main() 函数中,我们创建了一个 MyGenerator 对象 gen,并使用 generate() 函数生成一系列值。我们使用范围 for 循环来迭代生成器函数返回的值,并将它们打印到控制台上。

总之,在 C++ 中,生成器函数是一种特殊的函数,可以用来生成一系列值并返回它们。生成器函数可以使用非静态数据成员来生成值,但需要注意一些限制和要求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

静态成员函数访问静态数据成员C++

初始化: 类型 类名 :: 静态数据成员 = 初始化值 ; 详解:静态数据成员必须在类外初始化,不可在类体内,因为:构造函数,如果可以,则每次建立对象,都会对静态数据成员值进行修改,这违背静态数据成员使用目的...,为了能处理静态数据成员静态成员函数不能默认引用本类静态数据成员原因: 当调用一个对象静态成员函数时,系统会将该对象起始地址赋予成员函数this指针。...然而,静态成员函数不属于对象,无this指针。所以静态成员函数不能访问类默认静态成员静态成员函数和静态数据成员)。...//静态成员函数类外定义 参数表创建对象 cout << "x=" << m.x << endl; //<em>静态</em><em>成员</em>函数通过对象访问<em>非</em><em>静态</em><em>数据</em><em>成员</em> cout << "y=" <...若必须要访问,则有两种方式,且一般<em>使用</em>第二种居多。 对象名 . <em>非</em><em>静态</em><em>成员</em> ; 类名 :: <em>非</em><em>静态</em><em>成员</em> ; 故:实例化对象即可完成对<em>非</em><em>静态</em><em>数据</em><em>成员</em><em>的</em>访问

1.1K20

C++静态数据成员静态成员函数

我们需要一个成员为所有对象所公有,而且在需要更新这个公有属性时候只需修改一次。 因此,C++提供了静态数据成员来描述类对象相同属性。...在类定义时候静态数据成员是不分配内存,只有在创建类对象时候才分配内存,但静态数据成员是要分配内存,因为它是属于类,只有一块内存,所以要初始化它,而且不能在类声明初始化,必须要在类外初始化...静态成员函数 一般都是在静态成员函数修改静态数据成员,在刚刚手机类声明成员函数: static void change(); 就是静态成员函数。...我们给它来一个类外定义: void redmik30pro::change() { battery-=10; } 要注意是,静态成员函数只能访问静态数据成员静态成员函数,不能访问静态数据成员,如果要访问静态数据成员...首先,可能你在做题时候,题目要求你使用静态成员函数完成任务…… 开个玩笑啦…… 静态成员函数没有this指针,因为它在类创建时候就存在了,在没有创建类对象时候就已经存在静态成员函数,而普通函数必须在类对象被创建时候才能被使用

14730

C++】继承 ⑩ ( 继承机制 static 静态成员 | 子类访问父类静态成员方法 )

一、继承机制中派生类 static 关键字 1、子类继承父类静态成员 子类继承父类静态成员 : 父类 ( 基类 ) 使用 static 关键字 定义 静态成员变量 , 可以被所有的 子类 (...派生类 ) 共享 ; 2、父类静态成员访问控制权限改变 继承自 父类 静态成员变量 , 仍然遵循 继承 子类 访问控制特性 , public 公有继承 : 父类成员 在 子类 , 访问控制权限...成员 仍然是 private 成员 ; 3、子类如何访问父类静态成员 子类 使用 父类类名 :: 静态成员名 Parent::c = 20; 或 子类类名 :: 静态成员名 Child::c = 40...; 或 对象名.静态成员名 child.c = 30; 方式 , 访问 继承自 父类 静态成员 ; 4、静态成员使用要点 参考 【C++静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 |...静态成员不可用 int Parent::c = 10; 之后 , 才能使用 静态成员 , 如果没有在类外部初始化 , 该静态成员是无法使用 ; 二、完整代码示例 ---- 代码示例 : #include

26610

C++继承同名成员处理方式与同名静态成员处理方式

继承同名成员处理方式 问题:当子类与父类出现同名成员,如何通过子类对象,访问到子类或父类同名数据呢?...s.Base::func(); } int main() { test01(); system("pause"); return EXIT_SUCCESS; } 是否可以通过函数重载来区分父类和子类成员函数...子类对象加作用域可以访问到父类同名成员 当子类与父类拥有同名成员函数,子类会隐藏父类中所有的同名成员函数,加作用域可以访问到父类同名函数 继承同名静态成员处理方式 问题:继承同名静态成员在子类对象上如何进行访问...静态成员静态成员出现同名,处理方式一致 访问子类同名成员 直接访问即可 访问父类同名成员 需要加作用域 示例: 同名成员属性 class Base { public: static int...,需要加作作用域访问 Son::Base::func(100); } int main() { test02(); system("pause"); return 0; } 总结:同名静态成员处理方式和静态处理方式一样

46230

c++数据成员初始化次序

分享一个之前学知识点,感觉还挺重要,就是当一个类某个数据成员同时拥有就地初始化、构造函数初始化列表和构造函数函数体里赋值,那么它会先执行哪个?最后生效又是哪个呢?...根据老师讲解,数据成员初始化次序依次为: 就地初始化 > 构造函数初始化列表 >构造函数里赋值(严格意义上不能成为初始化) 而当三种初始化方式都有时,构造函函数体里赋值肯定执行,并且生效...,但是就地初始化和构造函数初始化列表执行情况是怎样呢?...所以当一个数据成员同时拥有就地初始化和初始化列表时,它会忽略就地初始化而执行构造函数初始化列表。...如果到代码有参构造函数函数体中加上 this->id = 20; ,运行结果会变为: 0 n = 1,id = 1 n = 1,id = 20 可以看到赋值把初始化列表给id初始化值覆盖掉了

79120

局部静态数据在多编译单元窘境

修饰) √ 上面提到局部静态数据就是除去第3种情形之外,其他1、2、4情形。...综上所言,本文标题含义是:如果在多文件,分别定义了多个静态数据(不含局部变量),那么他们之间相互依赖关系将会出现微妙窘境。 什么窘境呢?...事情是这样,由于静态数据会在程序运行开始时刻进行初始化(不管是指定初始化,还是系统自动初始化),并且C++标准没有规定多个文件这些静态数据初始化次序,这就会带来一个问题:如果局部静态数据相互依赖...BMW.startup(); // 使用car对象 } 很快,Rose代码便会遇到灾难性后果,因为C++编译时无法保证在MF对象初始化之时,汽车对象BMW究竟有没有初始化完毕。...因此,MF很有可能调用了一个未初始化对象startup函数,这很尴尬。 避免这种情况做法也很简单,那就是定义一个函数,专门用来处理这些引发麻烦多编译单元里局部静态数据

73220

C++关于使用[]定义静态数组和new分配动态数组区别

静态数组: int a[20]; int b[] = {1, 2, 3} 静态数组长度为常量,在栈中分配内存空间,会自动释放。使用sizeof时,计算是整个数组字节大小。...使用sizeof时,计算是指针变量所占内存字节大小。 在使用时,如果数组大小已经确定,可以使用静态数组,效率较高;如果数组大小需要在运行时确定(比如用户输入,函数参数传递等),则使用动态数组。...此外,如果需要在函数返回数组,则必须注意用静态数组时,由于内存在栈中分配,函数执行完毕时会自动销毁,所以返回一个静态数组变量是无意义使用动态数组就可以返回,并在不需要时注意delete释放堆内存

1.5K10

C++反射调用.NET(三) 使用泛型集合委托方法C++列表对象list C++传递集合数据给.NET创建泛型List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++CLI

在.NET与C++之间传输集合数据 上一篇《在C++反射调用.NET(二)》,我们尝试了反射调用一个返回DTO对象.NET方法,今天来看看如何在.NET与C++之间传输集合数据。...使用泛型集合委托方法 先看看.NET类一个返回列表数据方法: //返回List或者数组,不影响 C++调用 public List GetUsers(string...,好在IEnumerable也是继承 IEnumerable ,所以可以当做泛型对象在C++访问,因此创建上面的委托方法是可行。...+,常常使用 list来表示一个列表数据,例如上面方法代码: std::list cppResult; 为此C++需要包含以下头文件: #include  ...所以如果你能够适当对要调用.NET方法进行封装,那么可采用使用弱类型集合传输数据方案,否则,就在C++/CLI端多写2行代码,使用强类型传输数据方案。

9K100

C++C++入门 — 类和对象初步介绍

缓存效率: 内存对齐也有助于提高缓存使用效率。现代CPU使用多级缓存系统,通常以固定大小块(缓存行)从主内存加载数据。...C++通过引入this指针解决该问题 即:C++ 编译器给每个“静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有“成员变量”操作,都是通过该指针去访问...在C++,this指针是一个隐含静态成员函数内部可用特殊指针,它指向当前正在调用该成员函数对象实例。...每次调用静态成员函数时,编译器都会自动将对象地址作为额外第一个参数传递给该函数 尽管在源代码我们并不直接看到这个参数。在函数体内部,this关键字用于引用这个隐含指针。...因此,this指针实际上是存在于每个静态成员函数执行上下文中,并且它始终指向当前调用该函数对象实例。 this指针可以为空吗?

8410

C++ 构造函数和析构函数

C++学习,可以把类当作一个模具,类所实例化出来对象就是根据这个模具所产生实体,对象可以看作是我们自己创建一个新数据类型。...不允许使用数据成员初始值设定项 }; 因此,初始化只能发生在类创建对象过程,但是由于访问权限原因,无法在类外访问某些成员变量,因此下面这种做法有时候是无效: circle C1; // 实例化一个对象...2.3 再加入静态成员变量 class person { static int age; //静态成员变量,存在全局区,不属于类对象一部分 static int ID; //静态成员变量...p 所占空间为:4 因此当向类中加入了静态成员变量时,类实例化对象占用4个字节空间,可以说明,静态变量属于类对象一部分。...,那么每次返回就变成了该对象本身,而非在值传递拷贝出来那一份数据

92000

REDHAWK——组件结构

1、为所有组件生成文件 编译相关文件 代码生成器创建以下文件,用于使用 Autotools 构建和安装组件: build.sh- 生成其中两个文件:其中一个位于顶级组件目录,另一个位于源目录...①、C++C++ ,生成枚举常量是嵌套命名空间中静态变量,位于顶级命名空间下 enums: enums::simple::LABEL enums::structprop::field::LABEL...enums::structseq_struct::field::LABEL ②、Java 在 Java ,生成枚举常量是嵌套静态公共静态变量,位于名为 顶级类下 enums: enums.simple.LABEL...①、C++ C++ 组件支持使用成员函数回调来通知属性值变化。 以下示例解释了如何为名为 MyComponent 组件类型为 float freqMHz 简单属性添加属性变更监听器。...当数据从事件频道到达时,此回调会被通知。 ①、使用 getData 方法 C++ 订阅者示例 以下是一个使用 getData 方法 C++ 订阅者示例。

9210

C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

;不同类对其const数据成员值可以不同,所以不能在类声明时初始化。...const成员函数:const对象不可以调用const成员函数;const对象都可以调用;不可以改变mutable(用该关键字声明变量可以在const成员函数中被修改)数据值。...每次使用时候必须从内存取出它值,因而编译器生成汇编代码会重新从它地址处读取数据放在左值。...静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++静态局部变量初始化节点又有点不太一样。...所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++是可以使用变量对静态局部变量进行初始化

1.8K20

C++C++ this 指针用法 ① ( C++ this 指针引入 | this 指针用法 | 代码示例 )

一、C++ this 指针 1、C++ this 指针引入 在 C++ , this 指针 是一个特殊指针 , 由系统自动生成 , 不需要手动声明定义 , 在类每个 静态成员函数... , 都可以调用 this 指针 ; this 指针 是指向 调用对象 自身 指针 , 也就是调用 该成员函数 实例对象 内存地址 ; 由于 this 指针只能在 静态成员函数内部使用...this 指针用法 C++ this 指针用法 : 使用 this 作为指针 : 在 静态成员函数 , 直接使用 this 作为 本实例对象 指针 ; this 使用 this-> 访问成员变量...: 在 静态成员函数 , 直接使用如下语法 , 访问 本实例对象 静态成员变量 ; this->成员变量名 *使用 (this)....访问成员变量 : 在 静态成员函数 , 直接使用如下语法 , 访问 本实例对象 静态成员变量 ; 先获取指针指向数据 然后访问数据成员变量 ; (*this).成员变量名 在 C++

22320

C++POD类型

C++ POD类型 背景 POD(Plain Old Data)指的是C++定义和C相兼容数据结构。...C++类类型引入了继承和派生等新概念,编译器无法解析这些复杂数据结构,因此C++提出POD数据结构概念用于兼容C语言,由于C++基本内置类型都是POD类型,因此我们一般讨论class、struct...POD类型优势 1. C内存布局兼容 POD类型兼容C内存布局,C++可以直接使用C库函数操作POD数据类型,POD类型在C和C++操作总是安全。 2....标准布局 所有静态数据均为标准布局类型 所有基类均为标准布局类型 所有静态成员具有相同访问权限 没有虚函数 没有虚基类 类第一个静态成员与其任何基类类型不同 要么所有基类都没有静态成员,...要么最下层子类没有静态成员且最多只有基类有静态数据成员(总之继承树中最多只能有一个类有静态数据成员) Reference [1] https://zhuanlan.zhihu.com/p/45545035

2.6K41

C++】面向对象模型 ① ( 面向对象设计 | 面向对象底层实现机制 | 程序内存结构 )

一、面向对象模型 1、面向对象设计 C++ 语言中 对 面向对象程序设计 支持有 : 封装 : 封装 静态 / 静态 成员变量 / 成员函数 继承 : 单继承 , 多继承 , 虚继承 ; 多态 :..., 实现 数据 和 行为 绑定 , 二者是有 关联性 ; C++ 对象模型 成员变量可以是 公有的 : 可以直接被对象访问 ; 私有的 : 只能被对象自身成员函数访问 ; 受保护 :...只能被对象自身成员函数和派生类访问 ; C++ 成员变量 有两种类型 : 静态成员变量 : 使用 static 修饰成员变量 ; 静态成员变量 : 就是 普通成员变量 ; C++ 成员函数...有 3 种类型 : 静态成员函数 : 使用 static 修饰 成员函数 ; 静态成员函数 : 普通 成员函数 ; 虚函数 : 使用 virtual 修饰 成员函数 ; 3、程序内存结构 计算机实际程序结构...虚函数机制等 多方面问题 ; 每个 C++ 类 实例对象 都有其自身内存空间 , 包括 成员变量 和 成员函数 ; 成员变量是对象数据 , 成员函数是对象行为 ; 4、代码示例 - 对象内存结构测试

17510

CCPPstatic用法:全局变量与局部变量

另外,在C++,需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类封装性,即要求此成员隐藏在类内部,对外不可见时,可将其定义为静态数据。...在C++static内部实现机制:静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。...(3)静态成员函数主要用来方位静态数据成员而不能访问静态成员C++静态成员详细讲解 在C++静态成员是属于整个类而不是某个对象,静态成员变量只存储一份供所有对象共用。...在C++静态成员变量和静态成员函数是个容易出错地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象。...结论5:类静态成员变量必须先初始化再使用。 结合上面的五个例子,对类静态成员变量和成员函数作个总结: 一。静态成员函数不能调用静态成员。 二。静态成员函数可以调用静态成员

1.2K20

(浅显一些探索)

} } 上面代码测试了一些常规方法。下面简单说明几点 1:首先静态成员内部类里面是不可以定义静态属性,否则编译不会通过。...2:静态成员内部类成员不能被外部直接访问,不能只通过实例外部类访问内部类成员 3:访问静态成员内部类成员属性可以通过外部类实例对象.new 内部类, 示例如下 // An highlighted...5:静态成员内部类可以访问到外部私有化属性。 ---- 6:外部类也是不能直接访问静态局部成员内部类成员,这个特点同属于对内部类访问特点。...8:静态成员内部类不可以访问到外部类私有化成员 9:静态成员内部类可以直接访问到外部类静态成员 10:静态成员内部类不能直接访问外部类静态成员 局部内部类 局部内部类是一个在方法定义内部类...无论是静态还是非静态,都是一样法则。 特别注意它作用范围,就是是去实例化它所在类,只要不再方法体内都是无效

22120

C++静态成员

C++在类中提供了静态成员。这是非常有必要,因为我们程序设计者是需要这样特性。 静态数据成员 对于静态数据成员,每个类对象都有自己拷贝。而静态数据成员被当作是类成员。...(类每一个实例都共享这一个成员)无论这个类对象被定义了多少个,静态数据成员在程序只有一份拷贝,由该类型所有对象共享访问。(包括派生类对象)。这种需求我们还是经常有的。...C++提供了这样得方法,但是该方法得使用比较特殊。静态数据成员必须在类外初始化一下,否则会导致编译错误。 注:不要试图在头文件定义(初始化)静态数据成员。...静态函数成员 静态函数成员也是属于整个类,无需对象我们也能访问它。这样在大多数情况下可能会出错(比如你在没有创建对象时候,访问了一个静态数据成员),因此C++静态成员函数做了限制。...它只能操作类静态数据成员和类静态函数成员。类普通函数可以访问它们。 这种函数也很有必要,因为他能在我们不创建对象情况下,让我们知道类静态数据成员是什么样子。

44920
领券