[MFC] 자식 다이얼로그에서 부모 다이얼로그에 있는 멤버변수 사용

duraduri의 이미지

안녕하세요 이제야 서울은 비가 그쳤네요

질문이 있어 글을 올립니다.

다이얼로그 베이스로 프로젝트를 진행하고 있습니다.

이를 A다이얼로그라고 하겠습니다. A다이얼로그에서 버튼을 클릭하면

B다이얼로그가 생성됩니다. 이 B다이얼로그는 A다이얼로그 안에 위치하고요

문제는 A다이얼로그에서 그림을 그려주는데 이 그림을 B에서 똑같이 그려주고

싶습니다. 이미 A다이얼로그에서 이미지를 로드해서 메모리에 올려놨기 때문에

B다이얼로그에서는 A다이얼로그의 멤버변수 m_img를 가져와서 쓰고 싶은데

잘 되지 않네요. B다이얼로그를 생성할때 this로 A를 넘겨주었는데

B의 생성자에서 CWnd로 받더군요 그래서 멤버변수에 접근하려고하니

CWnd의 멤버가 아니라고 뭐라고 하면서 ...

이상하게 자식 클래스에서 부모의 멤버 변수를 써야 할 일이 많이 생기는데

이건 제가 설계를 잘 못한것 때문인거 같네요

이럴경우 어떻게 해결해야 할까요?

klyx의 이미지

디자인에 대해서는 간단하게 말하기 어려우므로 일단 접어두고, 현재 상황에서 아무튼 B에서 A의 멤버로 접근하고 싶다면 B에서 CWnd대신에 A의 포인터로 받으면됩니다.
A가 CWnd를 상속해있을테니, B의 생성자에서 A의 포인터로 받은후에, 그걸 CDialog에게 CWnd로 넘겨줘야할때 그냥 넘겨주면, 하위클래스에서 상위클래스로의 형변환이기 때문에, 자동으로 형변환됩니다.

디자인은, 처음에 적은거처럼 간단하게 말할수 있는게 아닙니다. 디자인이 잘된건지 잘안된건지 판단하는 것도 목적에 따라 달라질수 있을테고, 같은 목적을 위해서라도 다양한 디자인 방법이 존재할수 있으니까요.

예를 들어, 그림그리는 알고리즘이, 모든 CDialog에 적용가능한 것이라면, A에 다음과 같이 두가지 함수를 정의해서 쓸수 있겠죠(여기서 Image는 이미지를 나타내는 클래스 이름입니다.)

class A : public CDialog {
public:
  ...
  void drawImage(const Image &img);
private:
  static void drawImage(CDialog *dlg, const Image &img);
  ...
  B *b;
};
 
void A::drawImage(const Image &img) {
  drawImage(this, img);
  drawImage(b, img);
}

혹은, 아무 CDialog에나 적용할순 없는 경우라면, 그림을 그리기위한 인터페이스를 정의하거나 CDialog를 상속받아서 그림을 그릴수 있는 다이얼로그를 만든후, 이것들을 상속 받는 식으로 구현할수도 있겠죠.

class DrawDialog : public CDialog {
  ...
  void drawImage(const Image &img);
  ...
};
 
class A : private DrawDialog {
  ...
  void drawImage(const Image &img);
  ...
private:
  DrawDialog *b;
  ...
};
 
void A::drawImage(const Image &img) {
  DrawDialog::drawImage(img);
  b->drawImage(img);
}

이외에도 여러가지 방법이 있을수 있고, 여기에 적은 방법들이 적합한지, 그리고 잘짜여진건지도 보장할순 없습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.