首页
学习
活动
专区
工具
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 静态成员函数通过对象访问非静态数据成员 cout 使用第二种居多。 对象名 . 非静态成员 ; 类名 :: 非静态成员 ; 故:实例化对象即可完成对非静态数据成员的访问

1.3K20
  • C++类的静态数据成员和静态成员函数

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

    19230

    【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

    54910

    C++一分钟之-C++中的静态成员与静态函数

    在C++编程中,静态成员与静态函数是类设计中的重要概念,它们打破了常规成员的“每个对象一份”的规则,为类的所有实例共享同一份数据或行为提供了途径。...静态成员函数 基本概念 静态成员函数不依赖于类的任何实例,它可以通过类名直接调用,不接收隐含的this指针。 用途 工具函数:执行与类相关的操作,但不需要访问非静态成员。...访问静态成员:操作静态成员变量的理想场所。 常见问题与避免 误用this指针:静态成员函数中不存在this指针,尝试使用会导致编译错误。...C++中提供了灵活的类设计方式,允许实现类级别的共享数据和行为。...通过本文的介绍和示例,希望你能准确把握静态成员与静态函数的精髓,避开常见的陷阱,更加自信地在C++项目中运用它们。

    23010

    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; } 总结:同名静态成员处理方式和非静态处理方式一样

    50330

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

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

    79420

    c++中类的数据成员初始化次序

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

    85020

    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行代码,使用强类型传输数据的方案。

    9.1K100

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

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

    12210

    【C++】 解决 C++ 语言报错:Invalid Use of ‘this’ Pointer

    引言 在 C++ 编程中,错误使用 this 指针(Invalid Use of ‘this’ Pointer)是常见的编译错误之一。...本文将深入探讨无效使用 this 指针的成因、检测方法及其预防和解决方案,帮助开发者在编写 C++ 程序时避免和处理这一问题。...无效使用 this 指针的成因 无效使用 this 指针的错误通常由以下几种原因引起: 在静态成员函数中使用 this 静态成员函数不属于某个具体对象,而属于类本身,因此无法访问 this 指针。...无效使用 this 指针的预防措施 避免在静态成员函数中使用 this 在静态成员函数中,使用类名直接访问静态成员和函数,避免使用 this 指针。...代码审查 通过仔细审查代码,特别是类的成员函数和构造函数,可以发现并修复 this 指针使用问题。 总结 无效使用 this 指针是 C++ 编程中常见的错误之一。

    20810

    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++ 订阅者示例。

    15310

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

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

    97100

    深度总结了类的相关知识)(上)

    缺点: 当程序规模增大时,函数之间的依赖和全局数据的管理变得复杂,维护难度增加。 缺乏对现实世界对象的建模能力,不易扩展。 C++中的面向过程编程:C++继承自C语言,因此可以使用面向过程编程风格。...它强调使用“对象”来组织代码,程序中的数据和操作被封装在对象中,具有更好的模块化和重用性。 特点: 封装:将数据和操作数据的函数封装在一个对象中,对外只暴露必要的接口,隐藏内部实现。...静态成员函数: 静态成员函数不能访问类的非静态成员(因为非静态成员是与具体对象绑定的),但它们可以访问静态成员变量。...,只会计算非静态成员 b 的大小。...因此,静态成员函数没有this指针,不能访问类的非静态成员。

    9510

    C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)

    在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。...:结构体对齐是为了满足处理器访问内存时的效率问题。 当处理器从对齐的地址处读取数据时,通常比从非对齐的地址处读取数据要快。此外,某些硬件平台可能根本不支持非对齐的内存访问。​​​​​​​...在C++中,当你有一个类(比如Date类)并且这个类有成员函数(比如Init和Print),编译器确实为每个非静态成员函数增加了一个隐藏的指针参数this。...在C++中,编译器为每个非静态成员函数隐式地传递一个名为this的指针,该指针指向调用该函数的对象。 这使得成员函数能够知道它们应该操作哪个对象的数据成员。这个过程对用户是透明的。...由于 p 是空的,this 指针也是无效的,因此程序崩溃。 this指针存在哪里? this 指针是 C++ 编译器在调用成员函数时自动添加的一个隐式参数。

    16110

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

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

    2.2K20

    【C++】剖析static关键字&&友元

    static啦~ 关键字static: 关键字static是什么: static是C/C++中的一个关键字,可以在函数和变量上使用(也就是他们的修饰符),主要作用是控制变量的存储方式和作用范围,被放在静态区中...~ C语言中主要修饰的对象:局部变量,全局变量,函数~ C++中主要也是修饰的变量和函数,但叫法不同,声明为static的类成员称为类的静态成员,分为两类: 用static修饰的成员变量,称之为静态成员变量...用static修饰的成员函数,称之为静态成员函数 C++中static的概念: 用static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进行初始化。...静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区 用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。...静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。

    7510

    【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++

    33820
    领券