C++沉思录“字符图像”的程序分析

本文介绍了一种使用C++处理字符图像的方法,包括创建字符图像、对其进行加框、横向拼接及纵向拼接等操作。文章通过具体示例展示了如何构建和操作字符图像。

《Ruminations on C++》一书中有一例子,要求显示“character strings“为“framed pictures”。

一、题目

给定一个字符串数组,编写程序,依次支持以下功能:
1. 显示“字符图像”:
按每行显示一个字符串的方式,打印出矩形字符阵列。矩形高为字符串数组的大小,宽为最长的字符串长度。
2. 对“字符图像”加框:上下左右各加一行;
3. 对两副“字符图像”横向拼接,顶边对齐;
4. 对两幅“字符图像”纵向拼接,左边对齐。
示例:

#include <iostream>
#include "Picture.h"

char *init[] = {"Paris", "in the", "Spring"};
int main(int argc, char* argv[])
{
    Picture p(init, 3);
    cout<<p<<endl;
    return 0;
}

输出结果:
这里写图片描述
加框后输出:
这里写图片描述
对以上两幅图像横向拼接后输出:
这里写图片描述
对以上两幅图像纵向拼接后输出:
这里写图片描述

二、程序设计
#ifndef PICTURE_H
#define PICTURE_H

#include <iostream>

class P_Node;

class Picture
{
    //友元的声明默认为extern,实现可以在类外定义,但必须在类内部声明.
    friend class String_Pic;
    friend class Frame_Pic;
    friend class HCat_Pic;
    friend class VCat_Pic;

    //友元函数是定义在类外的普通函数,它不属于任何类.
    friend std::ostream& operator<<(std::ostream&, const Picture&);
    friend Picture frame(const Picture&);
    friend Picture reframe(const Picture&, char, char, char);
    friend Picture operator&(const Picture&, const Picture&);
    friend Picture operator|(const Picture&, const Picture&);

public:
    Picture(const char* const*, int);
    Picture(const Picture&);
    ~Picture();
    Picture& operator=(const Picture&);
    P_Node* getNode() {return p;}
private:
    //供frame(),operator|(),operator&()函数使用, 用于隐式类型转换.
    Picture(P_Node*);

    //供P_Node的派生类获取字符图像的宽高, 因此将String_Pic,Frame_Pic,
    //VCat_Pic,HCat_Pic声明为friend类.
    int width() const;
    int height() const;

    //供operator<<()函数用于输出使用, 因此将operator<<()函数声明为friend函数.
    void display(std::ostream&, int, int) const;

private:
    P_Node* p;
};

class P_Node
{
    friend class Picture;
    friend Picture reframe(const Picture&, char, char, char);
protected:
    P_Node();
    virtual ~P_Node();
    virtual int height() const = 0;
    virtual int width() const = 0;
    virtual void display(std::ostream&, int, int) const = 0;
    virtual Picture reframe(char, char, char) = 0;
    int max(int, int) const;
private:
    //int use;
protected:
    //原来为private,由于派生类String_Pic的reframe成员函数需要修改use,所以更改访问权限.
    int use;

};

class String_Pic : public P_Node 
{
    friend class Picture;

    String_Pic(const char* const*, int);
    ~String_Pic();

    int height() const;
    int width() const;
    void display(std::ostream&, int, int) const;
    Picture reframe(char, char, char);

    char** data;
    int size;
};

class Frame_Pic : public P_Node
{
    friend Picture frame(const Picture&);

    Frame_Pic(const Picture&, char = '+', char = '|', char = '-');

    int height() const;
    int width() const;
    void display(std::ostream&, int, int) const;
    Picture reframe(char, char, char);

    Picture p;
    char corner;
    char sideborder;
    char topborder;
};


class VCat_Pic : public P_Node
{
    friend Picture operator&(const Picture&, const Picture&);

    VCat_Pic(const Picture&, const Picture&);

    int height() const;
    int width() const;
    void display(std::ostream&, int, int) const;
    Picture reframe(char, char, char);

    Picture top;
    Picture bottom;
};

class HCat_Pic : public P_Node
{
    friend Picture operator|(const Picture&, const Picture&);

    HCat_Pic(const Picture&, const Picture&);

    int height() const;
    int width() const;
    void display(std::ostream&, int, int) const;
    Picture reframe(char, char, char);

    Picture left;
    Picture right;
};

#endif//PICTURE_H

例子见附件:
http://download.youkuaiyun.com/download/xifens/9915050

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值