Visual C++에서 클래스 디자인의 일반적인 관행(1부) - 클래스 생성

저는 Liyuan Breeze입니다. 25년 동안 IT 업계에 종사해 온 베테랑으로서 오늘은 Visual C++에서 클래스 디자인의 일반적인 관행을 다시 살펴보겠습니다. 이 게시물에서는 먼저 아키텍처를 구축하는 방법을 살펴보겠습니다. 초보 프로그래머는 많은 책을 읽지만, 그 책은 프로그래머의 습관에 대해서는 덜 가르치고 문법에 대해서는 더 많이 가르치는 경우가 많습니다. 그럼 이 주제에 대해 이야기해 봅시다.

먼저 한 가지 중요한 점을 살펴보겠습니다. 다음 구절을 기억해야 합니다.

Visual C++에서 클래스를 디자인할 때 프로그래머는 일반적으로 다음을 수행하는 것을 좋아합니다.

(1) 클래스 정의와 클래스의 멤버 함수 선언을 헤더 파일(*.h 파일)에 넣습니다.

(2) 클래스의 멤버 함수 구현을 소스 파일(*.cpp 파일)에 넣습니다.

이전 게시물 "Visual C++의 가상 함수 및 순수 가상 함수의 원리"에서 언급한 예제를 통해 오늘의 주제를 계속하겠습니다. 그러니 내 게시물을 살펴보십시오.

Visual C++의 가상 함수와 순수 가상 함수의 원리

메인 파일이 Study.cpp인 경우 Father 클래스에는 father.h 및 father.cpp 두 개의 추가 파일이 필요합니다. 그런 다음 Son 클래스에는 son.h와 son.cpp라는 두 파일이 필요합니다. main() 함수의 경우 프로그래머의 관례에 따라 별도로 Study.cpp 파일에 넣어주어야 합니다.

이 프로젝트 빌드를 시작해 보겠습니다. 먼저 특정 솔루션에 새 프로젝트 연구를 추가하고 "Windows 콘솔 애플리케이션"을 선택하면 자동으로 Study.cpp가 생성됩니다. 다음으로 Father 클래스와 Son 클래스의 정의를 헤더 파일과 소스 파일이라는 두 개의 파일로 분할합니다. 다중 프로젝트 솔루션에서는 이 프로젝트를 시작 프로젝트로 설정합니다.

프로그래머는 두 가지 방법으로 기존 프로젝트에 헤더 파일(.h 파일) 또는 소스 파일(.cpp 파일)을 추가할 수 있습니다.

첫 번째 방법

"솔루션 탐색기"에서 파일을 추가할 프로젝트를 찾아 해당 프로젝트 아래의 "헤더 파일" 노드에서 마우스 오른쪽 버튼을 클릭한 후 팝업 메뉴에서 [추가] → [새 항목]을 선택합니다. 다음 "새 항목 추가" 대화 상자에서 "헤더 파일(.h)"을 선택하고 파일 이름: father.h를 입력합니다. father.h 헤더 파일 추가를 완료하려면 "추가" 버튼을 클릭하세요.

다음으로 "Solution Explorer" 창의 "Source Files" 노드에서 마우스 오른쪽 버튼을 클릭하고 팝업 메뉴에서 [Add] → [New Item]을 선택하면 "Add New Item" 대화상자가 나타난다. 메시지가 나타나면 "C++ 파일(.cpp)"을 선택하고 파일 이름: father.cpp를 입력한 후 "추가" 버튼을 클릭하여 추가를 완료합니다. 이 프로세스는 헤더 파일을 추가하는 것과 유사합니다.

그런 다음 동일한 방법을 사용하여 Son 클래스의 헤더 파일과 소스 파일을 설정합니다.

두 번째 방법

클래스를 직접 추가하는 방식인데, Visual Studio 2022 개발 환경에서 자동으로 헤더 파일과 소스 파일을 제공해줍니다. "솔루션 탐색기" 창에서 해당 프로젝트를 직접 마우스 오른쪽 버튼으로 클릭한 후 팝업 메뉴에서 [추가] → [클래스]를 선택하면 클래스 추가 대화상자가 나타난다.

클래스 이름 상자에 Father를 입력하고, .h 파일 상자에 Father.h를 입력하고, .cpp 파일에 Father.cpp를 입력합니다.

Son 클래스인 경우 기본 클래스 상자에 Father도 입력합니다. 방문하시면 공개로 작성해주세요.

클래스명과 기본 클래스명을 입력한 후 "확인" 버튼을 클릭하면 추가가 완료된다.

팁: Visual Studio 2022에서 생성된 헤더 파일에는 #pragma Once 명령 코드가 포함되어 있습니다. 먼저 주석 처리를 하고 이 코드의 기능은 나중에 설명하겠습니다.

각 파일 코드

father.h 코드는 아래와 같습니다.

//在头文件中包含类的定义及类成员函数的声明
class Father
{
public:
  Father();
  ~Father();
  void eat();
  void run();
  virtual void study();
};

father.cpp 코드는 아래와 같습니다.

//在源文件中包含类中成员函数的实现
#include "pch.h"

//因为在编译 father.cpp时,编译器不知道 father到底是什么,所以要包含father.h,这样,
//编译器就知道 father是一种类的类型
#include "father.h"
 
#include <iostream>
using namespace std;

//::叫作作用域标识符,用于指明一个函数属于哪个类或一个数据成员属于哪个类。::前面如果不跟
//类名,则表示是全局函数(即非成员函数)或全局数据
Father:: Father()
{
}

Father:: ~Father()
{
}

//注意:虽然我们在函数体中什么也没写,但仍然是实现了这个函数
void Father:: eat()
{
}
  
void Father:: run()
{
}

//注意,在头文件(.h文件)中加了virtual后,在源文件(.cpp文件)中就不必再加virtual了
void Father:: study()
{
  cout<<"study"<<endl;
}

여기서 설명하고 싶은 것은 헤더 파일을 포함할 때 <>와 " "의 차이점이 무엇인가요? <>와 " "는 컴파일러가 헤더 파일을 검색하는 순서가 다르다는 것을 의미하고, <>는 현재 디렉터리를 검색하는 것이 아니라 시스템 디렉터리부터 검색을 시작한 다음 PATH 환경 변수에 나열된 디렉터리를 검색한다는 의미입니다. " "는 현재 디렉터리에서 시작한다는 의미입니다. 디렉터리가 검색된 다음 시스템 디렉터리와 PATH 환경 변수에 나열된 디렉터리가 검색됩니다. 따라서 헤더 파일이 시스템 디렉터리에 있다는 것을 알고 있으면 <>를 직접 사용할 수 있으므로 검색 속도가 빨라질 수 있습니다.

son.h 코드는 아래와 같습니다.

//因Son类从Father类继承而来,要让编译器知道Father是一种类的类型,就要包含Father.h头文件
#include "father.h"

class Son: public Father
{
public:
  void study ();
};

son.cpp 코드는 아래와 같습니다.

#include "pch.h"
#include "son.h"
#include <iostream>
using namespace std;

void Son:: study ()
{
  cout<<"new study"<<endl;
}

Study.cpp 코드는 아래와 같습니다.

#include "pch.h"
#include "father.h"
#include "son.h"

void fn(Father *p)
{
  p->study ();
}

int main()
{
  Father *p;
  Son st;
  p=&st;
  fn(p);
  return 0;
}

이렇게 프레임워크가 셋업되고, 그런 프레임워크가 구축될 수 있다면 프로그래머의 기본 자질, 즉 구축 능력을 갖추었다는 것을 보여주는데, 괜찮고 정상적으로 실행이 가능한 걸까요? 프로그램이 한번에 합격하기가 어려워서 아쉽네요.. 불편하지 않다고 하시네요. 어떻게 조정하고 해결해야 하는지는 다음 포스팅을 참고해주세요.

저자 소개: Li Yuan Weifeng은 1981년에 태어났으며 수석 엔지니어이자 Zhejiang University의 공학 석사, 소프트웨어 엔지니어링 프로젝트 감독자로서 프로그래머, 소프트웨어 디자이너, 시스템 설계자, 초기 Windows 프로그래머, 충실한 Visual Studio 사용자, C/로 일했습니다. C++ 사용자 저자는 25년간 컴퓨터 업계에서 공부하고, 노력하고, 분투한 베테랑으로 유닉스 시대, 데스크탑 WIN32 시대, 웹 애플리케이션 시대, 클라우드 컴퓨팅 시대, 휴대폰 안드로이드 시대를 경험했다. 시대, 빅데이터 시대, ICT 시대, 그리고 AI 딥러닝 시대, 지능형 기계 시대, 앞으로 어떤 시대가 올지 모르겠지만, 이 여정은 고난과 이득으로 가득 차 있다는 것만 기억합니다. 그리고 나는 희망으로 가득 찬 여러분과 함께 계속 나아갈 의향이 있습니다.

추천

출처blog.csdn.net/wang2015cn/article/details/131833138