纯虚函数和继承
我在多态和纯虚函数方面存在问题。我的主类纯虚函数和继承
#include<memory>
class Shape
{
public:
Gdiplus::Point start;
Gdiplus::Point end;
std::shared_ptr<Gdiplus::Pen> m_pen;
virtual void Draw(Gdiplus::Graphics & m_GraphicsImage) = 0;
void setPen(std::shared_ptr<Gdiplus::Pen> pen2);
void setStart(int xPos, int yPos);
void setEnd(int xCor, int yCor);
};
然后我有这个派生自Shape的类。 Line.h
#pragma once
#include<memory>
class Line: public Shape
{
public:
void Draw(Gdiplus::Graphics & m_GraphicsImage);
}
这是我的line.cpp。
#include "stdafx.h"
#include "Line.h"
#include "ShapeMaker.h"
void Line::Draw(Gdiplus::Graphics & m_GraphicsImage)
{
m_GraphicsImage.DrawLine(m_pen.get(),start.X,start.Y,end.X,end.Y);
}
在我主我宣布Shape类型的共享指针多态性原因
std::shared_ptr<Shape> m_shape;
,然后尝试,并呼吁Line.cpp功能,但它不能正常工作,
LRESULT CDrawView::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int xPos= GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
start.X = xPos;
start.Y = yPos;
//Line line;
auto line = std::make_shared<Shape> (m_shape);
std::shared_ptr<Gdiplus::Pen> myPen(pen.Clone());
line->setPen(myPen);
line->setStart(xPos,yPos);
return 0;
}
LRESULT CDrawView::OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int xPos= GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
end.X = xPos;
end.Y = yPos;
//Pen pen(Color(0, 0, 255));
//Line line;
auto line = std::make_shared<Shape> (m_shape);
line->setEnd(xPos,yPos);
line->Draw(m_GraphicsImage);
m_shape.reset();
RedrawWindow();
return 0;
} 现在我得到了drawview.cpp(54):error C2371:'line':redefinition;不同的基本类型 1> \画\ drawview.cpp(53):看 '线' 的声明
线
void Draw(Gdiplus::Graphics & m_GraphicsImage)
应该读
void Line::Draw(Gdiplus::Graphics & m_GraphicsImage)
没有Line::
你定义一个名为Draw()
的免费函数,恰好与Line::Draw()
具有相同的签名,但与其他方式无关。
我仍然收到错误C2259:'Shape':当我尝试编译时无法实例化抽象类 – user1665569 2013-03-27 16:38:04
正如Kiley提到的,您正在执行std :: make_shared以尝试创建Shape实例。事情是Shape有一个纯虚拟的Draw方法,你显然想要这样。这也意味着Shape永远不会被实例化。你可以有Shape指针和Shape引用,但是它们应该总是指向派生的非抽象类。 – user2184879 2013-03-27 16:43:23
嘿@ user2184879这就是我想要的。但我目前有两个不同的功能,我只是想创建一个实例,并将其用于这两个功能,但我得到一个行重新定义错误... – user1665569 2013-03-27 16:46:46
我相信这个问题是你的构造
std::make_shared<Shape> (m_shape);
基本上是新的Shape(抽象类)。相反,你应该使用
std::make_shared<Line> (m_shape);
错误是为了实例化Shape,它是抽象类。
上述语法'auto line = std :: make_shared(m_shape);'是罪魁祸首。
在此声明中,您正试图实例化Shape类。
请参阅本 http://www.cplusplus.com/reference/memory/dynamic_pointer_cast/
铸造的正确使用之间的shared_ptr
我会用用'成员variable'命名命名功能*参数名*提醒你现在是'm_xxxxx'是去驱动任何习惯于处理以微软为中心的编码习惯的人** **疯狂**。现在杀死那只鸟**。 – WhozCraig 2013-03-27 16:43:17