`
kmplayer
  • 浏览: 509920 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

句柄的使用实例

阅读更多
1,这个实例采用了使用计数策略.

2,实例代码:
#include <iostream>
#include <string>
#include <set>
#include <map>
#include <utility>
#include <cstddef>
#include <stdexcept>
#include <algorithm>
using namespace std;

class Item_base
{
friend istream& operator>>(istream&, Item_base&);
friend ostream& operator<<(ostream&, const Item_base&);
public:
    virtual Item_base* clone() const
    {
        return new Item_base(*this);
    }
public:
    Item_base(const string &book = "",double sales_price = 0.0):
            isbn(book), price(sales_price) { }

    string book() const //接口和实现
    {
        return isbn;
    }

    virtual double net_price(size_t n) const //接口和缺省
    {
        return n * price;
    }

    virtual ~Item_base() { } //基类必须的虚析构
private:
    string isbn;
protected:
    double price;
};


class Bulk_item : public Item_base //一个继承类
{
public:
    Bulk_item* clone() const //配合计数句柄
    {
        return new Bulk_item(*this);
    }

    Bulk_item(): min_qty(0), discount(0.0) { }

    Bulk_item(const string& book, double sales_price, size_t qty = 0, double disc_rate = 0.0):
            Item_base(book, sales_price),min_qty(qty), discount(disc_rate) { }

    double net_price(size_t) const; //继承的接口
private:
    size_t min_qty;
    double discount;
};
double Bulk_item::net_price(size_t cnt) const
{
    if (cnt >= min_qty)
        return cnt * (1 - discount) * price;
    else
        return cnt * price;
}

class Lim_item : public Item_base //第二个继承类
{
public:
    Lim_item* clone() const
    {
        return new Lim_item(*this);
    }

    Lim_item(const string& book = "", double sales_price = 0.0, size_t qty = 0, double disc_rate = 0.0):
            Item_base(book, sales_price), max_qty(qty), discount(disc_rate) { }

    double net_price(size_t) const;
private:
    size_t max_qty;
    double discount;
};
double Lim_item::net_price(size_t cnt) const
{
    size_t discounted = min(cnt, max_qty);
    size_t undiscounted = cnt - discounted;
    return discounted * (1 - discount) * price + undiscounted * price;
}

class Sales_item  //计数句柄类
{
public:
    friend class Basket;

    Sales_item() : p(NULL), use(new size_t(1)) {}

    Sales_item( const Item_base& item) : p(item.clone()), use(new size_t(1)) {}

    Sales_item(const Sales_item& s) : p(s.p), use(s.use)
    {
        (*use)++;
    }

    Sales_item& operator=(const Sales_item& rhs)
    {
        if( &rhs == this)
            return *this;
        (*rhs.use)++;
        decr_use();
        p = rhs.p;
        use = rhs.use;
        return *this;
    }

    ~Sales_item()
    {
        decr_use();
    }

    const Item_base* operator->() const
    {
        if (p)
            return p;
        else
            throw logic_error("unbound Sales_item");
    }

    const Item_base& operator*() const
    {
        if (p)
            return *p;
        else
            throw logic_error("unbound Sales_item");
    }

private:
    Item_base* p;
    size_t* use;
    void decr_use()
    {
        if( --(*use) == 0)
        {
            delete p;
            delete use;
        }
    }
};

inline bool compare(const Sales_item &lhs, const Sales_item &rhs) //比较函数,构造map容器.
{
    return lhs->book() < rhs->book();
}

class Basket //一个操作类
{
    typedef bool (*Comp)(const Sales_item&, const Sales_item&);
public:
    typedef multiset<Sales_item, Comp> set_type;
    typedef set_type::size_type size_type;
    typedef set_type::const_iterator const_iter;

    Basket(): items(&compare) { }  // 初始化

    void add_item(const Sales_item &item)
    {
        items.insert(item);
    }

    size_type size(const Sales_item &i) const
    {
        return items.count(i);
    }

    double total() const;  // sum of net prices for all items in the basket

private:
    std::multiset<Sales_item, Comp> items;
};

double Basket::total() const
{
    double sum = 0.0;

    for (const_iter iter = items.begin(); iter != items.end(); iter = items.upper_bound(*iter))
    {
        int num = items.count(*iter);
        double value = (*iter) -> net_price(num);
        cout << "ISBN: " << (*iter) -> book()
             << "\tnumber sold: " << num
             << "\ttotal price: " << value
             << endl;
        sum += value;
    }
    return sum;
}

int main()
{
	Sales_item item1(Item_base("123", 45));
	Sales_item item2(Bulk_item("345", 45, 3, .15));
	Sales_item item3(Bulk_item("678", 55, 5, .25));
	Sales_item item4(Lim_item("abc", 35, 2, .10));
	Sales_item item5(Item_base("def", 35));

	Basket sale;
	cout << "added first item" << endl;
	sale.add_item(item1);
	sale.add_item(item1);
	sale.add_item(item1);
	sale.add_item(item1);
	sale.add_item(item2);
	sale.add_item(item2);
	sale.add_item(item2);
	sale.add_item(item2);
	sale.add_item(item2);
	sale.add_item(item2);
	sale.add_item(item2);
	sale.add_item(item2);
	sale.add_item(item3);
	sale.add_item(item3);
	sale.add_item(item3);
	sale.add_item(item3);
	sale.add_item(item3);
	sale.add_item(item3);
	sale.add_item(item3);
	sale.add_item(item3);
	sale.add_item(item4);
	sale.add_item(item4);
	sale.add_item(item4);
	sale.add_item(item4);
	sale.add_item(item4);
	sale.add_item(item4);
	sale.add_item(item5);
	sale.add_item(item5);
    cout << "added last item" << endl;
	cout << sale.total() << endl;
    return 0;
}
分享到:
评论

相关推荐

    VC 6.0 句柄的用法实例.rar

    包括了源代码,根据 VC 6.0的编程书籍中的例子修改而成的,向大家展示Windows程序内部运行原理,比如Windows应用程序,操作系统,计算机硬件之间的相互关系等,面向初学者参考的句柄例子。例子里面包括了了PPT教程,...

    C#句柄操作实例遍历窗体、载图

    在C#编程中,句柄(Handle)是一个用于标识操作系统对象(如窗口、控件或图像)的唯一数值。这个数值是由操作系统分配的,开发者可以通过句柄来操作这些对象。本教程将深入探讨如何在C#中进行句柄操作,特别是在遍历...

    C#得到所有窗口句柄简单实例源码

    本篇将详细介绍如何使用C#语言通过调用Windows API来获取所有窗口的句柄,并提供一个简单的实例源码。 首先,我们需要了解Windows API。API(Application Programming Interface)是操作系统为开发者提供的函数库,...

    C#句柄获得的简单例子

    句柄应用的简单例子,可以根据鼠标移动位置的坐标 获得该坐标对应程序的句柄相关信息

    VB读取句柄实例EnumerationX

    总结来说,这个实例"VB读取句柄实例EnumerationX"涵盖了VB中使用API函数获取和操作窗口句柄的基本技巧,涉及到API导入、句柄枚举、窗口操作等核心概念。这对于理解和开发系统级别的VB应用,尤其是涉及到多窗口交互或...

    获得窗体句柄函数总结

    #### 应用实例:获取对话框子窗口的句柄 在MFC中,使用 `AfxGetMainWnd` 可以获取主窗口的句柄。但若要获取对话框中的子窗口句柄,则需结合上述函数使用,例如通过 `EnumChildWindows` 遍历对话框的子窗口,找到...

    赋值后的静态句柄和实例莫名其妙消失了???在线等

    在编程过程中,我们可能会遇到一些看似诡异的问题,例如“赋值后的静态句柄和实例莫名其妙消失了”。这种情况通常出现在使用面向对象编程(OOP)语言,如Java、C#或Python时,涉及到静态变量和对象生命周期的管理。...

    c# 句柄类库 .net操作句柄

    本文将深入探讨C#中如何使用句柄类库进行.NET操作句柄,并通过`TestWin`这个示例文件名,推测这是一个关于Windows API交互的实例。 首先,让我们了解句柄的基本概念。句柄不是实际对象的指针,而是由操作系统分配的...

    VB Spy获取进程句柄源码实例.rar

    VB Spy获取进程句柄源码实例,列出出当前运行程序的窗口信息、子进程信息和鼠标坐标、句柄信息,程序可设置窗口总在最前端显示。

    使用JNA获取窗口句柄,并发送消息

    在这个例子中,我们使用`FindWindow`方法查找具有特定标题的窗口,并返回其句柄。句柄通常用于进一步操作,如发送消息。 发送消息到窗口则需要用到`SendMessage`函数。这个函数允许我们将特定的消息类型和参数发送...

    this 引用句柄例子大解析

    在本文中,我们将深入解析`this`引用句柄的使用、含义及其在实际编程中的应用。 `this`的基本概念: 1. `this`关键字代表了当前对象的引用,也就是说,它总是指向方法调用时的对象实例。 2. 当在类的成员变量和局部...

    窗口句柄浅析和获取窗口句柄的方法

    例如,`HINSTANCE`是实例句柄,`HBITMAP`是位图句柄,`HDC`是设备描述表句柄,`HICON`是图标句柄等。在C++的MFC库中,`CWinApp::m_hInstance`变量存储了应用程序的实例句柄,可以通过`AfxGetInstanceHandle()`函数...

    VB获取窗口句柄

    在编程领域,窗口句柄(Window Handle)是一个重要的概念,特别是在使用Visual Basic(VB)进行Windows应用程序开发时。窗口句柄是操作系统分配给每个窗口的一个唯一标识符,它是一个整数值,用来区分系统中的不同...

    MFC获得各类指针,句柄的方法

    - 使用`AfxGetInstanceHandle()`获取当前应用程序实例的句柄。 ```cpp HINSTANCE hInstance = AfxGetInstanceHandle(); ``` 2. **获取框架窗口句柄** - 获取主框架窗口的句柄。 ```cpp CMainFrame* ...

    句柄之深入解析

    根据《Microsoft Windows 3 Developer's Workshop》一书中的定义,句柄可以用于标识包括但不限于模块、任务、实例、文件、内存块、菜单、控件、字体、资源(如图标、光标、字符串)、GDI对象(如位图、画刷、元文件...

    获取任意窗口句柄

    在Windows操作系统中,窗口句柄(HWND)是一个整数值,它代表了一个特定的窗口实例。本教程将深入探讨如何在C#中获取任意窗口的句柄,并通过提供的源代码进行学习。 首先,理解窗口句柄的重要性。窗口句柄在处理...

    Java实现获取窗口句柄.zip

    以下是一个简单的使用JNI的例子: 1. 创建一个Java类,声明本地方法: ```java public class NativeWindow { static { System.loadLibrary("windowhandle"); // 加载本地库 } public native long ...

    C#查找窗口句柄的方法

    通过窗口句柄,开发者可以使用Win32 API函数对特定窗口进行操作,这些操作包括但不限于显示、隐藏、移动、调整大小以及发送和接收消息。 二、查找窗口句柄的方法 在C#中,通常需要借助P/Invoke技术来调用Windows ...

    VB查询QQ句柄并控制的实例

    VB查询QQ句柄并控制的实例

    句柄获取示例(制作模块方便调用)

    4. 实现句柄的查找和使用,这在需要控制其他应用程序或进行自动化操作时非常关键。 5. 学习如何组织和管理项目文件,包括编译和运行可执行文件。 6. 理解和应用Visual Basic的控件,如列表视图,以展示和管理数据。 ...

Global site tag (gtag.js) - Google Analytics