第三十九讲 深入class(2)

      上周五我们做了一个单元格的类——SpreadSheetCell,如果我们要做一个电子表格,那么我们就会使用他作为基础,当然并非基类,基类留待继承的时候再说,我们今天的类容是怎么进一步使用这个类去开发其他的东西,就引用C++高级编程里面的一个例子,我们那他来做个电子表格的应用。
电子表格大家都司空见惯了,由一个个的电子表格组成,横竖排列,这让我们想起了二维数组,如果大家还是不熟悉二维数组的话,那么简单点说,就是指针的指针,通常情况下,这两者是可以画上等号,所以,我们就要使用第三十八讲里我们开发的单元格:
————————————-
SpreadSheetcell  **m_Cell;


————————————–
当然,只有一个二维数组是不成事的,就算微软的excel,也不是无边无际的(话说,曾经我还很好奇的去一直往右下角走,但还真没找到尽头,但我想肯定是有尽头,大家不妨用排列组合计算一下吧),所以我们今天为了方便,我们可以给我们的电子表格定义大小。
———————————
int m_width,m_high;


———————————-
当然为了避免我们的取值在一个范围内,我们给添加两个全局变量,哦,不好,全局变量不利于OO思想,所以我们应该添加两个静态常量:
——————————————-
static const
int defaultwidth = 100;

static const
int defaulthigh = 100;

—————————————–
有了这两个静态常量,我们就可以在构造对象的时候可以用它们来作为参考对象。
目前,只需要这几个数据变量就能够构造出一个电子表格出来,现在我默认大家的都能清楚的理解下面的内容,所以我们直接来看看我们的界面:
————————————————
//SpreadSheetData.h
#pragma once
#include “Spreadsheetcell.h”

namespace My_Code{
class SpreadSheetData
{
public:
static const
int defaultwidth = 100;

static const
int defaulthigh = 100;

SpreadSheetData(int width,int high);

SpreadSheetData(SpreadSheetData &

Data);

virtual ~SpreadSheetData();

SpreadSheetData&

operator=(SpreadSheetData &

Data);

void SetCellAt(int x,int y,const SpreadSheetCell&

Cell);

SpreadSheetCell GetCell(int x,int y);

protected:
bool inRang(int val,int upper);

void CopyFrom(const SpreadSheetData &

Data);

int m_width,m_high;

SpreadSheetCell **m_Cell;

};

}
———————————————–
我们上面的界面接口不难,相信大家这些天也明白了,其实只有理清思路,C++开发业不是很难,是吧,现在有一个辅助函数我们得说一下:
——————————————–

void CopyFrom(const SpreadSheetData &

Data);


——————————————-
为什么我们会添加这个辅助函数呢?这个问题留待大家去思考,因为今天我不打算实现这个界面,今天我们要给出的实现是SpreadSheetcell的实现。
为什么我没有在当天定义界面的时候不给实现呢?因为我们现在学的是C++,他不仅是C的扩展,还是面向对象的编程语言,哦,说到此处,这让我想起某位朋友去面试C++服务器的职位的时候遇到的一个考题,当然,如果大家愿意要此题作为练习的话,我会在今天的内容结束时给大家也留这道面试题。话说回来,之所以没有及时实现,这就是一种面向对象的理解,C++面试中,想必有经历的人都深有感悟,面试官几乎第一个问题就是谈谈你对面向对象的理解,不知道大家的理解是什么,不过我的理解是让用户只知其然不知其所以然,所以,没有及时给大家实现就是为了让大家深悉此道,因为,每个人都是独立的个体,所以每个人的思维方式都不一样,所以每个人的实现方案都不一样,但好在,我们给出的接口是一样,要求实现的功能也一样,所以,大家怎么实现的可能没人会关心,作为一个使用者,他只知道调用方法就好,满足自己的要求就行。但出于教学的原因,我们还是来看下我们的视线方案:
———————————-
//SpreadSheetCell.h
#pragma once
#include <iostream>#include <string>using namespace std;

namespace My_Code{
class SpreadSheetCell
{
public:
SpreadSheetCell();

SpreadSheetCell(string str);

SpreadSheetCell(double initvalue);

SpreadSheetCell(const SpreadSheetCell&

);

~SpreadSheetCell();

SpreadSheetCell&

operator=(const SpreadSheetCell&

);

void SetDoubleValue(const double doublevalue);

void SetStringValue(const string stringvlaue);

double GetDoubleValue();

string&

GetStringValue();

SpreadSheetCell&

operator+(const SpreadSheetCell&

cell);

protected:
double stringtodouble(const string str);

string doubletostring(double value);

double m_value;

string m_Str;

};

}
———————————-
—————————————–
//SpreadStheetCell.cpp
#include “Spreadsheetcell.h”
#include <sstream>using namespace My_Code;

string SpreadSheetCell::doubletostring(double value)
{
ostringstream outstr;

outstr<<value;

return (outstr.str());

}
double SpreadSheetCell::stringtodouble(const string str)
{
double temp;

istringstream instr(str);

instr>>temp;

if(instr.fail() || !instr.eof())

return 0;

return temp;

}
SpreadSheetCell::SpreadSheetCell():
m_value(0),m_Str(“”)
{
}

SpreadSheetCell::~SpreadSheetCell()
{
}

SpreadSheetCell::SpreadSheetCell(double initvalue): m_value(initvalue),
m_Str(doubletostring(initvalue))
{
}

SpreadSheetCell::SpreadSheetCell(string str):
m_value(stringtodouble(str)),
m_Str(str)
{
}

SpreadSheetCell&

SpreadSheetCell::operator=(const SpreadSheetCell&

cell)
{
m_value = cell.m_value;

m_Str = cell.m_Str;

return *this;

}

void SpreadSheetCell::SetDoubleValue(const double doublevalue)
{
m_value = doublevalue;

m_Str = doubletostring(m_value);

}

void SpreadSheetCell::SetStringValue(const string stringvalue)
{
m_Str = stringvalue;

m_value = stringtodouble(m_Str);

}
string&

SpreadSheetCell::GetStringValue()
{

return m_Str;

}
double SpreadSheetCell::GetDoubleValue()
{

return m_value;

}
SpreadSheetCell&

SpreadSheetCell::operator+(const SpreadSheetCell&

cell)
{
m_value = m_value + cell.m_value;

m_Str = m_Str + cell.m_Str;

return *this;

}
———————————————–
 

上面说到一个朋友遇到的C++的面试题,大家有兴趣的话可以研究一下:
———————————
计算钟表上时针和分针之间的夹角(0~180°),当输入小时和分钟时计算出度数,例如,当输入6:0时候,结果如下:
06:00 = 180
————————————
这个面试题可以说极为简单,答案明天来揭晓,我觉得还是挺有意思的。

发表评论