내 질문은 "다른 하위 클래스를 처리하지만 두 기본 클래스의 메서드에 액세스하는 일반 함수를 어떻게 구현할 수 있습니까?"입니다.
다음과 같이 구성된 가상 그래픽 라이브러리를 사용하고 있다고 상상해보십시오.
class Shape
{
// getters and setters are here
private:
int m_BorderColor;
int m_FillColor;
}
class Square : public Shape
{
}
class Triangle : public Shape
{
}
class TextBox : public Shape
{
}
... 등등.
라이브러리는 Shape 기본 클래스의 파생물 만 가상 캔버스에 추가 할 수 있습니다. 내 응용 프로그램에서 나는 각각의 모든 모양과 가능한 다른 속성에 텍스트 상자를 갖고 싶습니다.
따라서 다음과 같은 자체 기본 클래스를 갖고 싶습니다.
class MyBase
{
public:
SetText (string text) { m_Text.Text = text; }
// other getters and setters here
private:
TextBox m_Text;
int m_Id;
}
그런 다음 다음과 같은 텍스트 상자가있는 '내'모양을 가질 수 있습니다.
class MySquare : public Square, public MyBase
{
}
MySquare는 Shape의 하위 클래스이기 때문에 캔버스에 추가 할 수 있습니다. 사용자가 MySquare (또는 MyTriangle 등)를 두 번 클릭하면 텍스트를 변경하고 싶습니다. 하지만 런타임에 클릭 한 모양 만 알고 있습니다.
다음은 SetText가 Shape의 구성원이 아니고 라이브러리에서받은 포인터가 MyTriangle에 대한 포인터가 Shape에 캐스팅되기 때문에 분명히 작동하지 않습니다.
// double click handler
Shape* clicked_shape = clickEvent.GetShape();
clicked_shape->SetText("Foo");
런타임까지 어떤 모양 개체를 얻고 있는지 모르기 때문에 기본 클래스 포인터를 사용해야합니다. 따라서 다음은 잘 작동하지만 나에게는 유용하지 않습니다.
// double click handler
Shape* clicked_shape = clickEvent.GetShape()
((MyTriangle*)clicked_shape)->SetText("Foo")
이 문제에 대한 통찰력이나 더 나은 패턴에 감사드립니다!
이건 어때?
MyBase * base = dynamic_cast<MyBase *>(clicked_shape);
base->SetText("too");
base
얻는 Shape가 실제로 귀하의 것이 아닌 경우 null인지 확인하고 싶을 수 있습니다 .
MyBase
이를 위해 적어도 하나의 가상 기능이 필요합니다-소멸자는 할 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다