• 5829阅读
  • 2回复

C++运算符重载之指鹿为马(类型转换) [复制链接]

上一主题 下一主题
离线athxy
 

只看楼主 倒序阅读 楼主  发表于: 2009-11-18

C++运算符重载之指鹿为马(类型转换)

帖子由 tiger » 2009-08-14 21:13[url][/url]
C++的运算符重载是这个语言的一个非常强大的表现力一个方面,运算符重载中有几个比较独特的行为,如:函数对象、类型转换等,这里简单的写几行代码(类型转换),把一头鹿变为一匹马 :lol: :lol:

代码: 全选
    /*
    * type_conv.cpp
    *
    *  Created on: 2009-8-14
    *      Author: kwarph
    *        Mail: kwarph@gmail.com
    */
    #include <iostream>

    using namespace std;

    class Horse {
    public:
        Horse() :
            weight(0), speed(0), teeth(0) {
        }

        Horse(const int& w, const int& s, const int& t = 0) :
            weight(w), speed(s), teeth(t) {
        }

        void neigh() const {
            cout << "吾本千里马也! " << "体重: " << weight << ", 奔跑时速: " << speed << endl;
        }

        // 其它成员函数略 ...

    private:
        int weight;
        int speed;
        int teeth;

        // 其它成员变量略 ...

    };

    class Deer {
    public:
        Deer() :
            weight(0), speed(0) {
        }

        Deer(const int& w, const int& s) :
            weight(w), speed(s) {
        }

        operator Horse() const {
            return Horse(weight, speed);
        }

        operator int() const {
            return weight + speed;
        }

        void speak() const {
            cout << "我是如假包换的鹿" << endl;
        }

        // 其它成员函数略 ...

    private:
        int weight;
        int speed;

        // 其它成员变量略 ...

    };

    void listen(const Horse& h) {
        h.neigh();
    }

    int main() {
        Deer d(40, 68); // 这是一头鹿,40kg体重,时速68公里的奔跑速度
        d.speak(); // 不信听他说的:我是如假包换的鹿

        listen(d); // 可是在这里,鹿却变成了马,听他的嘶鸣:
                   // 吾本千里马也! 体重: 40, 奔跑时速: 68

        // 更糟糕的是,一头鹿还可以变成int,不然他怎么会与int为伍?整个一部《哈利波特》
        int n = 12 + d; // 12 + 40 + 68 = 120
        cout << n << endl;  // 120
    }http://www.xuanyuan-soft.cn/forums/index.php?f=5&t=103&rb_v=viewtopic

Q Q 570508473
www.xuanyuan-soft.cn
离线foxyz

只看该作者 1楼 发表于: 2009-11-18
这个鼓励一下. 主要是重载cast比较少用到。一般在以下这种情况下用到多点。一个数据类和一个该类的包装类(或者管理类),包装类组合有该数据类,包装类重载cast operator返回数据类, 某个公共函数的传入参数是数据类,那么可以直接把该包装类当作数据类放在传入参数上船进去.比如:
class QdbArg
{
public:
   char *Buffer;
   QString Key;                           // Primary/Secondary Search Key
   QString PKey;                          // Primary Key used in Next
   int Index;
   int Keysiz;
   int Bufsiz;
   int Xfer;
   int *Errknt;
   int *Wrnknt;
   int *First;                              // Indicates Initial/Pending Search
   QString LockKey;
   int *Locked;
   char *Direction;                         // 'U'/'D'
};



class QdbArgContainer
{
   QdbArg arg;

public:

   QdbArgContainer();
   ~QdbArgContainer();
   void Clear();
   QdbArg *GetArg()                         { return &arg; }
   char *GetBuffer()                        { return arg.Buffer; }
   QString GetKey()                         { return arg.Key; }
   QString GetPKey()                        { return arg.PKey; }
   QString GetLockKey()                     { return arg.LockKey; }
   int GetErrorCount()                      { return *arg.Errknt; }
   int GetWarningCount()                    { return *arg.Wrnknt; }
   int GetLocked()                          { return *arg.Locked; }
   int *GetErrorPtr()                       { return arg.Errknt; }
   int *GetLockedPtr()                      { return arg.Locked; }
   void SetBuffer(char *buffer)             { arg.Buffer = buffer; }
   void SetIndex(int index)                 { arg.Index = index; }
   void SetKeySize(int keySize)             { arg.Keysiz = keySize; }
   void SetBuffSize(int buffSize)           { arg.Bufsiz = buffSize; }
   void SetXfer(int xfer)                   { arg.Xfer = xfer; }
   void SetFirst(int first)                 { *arg.First = first; }
   void SetLocked(int locked)               { *arg.Locked = locked; }
   void SetKey(const char *key)             { arg.Key = key; }
   void SetPKey(const char *pKey)           { arg.PKey = pKey; }
   void SetLockKey(const char *lockKey)     { arg.LockKey = lockKey; }
   operator QdbArg *()                      { return &arg; }              //擦
};
离线athxy

只看该作者 2楼 发表于: 2009-11-25
谢谢!!!
Q Q 570508473
www.xuanyuan-soft.cn
快速回复
限100 字节
 
上一个 下一个