2013-03-27 6 views
0

У меня проблемы с полиморфизмом и чистыми виртуальными функциями. Мой основной классЧистые виртуальные функции и наследование

#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); 
} 

Это моя линия.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): ошибка C2371: 'line': redefinition; различные базовые типы 1> \ рисовать \ drawview.cpp (53): см декларирование 'линии'

+3

Я предупреждаю вас сейчас, что с помощью функции * имена параметров * с помощью 'член-variable' именования номенклатуры' m_xxxxx' является собирающийся привлечь всех, кто привык к практическим методам кодирования Microsoft ** безумным **. Убейте эту птицу ** сейчас **. – WhozCraig

ответ

0

Линия

void Draw(Gdiplus::Graphics & m_GraphicsImage) 

следует читать

void Line::Draw(Gdiplus::Graphics & m_GraphicsImage) 

Без Line:: вы определяете свободная функция, называемая Draw(), которая имеет ту же подпись, что и Line::Draw(), но в остальном не связана с ней.

+0

Я все еще получаю ошибку C2259: 'Shape': не может создать экземпляр абстрактного класса, когда я пытаюсь скомпилировать – user1665569

+0

Как упоминает Кили, вы делаете std :: make_shared, чтобы попытаться создать экземпляр Shape. Дело в том, что Shape имеет чистый виртуальный метод Draw, и вы, очевидно, захотите его таким образом. Это также означает, что Shape никогда не может быть создан. У вас могут быть указатели Shape и ссылки Shape, но они всегда должны указывать на производные, не абстрактные классы. – user2184879

+0

эй @ user2184879 вот что я хочу.Но у меня в настоящее время есть две разные функции, и я просто хочу создать экземпляр одного и использовать его для обеих функций, но я получаю ошибку переопределения строки ... – user1665569

2

Я считаю, что проблема заключается в ваш конструктор

std::make_shared<Shape> (m_shape); 

Что принципиально новая форма (абстрактный класс). Вместо этого вы должны использовать

std::make_shared<Line> (m_shape); 
0

Ошибка при создании экземпляра Shape, который является абстрактным классом.

Вышеупомянутый синтаксис 'auto line = std :: make_shared (m_shape);' является виновником.

В этом утверждении вы пытаетесь создать экземпляр класса Shape.

Обратитесь к этому http://www.cplusplus.com/reference/memory/dynamic_pointer_cast/

для правильного использования литья между shared_ptr

Смежные вопросы