회원(비회원)님들 그리고 질문자님 안녕하세요?
스머팩트입니다.
--------------------
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();
: 이부분(클래스 생성자) 때문에 바로 입력을 받도록 나오거든요??
: 근데 클래스 생성자를 쓰지 않으면 제가 생각하는대로 나와요(바로 입력하지 않도록)
: 클래스 생성자를 쓰면서 바로 입력하지 않도록 하려면 어떻게 고쳐야 하나요??