用C++设计一个矩形类

2024-12-29 11:05:12
推荐回答(3个)
回答1:

参考一下CRect的定义
class CRect : public tagRECT
{
public:

// Constructors

// uninitialized rectangle
CRect();
// from left, top, right, and bottom
CRect(int l, int t, int r, int b);
// copy constructor
CRect(const RECT& srcRect);
// from a pointer to another rect
CRect(LPCRECT lpSrcRect);
// from a point and size
CRect(POINT point, SIZE size);
// from two points
CRect(POINT topLeft, POINT bottomRight);

// Attributes (in addition to RECT members)

// retrieves the width
int Width() const;
// returns the height
int Height() const;
// returns the size
CSize Size() const;
// reference to the top-left point
CPoint& TopLeft();
// reference to the bottom-right point
CPoint& BottomRight();
// const reference to the top-left point
const CPoint& TopLeft() const;
// const reference to the bottom-right point
const CPoint& BottomRight() const;
// the geometric center point of the rectangle
CPoint CenterPoint() const;
// swap the left and right
void SwapLeftRight();
static void SwapLeftRight(LPRECT lpRect);

// convert between CRect and LPRECT/LPCRECT (no need for &)
operator LPRECT();
operator LPCRECT() const;

// returns TRUE if rectangle has no area
BOOL IsRectEmpty() const;
// returns TRUE if rectangle is at (0,0) and has no area
BOOL IsRectNull() const;
// returns TRUE if point is within rectangle
BOOL PtInRect(POINT point) const;

// Operations

// set rectangle from left, top, right, and bottom
void SetRect(int x1, int y1, int x2, int y2);
void SetRect(POINT topLeft, POINT bottomRight);
// empty the rectangle
void SetRectEmpty();
// copy from another rectangle
void CopyRect(LPCRECT lpSrcRect);
// TRUE if exactly the same as another rectangle
BOOL EqualRect(LPCRECT lpRect) const;

// inflate rectangle's width and height without
// moving its top or left
void InflateRect(int x, int y);
void InflateRect(SIZE size);
void InflateRect(LPCRECT lpRect);
void InflateRect(int l, int t, int r, int b);
// deflate the rectangle's width and height without
// moving its top or left
void DeflateRect(int x, int y);
void DeflateRect(SIZE size);
void DeflateRect(LPCRECT lpRect);
void DeflateRect(int l, int t, int r, int b);

// translate the rectangle by moving its top and left
void OffsetRect(int x, int y);
void OffsetRect(SIZE size);
void OffsetRect(POINT point);
void NormalizeRect();

// set this rectangle to intersection of two others
BOOL IntersectRect(LPCRECT lpRect1, LPCRECT lpRect2);

// set this rectangle to bounding union of two others
BOOL UnionRect(LPCRECT lpRect1, LPCRECT lpRect2);

// set this rectangle to minimum of two others
BOOL SubtractRect(LPCRECT lpRectSrc1, LPCRECT lpRectSrc2);

// Additional Operations
void operator=(const RECT& srcRect);
BOOL operator==(const RECT& rect) const;
BOOL operator!=(const RECT& rect) const;
void operator+=(POINT point);
void operator+=(SIZE size);
void operator+=(LPCRECT lpRect);
void operator-=(POINT point);
void operator-=(SIZE size);
void operator-=(LPCRECT lpRect);
void operator&=(const RECT& rect);
void operator|=(const RECT& rect);

// Operators returning CRect values
CRect operator+(POINT point) const;
CRect operator-(POINT point) const;
CRect operator+(LPCRECT lpRect) const;
CRect operator+(SIZE size) const;
CRect operator-(SIZE size) const;
CRect operator-(LPCRECT lpRect) const;
CRect operator&(const RECT& rect2) const;
CRect operator|(const RECT& rect2) const;
CRect MulDiv(int nMultiplier, int nDivisor) const;
};

回答2:

好题目,可扩展性很强,如果是老师给的题目那可真是个好老师.
不过析构函数不一定会用到

刚才随便写了点

.h

class CMYRC
{
public:
CMYRC( int left, int right, int top, int bottom, int size ); // 运动范围

void UserInit( int x, int y, int size ); // 初始化矩形
void SetMoveOrStop(); // 运动或静止
void MoveTo( int x, int y ); // 指定移动目的点
void GetCurPos( int &x, int &y ); // 取得矩形当前的坐标

private:
// 创建者设定
int m_left;
int m_right;
int m_top;
int m_bottom;
int m_size;

// 矩形中心坐标
int m_x;
int m_y;

// 运动
int m_x_to;
int m_y_to;

DWORD m_tick_lastmove;
DWORD m_speed_move;

// 其他属性
DWORD m_color;
DWORD m_tick_color; // 还可以加入颜色渐变
};

.cpp

CMYRC::CMYRC( int left, int right, int top, int bottom, int size )
{
m_left = left;
m_right = right;
m_top = top;
m_bottom = bottom;
m_size = size;

UserInit( rand(), rand(), size ); // 两个rand应该有个生成函数来保证在left right top bottom内
m_tick_lastmove = GetTickCount();
}

void CMYRC::UserInit( int x, int y, int size )
{
m_x = x;
m_y = y;
m_size = m_size;
}

void CMYRC::SetMoveOrStop()
{
if ( m_tick_lastmove == 0 )
{
m_tick_lastmove = GetTickCount();
// 需要检查是否有移动目的点 m_x_to m_y_to
}
else
{
DWORD tick = GetTickCount() - m_tick_lastmove;

int xlen = m_x_to - m_x;
int ylen = m_y_to - m_y;
int linelen = (int)sqrt( (float)(xlen*xlen + ylen*ylen) ); // 上次开始移动时距目的点总距离

int linepass = tick * m_speed_move; // 间隔时间内移动的距离

if ( linepass >= linelen )
{
m_x = m_x_to;
m_y = m_y_to;
}
else
{
// 计算xy的偏移得到当前时刻xy的值
}
m_tick_lastmove = 0; // 停止计时将 m_tick_lastmove 用做标志
}
}

void CMYRC::MoveTo(int x, int y)
{
if ( m_tick_lastmove != 0 )
{
SetMoveOrStop();
}

m_x = x;
m_y = y;

if ( m_tick_lastmove == 0 )
{
SetMoveOrStop();
}
}

void CMYRC::GetCurPos( int &x, int &y )
{
if ( m_tick_lastmove != 0 )
{
SetMoveOrStop();
}

x = m_x;
y = m_y;

if ( m_tick_lastmove == 0 )
{
SetMoveOrStop();
}
}

有点乱,突然想自己写个游戏玩了...

回答3:

//main.cpp
#include
using namespace std;
#include "Rectangle.h"
int main(void);

int main(void)
{
double li;
double wi;

cout<<"Input the width :"< cin>>wi;
cout<<"Input the length :"< cin>>li;
Rectangle MC(li,wi);
MC.print();

return 0;
}

//Rectangle.cpp
#include
using namespace std;
#include "Rectangle.h"

Rectangle::Rectangle(double l,double w)
{
length=l;
width=w;
area=length*width;
}

void Rectangle::print()
{
cout<<"The area of the rectangle is "<}

//Rectangle.h
class Rectangle
{
double length;
double width;
double area;
public:
Rectangle(double l,double w);
void print();
};

这个用不到析构函数