C++ 定义一个类,类的成员变量包含指针 示例1

编程环境:win10,vs2017

代码

#pragma once

#include <iostream>

 

//为了说明C++如何定义含有指针的类,

//定义一个DsNode类,DsNode类的功能是使用一个指针,保存4种不同类型的数据。

//这四种类型是 char,short,int,longlong

//转换函数(conversion function)

//仿函数(function-like classes)

//有指针的类,在析构时,要释放动态申请的堆内存

 

namespace ds08 {

 

    using namespace std;

 

    class DsData

    {

    private:

         char * data;  //保存数据的首地址

         size_t length;  //数据的长度

 

    private:

         void CreateValue(char * address, size_t len)

         {

             this->data = new char[len];  //动态申请的堆内存,用完了,要释放。

             memcpy(this->data, address, len);

             this->length = len;

         }

 

    public//构造 析构

         DsData():data(nullptr),length(0) {}

         DsData(const DsData& dd)

         {

             CreateValue((char *)(dd.GetData()), dd.length);

         }

 

         DsData& operator = (const DsData& dd)

         {

             if (this != &dd//dd和this不是同一个对象

             {

                  delete[] (this->data);  //删除旧的data

 

                  CreateValue((char *)(dd.GetData()), dd.length);  //建立新的data

             }

             return *this;

         }

 

         //析构

         ~DsData()

         {

             if (this->data != nullptr)

             {

                  delete[] this->data;  //必须显示析构数组,删除数组时,[]不能漏掉,否则会造成内存泄漏

             }

         }

 

    public//其他构造

         //保存 char 数据

         DsData(const char& i)

         {

             if (this->data != nullptr)

             {

                  delete[] this->data;

             }

             CreateValue((char *)(&i), sizeof(char));

         }

 

         //保存 short 数据

         DsData(const short& i)

         {

             if (this->data != nullptr)

             {

                  delete[] this->data;

             }

             CreateValue((char *)(&i), sizeof(short));

         }

 

         //保存 int 数据

         DsData(const int& i)

         {

             if (this->data != nullptr)

             {

                  delete[] this->data;

             }

             CreateValue((char *)(&i), sizeof(int));

         }

 

         //保存 long 数据

         DsData(const long long& i)

         {

             if (this->data != nullptr)

             {

                  delete[] this->data;

             }

             CreateValue((char *)(&i), sizeof(long long));

         }

 

    public//Get Set

         const char * GetData() const

         {

             return this->data;

         }

 

         const int& GetLength() const

         {

             return this->length;

         }

 

    public :

         //4个转换函数 conversion function

         //将对象转换为数值

         operator char() const

         {

             if (length == 1)

             {

                  return *data;

             }

             else

             {

                  return (char)0;

 

             }

         }

 

         operator short() const

         {

             if (length == 2)

             {

                  return *(short *)data;

             }

             else

             {

                  return (short)0;

 

             }

         }

 

         operator int() const

         {

             if (length == 4)

             {

                  return *(int *)data;

             }

             else

             {

                  return (int)0;

 

             }

         }

 

         operator long long() const

         {

             if (length == 8)

             {

                  return *(long long *)data;

             }

             else

             {

                  return (long long)0;

 

             }

         }

 

    public:

         /*

         仿函数(function like classes)

         buffer : 缓冲区地址

         offset : 缓冲区偏移量

         isRead : true=从buffer里读数据. false=将数据写到buffer里

         将数据写到buffer里,或者从buffer里读数据

         */

         void operator () (char * buffer, int offset, bool isRead = false) const

         //仿函数定义 : 第一个()是调用运算符, 此运算符被重载。第二个()是定义参数。

         {

             if (isRead)

             {

                  //从buffer里读数据

                  memcpy(data, buffer + offset, length);

             }

             else

             {

                  //将数据写到buffer里

                  memcpy(buffer + offset, data, length);

             }

         }

 

    };

 

    //重载运算符 << ,不能在类的内部定义,只能放在类的外部定义。

    std::ostream& operator << (std::ostream& out, const DsData& dd)

    {

         if (&dd != NULL)

         {

             const char * b = dd.GetData();

             const char * e = b + dd.GetLength();

 

             char buffer1[100];

             snprintf(buffer1, 100, "Address=0x%08x  data=address:0x%08x length:%d value:",&dd,b, dd.GetLength());

             out << buffer1;

 

             char buffer[10];

             for (const char * i = b; i != e; ++i)

             {

                  snprintf(buffer, 10, "0x%02x", (unsigned char) *i);

                  out << buffer << " ";

             }

         }

         return out;

    }

 

    //测试代码

    void testDsData()

    {

         std::cout << " DsData 的长度 = " << sizeof(DsData) << std::endl;

 

         DsData dsNull;

         DsData dsChar('a');  //DsData(const char& i)

         DsData dsShort((short)100); //DsData(const short& i)

         DsData dsInt(200);  //DsData(const int& i)

         DsData dsLongLong(300LL);  //DsData(const long long& i)

        

         std::cout << endl << "构造执行结果" << endl;

         std::cout << "dsNull : " << dsNull << std::endl;

         std::cout << "dsChar : " << dsChar << std::endl;

         std::cout << "dsShort : " << dsShort << std::endl;

         std::cout << "dsInt : " << dsInt << std::endl;

         std::cout << "dsLongLong : " << dsLongLong << std::endl;

 

         DsData dsCopyCtr(dsLongLong);

         DsData dsAssignCtr(dsLongLong);

 

         std::cout << "dsCopyCtr : " << dsCopyCtr << std::endl;

         std::cout << "dsAssignCtr : " << dsAssignCtr << std::endl;

 

         cout << endl << "转换函数执行结果" << endl;

         char c = dsChar;

         cout << "char c : " << c << endl;

         short s = dsShort;

         cout << "short s : " << s << endl;

         int i = dsInt;

         cout << "int i : " << i << endl;

         long long l = dsLongLong;

         cout << "long long l : " << l << endl;

         int a = 100 + (int)dsInt;

         cout << "int a = 100 + (int)dsInt; => " << l << endl;

 

         std::cout << endl << "仿函数调用执行结果" << endl;

         char buffer[4] = {100,100,100,100};

         dsInt(buffer, 0, true)//调用仿函数

         std::cout << "dsInt : " << dsInt << std::endl;

    }

}

测试代码的输出

DsData 的长度 = 8

 

构造执行结果

dsNull : Address=0x00aff904  data=address:0x00000000 length:0 value:

dsChar : Address=0x00aff8f4  data=address:0x00d65b80 length:1 value:0x61

dsShort : Address=0x00aff8e4  data=address:0x00d65bb0 length:2 value:0x64 0x00

dsInt : Address=0x00aff8d4  data=address:0x00d658a8 length:4 value:0xc8 0x00 0x00 0x00

dsLongLong : Address=0x00aff8c4  data=address:0x00d6f700 length:8 value:0x2c 0x01 0x00 0x00 0x00 0x00 0x00 0x00

dsCopyCtr : Address=0x00aff8b4  data=address:0x00d6f850 length:8 value:0x2c 0x01 0x00 0x00 0x00 0x00 0x00 0x00

dsAssignCtr : Address=0x00aff8a4  data=address:0x00d6f540 length:8 value:0x2c 0x01 0x00 0x00 0x00 0x00 0x00 0x00

 

转换函数执行结果

char c : a

short s : 100

int i : 200

long long l : 300

int a = 100 + (int)dsInt; => 300

 

仿函数调用执行结果

dsInt : Address=0x00aff8d4  data=address:0x00d658a8 length:4 value:0x64 0x64 0x64 0x64

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值