먼저 VS2003으로 작성.
기본적인 MFC 어플리케이션 프로젝트로 생성 후 
Edit Control을 두개 넣고 이름 지정(IDC_EDIT1,2로 지정)해주고,
확인으로 지정해줄 버튼을 생성 후 두번 클릭하면 자동으로 OnBnClickedButton1()이 생성된다. (IDC_BUTTON1)


그리고 그것에서

GetDlgItemText(IDC_EDIT1, m_str1); 
GetDlgItemText(IDC_EDIT2, m_str2);  

MessageBox(""아이디는 : " + m_str1 + "\n" + "비밀번호는 : " + m_str2, "입력한 값", MB_OK);

으로 입력한 후 실행하면 됨.

ps. m_str1, m_str2는 CString으로 미리 선언해뒀음 
int main()
{
CComponent* pComponent = new CComponent("My Component");
  
        //1. 객체로 인자를 넘길때(1번을 한다면 2번을 주석처리하세요)
        pComponent->AddParameter(CParameter("Test1"));
pComponent->AddParameter(CParameter("Test2"));
pComponent->AddParameter(CParameter("Test3"));
pComponent->AddParameter(CParameter("Test4"));
pComponent->AddParameter(CParameter("Test5"));
pComponent->AddParameter(CParameter("Test6"));
pComponent->AddParameter(CParameter("Test7"));
//////// 

 
       //2. 포인터로 인자를 넘길때(2번을 한다면 1번을 주석처리하세요)
for (int i = 0; i < 6; i++)
{
pComponent->AddParameter(CParameter("Test"));
}
//////// 
int nSize = pComponent -> GetParameterSize();
        for (int i = 0; i < nSize; i++) //객체로 넘길때입니다. 포인터로 넘길시에 "GetParameterAt(i)->"로 변경.
        //아래의 포문도 동일
{
cout << i+1 << " " << pComponent->GetParameterAt(i).GetName() << endl;
}
cout << endl;

cout << "3번째 객체를 삭제합니다" << endl;

pComponent->DeleteParameterAt(3);
cout << endl;
nSize = pComponent -> GetParameterSize();
for (int i = 0; i < nSize; i++)
{
cout << i+1 << " " << pComponent->GetParameterAt(i).GetName() << endl;

}
cout << endl;

delete pComponent;

return 0;
}


헤더파일 분리
Component.h , Parameter.h, BaseEntity.h 로 분리후 Parameter클래스는 BaseEntity클래스를 상속받음.
BaseEntity클래스는 "Test1", "Test2" 같은 문자를 입력받습니다.(멤버변수가 'char* 변수명'임) 
Component클래스는 Parameter객체들을 배열형태로 관리 합니다.

구현해보시고 제가 만든거하고 비교해보세요 
void plus(char* a, char* b, char*& sum)
{
sum = strcat(a, b);
}

int main()
{
        char a[100] = { '\0' };
strcpy(a, "Hello ");

char* sum = 0;

plus(a, "World!", sum);

cout << sum << endl; 



출력 >> Hello World!


이건 call-by-value일까요 call-by-reference일까요?


ps. call-by-address보다는 주소값을 이용한 call-by-reference가 맞는것 같습니다.... 

(아래 0- 로 시작하는 과제는 C 표준 함수를 사용하지 않고 포인터 연산을 통해 구현한 버전과 C 표준 함수를 사용한 두 버전을 각각 구현하시오.)

 
========================================================================
0-1. 문자열을 더하는 함수를 작성하시오. 
 
char* GetAppendedString(const char* source, const char* toAppend) {
    ...    
}
 
main(...) {
    cout << GetAppendedString("Hello", "World"); // HelloWorld
}
========================================================================
0-2. 문자열을 비교하는 함수를 작성하시오. 
 
bool IsEqualString(const char* source, const char* target) {
    ...
}
 
main(...) {
    cout << IsEqualString("Hello", "World"); // false
}
========================================================================
0-3. 문자열을 복사하는 함수를 작성하시오. 
char* CopyString(char* dst, const char* src) {
    ...
}
 
main(...) {
    char szValue[80];
    ...
    CopyString(szValue, "HelloWorld");
    cout << szValue; // HelloWorld
}
========================================================================
0-4. 문자열을 특정 문자로 분리하여 배열을 반환하는 함수를 작성하시오.
 
?? Tokenize(char* szValue, char* token, ???) {
    ...
}
 
main(...) {
    char* value = "ABC,DEF,GHI";
    
    ?? = Tokenize(value, ',');
    for (int i = 0; i < ??; i++) {
        cout << ??[i] << endl;
    }
    // ABC
    // DEF
    // GHI
}
========================================================================
 
 
========================================================================
1. 문자열과 숫자를 더하여 문자열을 반환하는 함수를 작성하시오.
 
char* GetNumericAddedString(const char* arg_szValue, int arg_nNum)
{
 
}
========================================================================
2. 문자열에 특정 범위 내의 숫자를 더한 후 배열로 반환하는 함수를 작성하시오.
 
?? GetStringArray(const char* arg_szValue, int arg_nBeginIdx, int arg_nEndIdx)
{
    return ??
}
 
main(...)
{
    ?? pArr = GetStringArray("Test", 0, 7);
    for (int i = 0; i <= 7; i++) {
        cout << pArr[i] << endl;
    }
 
    // Test0, Test1, Test2, ... Test7
}
========================================================================
3. 위 2번에서 반환된 ??의 메모리를 해제하는 코드를 작성하시오.
========================================================================
아래와 같은 상속구조를 갖는 클래스들을 정의하고 이들의 업무를 관리하는 근로자센터 클래스를 구현하시오

           사람
             |
          근로자
===================
|           |             |
군인    의사       개발자

1. 사람 : 이름, 나이를 속성으로 포함

2. 근로자 : 근무지를 속성으로 포함. 업무를 행위로 포함( DoWork() 함수를 정의)

3. 군인 : 병과 (육군/해군/공군)을 속성으로 포함. 행위 수행시 " ~~ 근무지에서 ~~ 병과로 나라를 지키다"
4. 의사 : 전공(내과/외과 등)을 속성으로 포함. 행위 수행시 "~~ 근무지에서 ~~ 전공으로 환자를 치료하다"
5. 개발자 : 기술(C++/JAVA 등)을 속성으로 포함. 행위 수행시 "~ 근무지에서 ~ 기술로 개발을 하다."

[제약사항]
1. 사람과 근로자는 개별로 생성할 수 없다.
2, 근로자 센터는 군인, 의사, 개발자 드으이 객체들을 리스트 형태로 관리하며, 기본적으로 Add(...), DoWorkAll(...)함수를 정의해야 한다.


main()
{
WorkerCerter* pCenter = new WorkerCenter();

~~ pDoctor = new Doctor("Kim", 25, "인천" , "내과");
~~ pSoldier = new Soldier("Lee" , 30, "서울", "육군");
~~ pDeveloper = new Developer("Hong", 19, "부산", "C++");

pCenter->Add(pDoctor);
pCenter->Add(pSoldier);
pCenter->Add(pDeveloper)

/*
아래 호출시 아래가 출력되어야 함
나이 25세 kim이 인천 근무지에서 내과 전공으로 환자를 치료하다.
나이 30세 Lee이 서울 근무지에서 육군병과로 나라를 지키다.
나이 19세 Hong이 부산 근무지에서 c++기술로 개발을 하다.
*/

pCenter->DoWorkAll();
}



/////////////////////


이렇게 하는게 문제입니다.
각 클래스는 사람, 근로자, 군인, 의사, 개발자 그리고 근로자 센터 클래스 이렇게 6개가 되겠으며
사람 클래스와 근로자 클래스는 추상클래스로 객체 선언이 불가능하게 만들어야 합니다.(선언하면 에러나게..무슨뜻인지 아시죠?)

그리고 근로자센터가 이들을 리스트로 연결해서 출력까지 하게 만들어야 합니다.
또 파일들을 분리해서 작성하세요. main.cpp에 다 넣어서 복잡하게 만들지 마시고 ㅋ


일단 개인적으로 만들어 보시고 제가 ㅁ나든것과 비교해 보세요.
여러분이 더 잘만드셨을껍니다. ㅠㅠㅠ

전 템플릿도 쓰지 않았습니다. 단지 c++로 클래스와 상속, 가상함수 들을 이용한 부분까지만 사용했습니다.
열공합시다!! ㅋ
c++에서 구조체와 클래스의 차이는 무엇일까?

구조체는 기본접근자가 public이고 클래스는 기본접근자가 private이다.

즉,
struct temp
{
int       a;
.....
};
일때는 int a가 public처럼 외부에서 접근 가능하지만,

class temp
{
int      a;
public:
int     c;
};
처럼  int a는 기본이 private라는 소리이며,
 public이라는 접근자를 적어줘야 int c가 public으로 인식되서 외부에서 접근이 가능하다는 뜻이다.

이는 정보은닉과도 관련이 있........나?
그것까지는 생각 안해봤음

일단 분명한것은 이것임. 기본접근자에 대한 차이

"pointer"

골때리는 단어다. 사용하기 따라 쉽기도 하면서 어렵다.
시작하는 사람에게는 두려운 단어이며, 아는 사람에게는 고마운 단어일 수도 있다.

포인터를 간단히 말하면,
'가리키는것' 이라고 말할수도 있지만,
그렇게 간단히 말하기엔 쓰이는곳이 너무나 많고 중요하다고 생각한다.

포인터는 기본적으로 모두 4바이트이다.(32비트 기준, 64비트는 두배)
그리고 가리키는것, 즉 어느 집의 주소다.

집이 판자촌이든, 아파트든, 정원딸린주택이든, 주소는 다 똑같은 방식이다.
**시**구**동**번지. 요즘엔 **시**구**로 *** 이런식이다.

즉, 포인터는 이런것들이다.
int* a는 a를 가리키는 int형 포인트이다. a를 가보면 int형이라는 소리.
char* name는 name변수를 가리키는 문자형 포인터이다. name을 가보면 char라는 소리

문제는 포인터 하나 정도는 어느정도 공부하면 대충 감이 온다.

그러나......

더블 포인터라는것이 나올수도 있다.
이는 만들기 나름이다. 이중포인터(더블포인터), 삼중, 사중 만들수는 있다. 삼중부터 잘 안쓰여서 그렇지.

더블 포인터는 어느것을 가리키는 포인터를 가리키는 포인터이다.

말장난 시작됐다.
2001/06/10

1. 클래스, 접근자 ' private: ' 꼭 입력(생략하지 말것)
2. 클래스, 생성자가 ' Public: ' 맨 처음매서드로 위치 변경
3. 클래스, 맴버함수는 외부정의하라
4. 메서드마다 한줄씩 띄워서 구분
5. 80 col. 이 넘지않게 작성
6. Visual assist X 활용
7. 헤더파일을 이용한 파일의 분할 -> 종속성 제거차원(전방선언) (다음개선시 알려줌)

+ Recent posts