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
[73027] Re:[답변]class 생성자 질문이요
스머팩트 [lego2000] 3860 읽음    2015-09-20 04:13
회원(비회원)님들 그리고 질문자님 안녕하세요?
스머팩트입니다.

--------------------
1. 질문에 대한 답변
--------------------

제시하신 프로그램은
종업원(Employee)을 만들면 자동으로 이름(first_name, last_name)과 급여(salary)를 입력하도록 작성된 프로그램 입니다.
만들면 자동으로 <--- Constructor 입니다.
그런데 Constructor(만들면 자동으로)에서 입력하지 않으면 좋겠다고 하셨습니다.

그러니까 Constructor를 쓰지 않거나, 다음과 같이 아무것도 안하면 되겠죠.

    Employee()
    {
    }

일반적으로 Constructor는 인스턴스(Employee1, Employee2)를 생성할 때 입력같은 것은 하지 않고 
내부 변수를 기본값으로 초기화하는 등의 일을 합니다.
Employee클래스의 경우는 first_name, last_name,  salary를 초기화 해야 할 것 같습니다.
다음과 같이 말이죠.

    Employee()
    {
        first_name = "";
        last_name = "";
        salary = 0;
    }

수정된 전체 소스입니다.
일부 문제가 있는부분은 제가 수정 했습니다.
C++Builder 6.0 으로 작성했습니다. 다른 컴파일러인 경우 다음 두줄을 찾아서 삭제하시면 될겁니다.
#include <vcl.h>
#pragma argsused


#include <vcl.h>
#include <iostream>
#include <string>
using namespace std;
//---------------------------------------------------------------------------
class Employee
{
private:
    string first_name;
    string last_name;
    int salary;
public:
    Employee()
    {
        first_name = "";
        last_name = "";
        salary = 0;
    }

    void setfirst_name() { cout << "First Name:"; getline(cin, first_name); }
    void getfirst_name() { cout << first_name; }

    void setlast_name() { cout << "Last Name:"; getline(cin, last_name); }
    void getlast_name() { cout << last_name; }

    void setsalary()
    {
        cout << "Salary:";
        cin >> salary;
        fflush(stdin);
        if (salary < 0)
        {
            cout << "Error : Initial salary cannot be negative" << endl;
            salary = 0;
        }
    }
    void getsalary() { cout << salary; }

    void InputAll(void)
    {
        setfirst_name();
        setlast_name();
        setsalary();
    }

    void Print(void)
    {
        cout << "First Name:" << first_name << "\n";
        cout << "Last Name:" << last_name << "\n";
        cout << "Salary:" << salary << "\n";
    }
};

#pragma argsused
int main(int argc, char* argv[])
{
    Employee Employee1, Employee2;

    Employee1.InputAll();
    Employee2.InputAll();

    Employee1.Print();
    Employee2.Print();

    getchar();
    return 0;
}





----------------------
2. 구석기시대로...
----------------------
Constructor가 없었던 C언어로 일부분을 한번 만들어 봤습니다.
대부분의 프로그래머가 잘 알고있는 내용이지만...
Constructor가 나오게된 배경을 말해주는 프로그램입니다.

#include <stdio.h>

typedef struct
{
    char first_name[256];
    char last_name[256];
    int salary;
}Employee;

void Employee_Init(Employee *emp)
{
    emp->first_name[0] = '\0';
    emp->last_name[0] = '\0';
    emp->salary = 0;
}

void Employee_Print(Employee *emp)
{
    printf("First Name: %s\n", emp->first_name);
    printf("Last Name: %s\n", emp->last_name);
    printf("Salary: %d\n", emp->salary);
}

int main(int argc, char* argv[])
{
    Employee e1, e2;
    Employee_Init(&e1);
    Employee_Init(&e2);

    Employee_Print(&e1);
    Employee_Print(&e2);
    return 0;
}



Employee 자료형과 두개의 의미적 맴버함수가 있습니다.(Init, Print)
Employee를 생성하면 Employee_Init()을 호출해 줘야 합니다.

만일 프로그래머가 Employee_Init(&Employee1);을 실수로 호출하지 않는다면 프로그램 수행중에
찾기 힘든 오류가 발생할 가능성이 매우 높습니다.

C++은 Employee_Init(&Employee1); 을 자동으로(Constructor) 처리해서 오류가능성도 낮추고
인스턴스 생성도 상대적으로 간단히 할 수 있습니다.


보다더 C++과 유사하게 만든 C프로그램 하나만 더볼까요. (Constructor, Destructor 구현)
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    char first_name[256];
    char last_name[256];
    int salary;
}Employee;

Employee *Employee_Create(void)
{
    Employee *emp = (Employee *)malloc(sizeof(Employee));
    emp->first_name[0] = '\0';
    emp->last_name[0] = '\0';
    emp->salary = 0;
    return emp;
}

void Employee_Destroy(Employee *emp)
{
    if(emp!=NULL) free(emp);
}

void Employee_Print(Employee *emp)
{
    printf("First Name: %s\n", emp->first_name);
    printf("Last Name: %s\n", emp->last_name);
    printf("Salary: %d\n", emp->salary);
}

int main(int argc, char* argv[])
{
    Employee *e1= Employee_Create();
    Employee *e2= Employee_Create();

    Employee_Print(e1);
    Employee_Print(e2);

    Employee_Destroy(e1);
    Employee_Destroy(e2);

    return 0;
}



그럼 모두 안녕히...

-----------------------------------------------------

1234 님이 쓰신 글 :
: #include <iostream>
: using std::cout;
: using std::endl;
: using std::cin;
: #include <string>
: using std::string;
: using std::getline;
:
: class Employee
: {
: private:
:     string first_name;
:     string last_name;
:     int salary;
: public:
:     Employee()
:     {
:         setfirst_name();
:         setlast_name();
:         setsalary();
:     }
:     void setfirst_name()
:     {
:         getline(cin, first_name);
:     }
:     void getfirst_name()
:     {
:         cout << first_name;
:     }
:     void setlast_name()
:     {
:         getline(cin, last_name);
:     }
:     void getlast_name()
:     {
:         cout << last_name;
:     }
:     void setsalary()
:     {
:         cin >> salary;
:         if (salary < 0)
:         {
:             cout << "Error : Initial salary cannot be negative" << endl;
:             salary = 0;
:         }
:     }
:     void getsalary()
:     {
:         cout << salary;
:     }
: };
:
: void main()
: {
:     Employee Employee1, Employee2;
: }
:
: 이렇게 해봤는데요 출력을하면
: Employee()
:     {
:         setfirst_name();
:         setlast_name();
:         setsalary();
: 이부분(클래스 생성자) 때문에 바로 입력을 받도록 나오거든요??
: 근데 클래스 생성자를 쓰지 않으면 제가 생각하는대로 나와요(바로 입력하지 않도록)
: 클래스 생성자를 쓰면서 바로 입력하지 않도록 하려면 어떻게 고쳐야 하나요??

+ -

관련 글 리스트
73026 class 생성자 질문이요 1234 3831 2015/09/18
73027     Re:[답변]class 생성자 질문이요 스머팩트 3860 2015/09/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.