2013-03-27 2 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); 
} 

이것은 내 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); 
} 

내가 다형성을 이유로 형 모양의 공유 포인터를 선언

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': 재정의; 다른 기본 유형 1> \ \ drawview.cpp (53) 그릴 : '라인'의 선언을 참조

+3

나는 명칭을 명명'멤버-variable'를 사용하여 기능 * 매개 변수 이름 *을 사용하여 지금 당신을 경고하는 것'm_xxxxx'는 shared_ptr의 사이에 주조의 올바른 사용을 위해이 http://www.cplusplus.com/reference/memory/dynamic_pointer_cast/

참조 마이크로 소프트 중심의 코딩 관행 ** 미친 **을 다루는 데 익숙한 사람을 운전할 것입니다. 그 새를 죽여라. ** 지금 **. – WhozCraig

답변

0

라인

void Draw(Gdiplus::Graphics & m_GraphicsImage) 

Line:: 당신이 정의하는없이

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

을 읽어야을 Draw()이라는 무료 함수는 Line::Draw()과 동일한 서명을 가지지 만 그렇지 않으면 관련이 없습니다.

+0

여전히 C2259 오류가 발생합니다. 'Shape': 컴파일 할 때 추상 클래스를 인스턴스화 할 수 없습니다. – user1665569

+0

Kiley가 언급했듯이 Shape 인스턴스를 만들려고 std :: make_shared를 수행하고 있습니다. 그 점은 Shape가 순수 가상 그리기 메서드를 가지고 있기 때문에 분명히 그렇게 할 수 있다는 것입니다. 이것은 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 클래스를 인스턴스화하려고합니다.