VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 561|回复: 1

[原创] 关于类

[复制链接]
75_avatar_middle
最佳答案
0 
在线会员 发表于 2019-5-30 18:42:44 | 显示全部楼层 |阅读模式
本帖最后由 xx_player 于 2019-5-30 18:48 编辑

     想了一想,还是讲一讲类,有些回答,好像提问者没有看懂,应该是基础问题。就写了这一篇,只讲类声明和定义。
如果都懂,就pass。基础的东西,不复杂。
     类与窗口没关系,不讲窗口,就类。类在C++中不多,但是C++核心。
总结的可能还不是很详尽,总之不误导就行。
个人认为最好的最常见地是例四,例六和例九的方式,最好训练成为定式。
例程如下,讲解包含在例程中

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
//例一
//这是最普通的两个类及其实例(对象),无交集各自实现一个方法
//函数内定义类,也可函数外定义
void Demo1()
{
        class CA1
        {
        public:
                void Show() { cout << "Show() in CA" <<endl; }
        };
        class CB1
        {
        public:
                void Show() { cout << "Show() in CB" << endl; }
        };
        CA1 a;
        CB1 b;
        a.Show();
        b.Show();
}
//例二
//这两个类有一个有交集,实例传入另一个对象。实现对另一个方法的访问。
//函数内定义类,也可函数外定义
void Demo2()
{
        class CA2
        {
        public:
                void Show() { cout << "Show() in CA" << endl; }
        };
        class CB2
        {
        public:
                CA2*sibling;
                void SetSibling(CA2* p) { sibling = p; }
                void Show() { cout << "Show() in CB" << endl; }
                void Show1() { sibling->Show(); }
        };
        CA2 a;
        CB2 b;
        a.Show();
        b.Show();
        //传入要访问对象指针
        b.SetSibling(&a);
        //该方法内通过对象指针访问另一对象方法。
        b.Show1();

}
//例三
//类中通过友元函数访问,
//在函数内定义编译错,只能在函数外定义
class CA3
{
public:
        void Show() {        cout << "Show() in CA" << endl;        };
};
class CB3
{
public:
        void Show() { cout << "Show() in CB" << endl; };
        void friend Show1(CA3&p) {                 p.Show();        }
};
void Demo3()
{

        CA3 a;
        CB3 b;
        a.Show();
        b.Show();
      //友元函数
    Show1(a);
}
//例四
//类双向访问,
//1.需增加类抽象声明,不一定两者,增加也没问题,即class CB4;和class CA4;
//  这里class CB4是必须地。
//2.抽象类的实现必须在两个后面实现。
class CA4;
class CB4;
class CA4
{
public:
        void Show() { cout << "Show() in CA" << endl; }
        void Show(CB4&p);//这里不能写,由于CB4只是抽象类
};
class CB4
{
public:
        void Show() { cout << "Show() in CB" << endl; }
        void Show(CA4&p) { p.Show(); } //这里能写,由于CA4本生就是具体类
};
//这里写CA4:Show的实现部分,因为已包含CB4具体类,
//如果CB4放在前面,也不能在类内写实现,要放到两类后面写。
//当然,都可以在定义时不写,一起放到后面写。即.h里不写,放到.cpp文件写。但要注意.cpp要把具体类定义.h都包含。
//C++就是这样解决类相互嵌套地。
void CA4::Show(CB4&p) { p.Show(); }
void Demo4() {

        CA4 a;
        CB4 b;
        a.Show();
        b.Show();
        b.Show(a);
        a.Show(b);
}
//例五
//将类之一改造为派生类
//派生类一,无重载函数
//
void Demo5() {
        class CA5
        {
        public:
                void Show() { cout << "Show() in CA" << endl; }
        };
        class CB5:public CA5
        {
        public:
                void Show() { cout << "Show() in CB" << endl; }
        };
        CA5 a;
        CB5 b;
        CB5 c;
        a.Show();
        b.Show();
        ((CA5*)&c)->Show();//等于a.Show
}
//例六
//将类之一改造为派生类
//派生类二,重载函数
//
void Demo6() {
        class CA6
        {
        public:
                virtual void Show() { cout << "Show() in CA" << endl; }
        };
        class CB6 :public CA6
        {
        public:
                void Show() { cout << "Show() in CB" << endl; }
        };
        CA6 a;
        CB6 b;
        CB6 c;
        a.Show();
        b.Show();
        ((CA6*)&c)->Show();//无论改成何指针,都等于最终Show,这里是b.Show()

}
//例七
//静态函数
//  类中静态函数可以直接访问,但无法访问类中变量
void Demo7() {
        class CA7
        {
        public:
                static void Show() { cout << "Show() in CA" << endl; }
        };
        class CB7
        {
        public:
                void Show() { cout << "Show() in CB" << endl; }
                void Show1() { CA7::Show(); }
        };
        CB7 b;
        b.Show();
        b.Show1();
}
//例八
//静态指针
//  通过类中静态全局指针,保存任何需要访问的类实例,可以访问全部公用变量或方法
//  适合唯一实例对象。
//类不在函数内定义,只能在函数外,且静态全局变量要在类外初始化。
class CA8
{
        public:
                 void Show() { cout << "Show() in CA" << endl; }
};
class CB8
{
        public:
                static CA8*p;
                void Show() { cout << "Show() in CB" << endl; }
                void Show1() { if(p) p->Show(); }
};
//类静态成员初始化
CA8* CB8::p = NULL;
void Demo8() {
        CB8 b;
        CB8::p =(CA8*)&b;
        b.Show();
        b.Show1();
}
//例九
//类中类,记住根类指针,从根访问。
//申明定义同例四
//不能在函数中声明定义,只能在函数外声明定义
class CC9;
class CA9
{
public:
        void Show() { cout << "Show() in CA" << endl; }
        void Show1(CC9*p);
};
class CB9
{
public:
        void Show() { cout << "Show() in CB" << endl; }
        void Show1(CC9*p);

};
class CC9 {
        public:
                        CC9*cc;
                        CA9 a;
                        CB9 b;
};
void CA9::Show1(CC9*p) { p->b.Show(); }
void CB9::Show1(CC9*p) { p->a.Show(); }

void Demo9() {
        CC9 ab;
        ab.a.Show();
        ab.b.Show();
        ab.a.Show1(&ab);
        ab.b.Show1(&ab);
}
int main()
{
        //Demo1();
        //Demo2();
        //Demo3();
        //Demo4();
        //Demo5();
        //Demo6();
        //Demo7();
        //Demo8();
        Demo9();

    return 0;
}


关于类

              哇!这个东西也有一大堆。





上一篇:c++怎么运用java代码?
下一篇:C语言实现贪食蛇-源码
38_avatar_middle
最佳答案
0 
在线会员 发表于 2019-6-4 19:05:21 | 显示全部楼层
感谢楼主分享
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-26 10:49

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表