C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[38532] Re:다중계승에 관한것 입니다..표시한 부분이 이해가 안됩니다
수야!╋ [sooya23] 949 읽음    2004-12-28 00:24
기본적인 C++의 문법이랍니다.

C++책을 하나 사셔서 그중에 상속부분을 꼭 읽어보시기 바랍니다.

또하나 다중상속은 추천되는 방법이 아니랍니다.

스택호출시 정상호출이 안되는 경우가 발생될 수 있다는 소리를 들은거 같군요

클래스 만드는 방법부터 책을 따라서 연습해보시면 쉽게 이해하실 수 있으리라 기대되는군요

쥬신님께서 범하신 오류에 대해서 설명해 드리도록 하겠습니다.

Unit1에서의 실수는 Main이라는 클래스의 생성자의 인자는 하나입니다.

만드신 Menu라는 클래스가 인자가 두개지요?

:     Main d("맘마", "라면");   //객체를 정의 선언한 부분입니다. 에러 나옵니다.
이부분을 Menu로 바꾸시면 됩니다.

본인이 만든 클래스에서 본인이 혼동하시면 아니되지요~ ㅡ0ㅡ


Unit2에서의 오류입니다. <- 가장 많네요

쓸모없다고 하신 부분에서의 오류가 있습니다.

: //Menu T_Menu;    이표시를 하면 에러가 납니다....쓸모가 없는 부분입니다.

이부분인데요 이 부분에서 오류가 나지 않게하는 방법은 무엇일까요?

Menu T_Menu("수야", "사랑해"); 라고 선언하면 에러가 나지 않겠지요? <- 반듯이 수야 사랑해라고 ㅡ_ㅡ;;

Menu는 클래스입니다. char* 를 인자로 하는 클래스입니다.

T_Menu는 저부분에서 생성되기때문에 인자가 없음으로 오류가 발생되는 것입니다.

또다른 방법은? Menu *T_Menu로 선언하면 오류가 나지 않을것이며

또다른 방법은? 생성자에 기본값을 설정해주면 나지 않을것입니다.

class Menu
{
  Menu( char *m = NULL, char *s = NULL );// 이렇게 말이죠
}

class Main
{
     protected:
         char *main;
     private:
     public:
         __fastcall Main(char *name){ main = name; }
         __fastcall ~Main(void); // 이 함수는 소멸자이며 함수는 정의되지 않았군요
};

함수 정의 방법은 __fastcall ~Main(void) {}; 이렇게 하셔도 되고
CPP에 작성하셔도 됩니다.

Sub클래스 역시 마찬가지로 함수가 정의되지 않았습니다.

: class Menu  :public Main, public Sub
: {
:     protected:
:     private:
:     public:
:         __fastcall Menu(char *m, char *s) :Main(m), Sub(s){} //여기서 :Main(m), Sub(s){}부분이 무엇을 나타내는 건지 모르겠습니다.

이부분에서 결정적인 오류는 Menu라는 단어는 이미 빌더내에 생성된 클래스 같군요.

굳~이 ~ 같은 클래스를 만들고자 하신다면 이름공간을 지정하면됩니다.

아래와같이요

namespace Sooya
{
class Menu : public Main, public Sub
{
    protected:
    private:
    public:
        Menu(char *m, char *s); //여기서 :Main(m), Sub(s){}부분이 무엇을 나타내는 건지 모르겠습니다.
        ~Menu(void);
        char * show1(void);
        char * show2(void);
};
}

:Main(m), Sub(s){}  이부분은 다중상속하였던 인자를 넘기는 부분입니다.

Menu의 생성자에서 받은 m과 s가 있지요?

이중 Main이 생성될때 해당 인자로 m을 줄것이며 Sub가 생성될때는 s를 인자로 줄것이다라는 선언이죠

왜냐? main과  sub로부터 상속받은 Menu는 생성될때 Main과 Sub의 생성자 부분이 실행되기때문이죠

이부분은 CPP에서 하는것이 도 깔끔하고 보기 좋습니다. 하는일이 없다고 하더라도 말이죠

이게 끝이아니랍니다. 지금까지 알려드린것 모두 거짓입니다.

왜냐면  Menu를 namespace로 감싸뒀기 때문이죠

#include "Unit2.h" 라는 선언을한 곳에는 아래와같은 문장을 써야합니다.

using namespace Sooya;

즉 Unit1.cpp에

#include "Unit2.h"

using namespace Sooya;

이렇게 해주셔야 합니다.

또한 Menu클래스를 사용할때 Sooya::Menu라고 지정해주어야 합니다.

이래야 빌더에 있는 클래스 Menu가 아닌 Sooya라는 이름공간에 있는 Menu라는것을 명시하는 것이 됩니다.

전체적으로 수정된 부분을 보면

Unit1.cpp ----------------------
#include "Unit1.h"
#include "Unit2.h"

using namespace Sooya;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Sooya::Menu d("맘마", "라면");   //객체를 정의 선언한 부분입니다. 에러 나옵니다.
    Memo1->Lines->Clear();      //메모장을 청소
    Memo1->Lines->Add("주식"+AnsiString(d.show1()));
    Memo1->Lines->Add("부식"+AnsiString(d.show2()));
}
//---------------------------------------------------------------------------

Unit2.cpp -----------------------
#include "Unit2.h"
using namespace Sooya;

//---------------------------------------------------------------------------
Sooya::Menu T_Menu; //   이표시를 하면 에러가 납니다....쓸모가 없는 부분입니다.
Menu::Menu( char *m, char *s ) : Main(m), Sub(s)
{
}

Menu::~Menu()
{
}

char * Menu::show1(void)
{
    return main;
}
char * Menu::show2(void)
{
    return sub;
}

Unit2.h -------------------------
class Main
{
    protected:
        char *main;
    private:
    public:
        Main(char *name){ main = name; }
        virtual ~Main(void) {};
};
class Sub
{
    protected:
        char *sub;
    private:
    public:
        Sub(char *name){ sub = name; }
        virtual ~Sub(void) {};
};

namespace Sooya
{
class Menu : public Main, public Sub
{
    protected:
    private:
    public:
        Menu(char *m, char *s); //여기서 :Main(m), Sub(s){}부분이 무엇을 나타내는 건지 모르겠습니다.
        ~Menu(void);
        char * show1(void);
        char * show2(void);
};
}

입니다.....


앞서 말씀드렸지만 다중상속 아래부분
class Menu : public Main, public Sub 은 피하시는 편이 처음습관부터 좋으리라 생각되네요
(이부분은 저도 책으로 읽은 부분이며 실제 격은 사람의 이야기를 바탕으로 이야기해드렸습니다. )

또하나

이부분은 책을 통하여 자세히 읽어보시고 습득하시는 편이 좋을거 같습니다.

직접 해보고 계속 해보고 또해봐야 스스로 이해할 수 있습니다.

제 설명이 어렵진 않았나 걱정이되지만 행여나 어려우시더라도 책을 꼭 보셔서 이해하셨으면 합니다.

수야였습니다.

+ -

관련 글 리스트
38524 다중계승에 관한것 입니다..표시한 부분이 이해가 안됩니다 쥬신 866 2004/12/27
38532     Re:다중계승에 관한것 입니다..표시한 부분이 이해가 안됩니다 수야!╋ 949 2004/12/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.