【ThinkingInC++】31、嵌套友元

/**
* 功能:嵌套友元
* 时间:2014年8月21日07:21:29
* 作者:cutter_point
*/

#include<iostream>
#include<cstring>       //为了初始化时使用memset()
#include<cstdlib>

using namespace std;

const int sz=20;

struct Holder
{
private:
    int a[sz];  //一个整形数组
public:
    void initialize();      //初始化函数,初始化Holder
    struct Pointer;         //声明有这个结构体
    friend Pointer;         //声明友元

    struct Pointer
    {
    private:
        Holder* h;
        int* p;
    public:
        void initialize(Holder* h);  //这个是Pointer的初始化

        void next();    //下一个元素
        void previous();    //上一个元素
        void top();     // 得到起始下标为0的位置
        void end();     //得到起始下标为最后一个的位置

        int read();     //返回当前位置的值
        void set(int i);    //吧当前位置的值设置为i
    };
};

/*
使用C语言库函数memset()(在<cstring>中)可以使用上面的程序变得容易。
他吧起始于某一特定地址的内存(该内存作为第一个参数)从起始地址直至
其后的n(n作为第三个参数)个字节的所有内存都设置成同一个特定的值(该值作为第
二个参数)。
*/

//    void initialize();      //初始化函数,初始化Holder
void Holder::initialize()
{
    //int a[sz];  //一个整形数组
    memset(a, 0, sz*sizeof(int));
}

//        void initialize(Holder* h);  //这个是Pointer的初始化
void Holder::Pointer::initialize(Holder* rv)    //取得是指针,可以直接改变原值
{
    /*
    Holder* h;
    int* p;
    */
    h=rv;
    p=rv->a;
}

//        void next();    //下一个元素
void Holder::Pointer::next()
{
    if(p<&(h->a[sz-1]))
        ++p;
}

//        void previous();    //上一个元素
void Holder::Pointer::previous()
{
    if(p>&(h->a[0]))
        --p;
}

//        void top();     // 得到起始下标为0的位置
void Holder::Pointer::top()
{
    p=&(h->a[0]);
}

//void end();     //得到起始下标为最后一个的位置
void Holder::Pointer::end()
{
    p=&(h->a[sz-1]);
}

//int read();     //返回当前位置的值
int Holder::Pointer::read()
{
    return *p;
}

//void set(int i);    //吧当前位置的值设置为i
void Holder::Pointer::set(int i)
{
    *p=i;
}

int main()
{
    Holder h;
    Holder::Pointer hp, hp2;
    int i;

    h.initialize();
    hp.initialize(&h);
    hp2.initialize(&h);

    for(i=0 ; i<sz ; ++i)
    {
        hp.set(i);
        hp.next();
    }

    hp.top();   //这个数组的头
    hp2.end();  //这个数组的尾

    for(i=0 ; i<sz ; ++i)
    {
        cout<<"hp= "<<hp.read()
            <<", hp2= "<<hp2.read()<<endl;

        hp.next();
        hp2.previous();
    }

    system("pause");
    return 0;
}

【ThinkingInC++】31、嵌套友元

时间: 2024-10-15 18:49:26

【ThinkingInC++】31、嵌套友元的相关文章

Bootstrap系列 -- 31.嵌套分组

我们常把下拉菜单和普通的按钮组排列在一起,实现类似于导航菜单的效果.使用的时候,只需要把当初制作下拉菜单的“dropdown”的容器换成“btn-group”,并且和普通的按钮放在同一级 <div class="btn-group"> <button class="btn btn-default" type="button">首页</button> <button class="btn btn-

C++ primer plus读书笔记——第13章 类继承

第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生出新的类.而且可以在不公开实现的情况下将自己的类分发给其他人,同时允许他们在类中添加新特性. 2. 派生类构造函数首先创建基类对象,如果不调用基类构造函数,程序将使用默认的基类构造函数. 3. 创建派生类对象时,程序首先调用基类构造函数,然后再调用派生类构造函数.派生类对象过期时,程序将首先调用派生

SCSS是什么

SCSS即是SASS的新语法,是Sassy CSS的简写,是CSS3语法的超集,也就是说所有有效的CSS3样式也同样适合于SASS. SASS是CSS3的一个扩展,增加了规则嵌套.变量.混合.选择器继承等等.通过使用命令行的工具或WEB框架插件把它转换成标准的.格式良好的CSS代码. 1 例如: 2 3 ----------- 4 5 在SCSS中使用变量 6 7 ----------- 8 9 $blue: #3bbfce; 10 11 $margin: 16px; 12 13 .conten

ES6语法的学习与实践

ES6是JavaScript语言的新一代标准,是ECMAScript的第六个版本,加入了很多新的功能和语法,在很多框架,如在使用Vue,React等框架的项目中一般都采用ES6语法来编写的,下面对经常用到的ES6语法做简要的介绍. 1.let,const let和const是ES6中新增的两个关键字,用来生命变量,let和const都是块级作用域.let声明的变量只在let命令所在的代码块内有效.const声明一个只读变量,一旦声明,常量的值就不可更改.与var声明的变量不同,var声明的是函数

程序员学炒股(7) 股指期货收盘价对第二天开盘价有影响吗?

很多微博和文章都说,股指期货的收盘价对第二天开盘价影响很大,因为股指多交易15分钟,因此对股市的第二天开盘价影响非常大,网上有一个文章是这样说的: “股指期货开盘早于股市15分钟,收盘又晚15分钟,国泰君安研究员曾统计,股指期货晚收盘15分钟的涨跌对于次日期指走势的预测准确率达到了70%.” 看看这个文章的作者是江恩艾略特道氏,虽然不知道是啥,但是看着还是很唬人的,再看看这篇文章的访问次数695567次,可见还是有影响力的. 如果这篇文章说的是真的话,能够预测到第二天开盘的大盘也是很不错滴,我们

【C++】嵌套类、友元

黄邦勇帅 里面关于嵌套类的介绍我有疑惑.里面11.9说在创建一个外围类的对象时先执行嵌套类的构造函数然后再执行外围类的构造函数,析构函数则以相反的方式执行. 可是我编程实验了一下,创建外围类对象时并不会执行嵌套类的构造函数 #include<iostream> using namespace std; class A { public: int a, b, c; A() { a = b = c = 0; cout << " A construct" <&l

C++拾遗(十三)友元和嵌套类

友元类 使用友元的场合: 1.两个类既不是is-a关系也不是has-a关系,但是两个类之间又需要有联系,且一个类能访问另一个类的私有成员和保护成员. 2.一个类需要用到另外多个类的私有成员. C++primer一书中给出的例子:电视和遥控器. 1 class Tv //原始类 电视 2 { 3 public: 4 friend class Remote;//友元类声明 5 //.. 6 }; 7 8 class Remote //友元类 遥控器 9 { 10 // 11 }; 友元声明可以位于原

【ThinkingInC++】30、友元

/** * 功能:友元 * 时间:2014年8月20日16:13:42 * 作者:cutter_point */ /* *编译器知道如何传递一个地址,这一个地址具有固定的大小,而不管被传递的是什么对象 *然而试图传递整个对象的话,那么编译器就必须知道X的全部定义以确定他的大小以及如何 *传递,所以程序就无法声明一个类似于Y::g(X)的函数,所以下面的f(X*)函数必须是指针 */ struct X; struct Y { void f(X*); }; struct X //定义X类 { pri

类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

 1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPushButton> #include <QLabel> template<class T> class run { public: T w; void show() { w.show(); } void settext() { w.setText("A"); }