2

약 14 년 전에 C++을 약간 프로그래밍했습니다. 나는 .NET과 같은 신기술에 대해 잘 알고 있으며, 대부분 내가 일하는 곳에서 일하고 있습니다.새 C++ 클래스를 만들 때 두 파일 (.h 및 .cpp)이 만들어지는 이유는 무엇입니까?

이제 저는 C#과 C++의 차이점을 더 잘 볼 수 있도록 simlpe 전화 목록 Windows 응용 프로그램을 만들고 싶습니다.

내가 이미 차이점을 발견했다고 말해 보자! Hehehe ... 따라서 이러한 차이점 중 하나는 Visual Studio 템플릿에서 새 C++ 클래스를 만들 때 .cpp 클래스 파일뿐만 아니라 헤더 파일도 함께 만듭니다.

왜 그렇습니까? 왜 class1.h와 class1.cpp 파일을 하나의 classe로 생성합니까?

헤더 파일은 기능 및 개체 라이브러리 일 가능성이 높습니다. 나중에 재사용 할 수 있도록 올바르게 말하면 어떻게 될까요? 새로운 C++ 클래스를 추가 할 때

질문

  1. 왜 두 개의 파일 (.H 및 통화 당)가 생성?
  2. 헤더 파일에 멤버를 정의하고 cpp 파일에서 함수 core를 정의해야합니까?
  3. 2가 아닌 경우이 특정 시나리오에서 헤더 파일은 무엇입니까?

그런

1 내 코드는 다음과 같이한다 편집 #? 그런 다음

// Customer.h header file 
ref class Customer { 
    private: 
     char* _number, _name; 
     long _phoneNumber; 

    public: 
     char[] get_number(); 
     void set_number(char* number); 
     char[] get_name(); 
     void set_name(char* name); 
     long get_phoneNumber(); 
     void set_phoneNumber(long phoneNumber); 
     void set_name(char* name); 
} 

는 :

// Customer.cpp 
#include <Customer.h> 

char[] Customer::get_number() { 
    return _number; 
} 

void Customer::set_number(char* number) { 
    if (number != null && sizeof(number) < 1) return; 
    _number = number; 
} 

// And the other members here... 

지금 내가 알고, 내 코드에서 오류가 많이있을 최대량. C++ 기술을 향상시킬 수 있도록 문제 해결을 도와 주시면 기꺼이 도와 드리겠습니다.

알아서 도와 주셔서 감사합니다.

+1

이것은 C++/CLI입니다. 네이티브 C++ 또는 관리되는 C++ 코드를 사용하고 싶습니까? 큰 차이가 있습니다. –

+0

@ 스티브 : 나에게 이것을 지적 해 주셔서 감사합니다. 사실, 나는 말할 수 없다. 내 생각에 네이티브 C++은 C++로 충분히 딥 (dip)을하는 것이 더 좋을 것입니다. 그래서 어플리케이션을 효율적으로 개발하기에 충분할만큼 빨리 시작할 수 있습니다. 맞습니까? 또는 심지어 가치가 있습니까? –

+0

CLR이 필요없는 C++ 코드에 대해 배우려면 원시 C++가 필요합니다. 당신의 코드에서'ref 클래스'는 공짜이며, 함수로부터 배열을 반환합니다. 네이티브 코드에서도 마찬가지입니다. –

답변

2

C++의 함수 및 클래스는 사용하기 전에 선언해야합니다.이 함수는이 파일에서이 함수를 사용할 수 있다고 선언하는 것입니다. 이러한 선언은 헤더 파일 (.hpp/.h 개 파일)을 사용하여 가져옵니다.

함수를 선언하려면, 당신은이를 작성합니다

return typefunction name(arguments);

그래서이 기능을 :

int factorial (int x) 
{ 
    if (x == 0) 
    return 1; 
    return x * factorial (x - 1); 
} 

는 미리 선언 될 것이다 같은 :

int factorial (int x); 

선언 클래스를 다음과 같이이다 :

classclass name{function and variable declarations};

그래서 방법 bar, 공공 멤버 변수 bazclass Foo은 다음과 같이 보일 것이다 :


foo.hpp:

#ifndef FOO_HPP_ 
#define FOO_HPP_ 

class Foo 
{ 
public: 
    int baz; 

    void bar(); 
}; 

#endif 

foo.cpp:

#include "foo.hpp" 
#include <iostream> 

void Foo::bar() 
{ 
    std::cout << baz << std::endl; 
} 
+0

그러면 속성 함수'get_this','set_that'에 사용되는 필드와 같은 private 멤버는 어떻습니까? –

+1

약간의 문제 : 클래스와 함수를 C/C++에서 "미리 선언"할 필요는 없습니다. 사용하기 전에 단순히 선언하거나 구현해야합니다. 대형 프로젝트에서 긴 컴파일 시간의 골치 아픈 것 외에, 헤더 파일만으로 모든 클래스를 구현하는 것을 방해하는 것은 없습니다. –

1

클래스는 헤더에서 선언되며 대부분의 기능은 .cpp 파일에 정의되어 있습니다. 이 도구는 인터페이스와 구현의 분리를 달성하는 데 도움을줍니다.

헤더와 .cpp 파일 사이의 분리에 대해 생각하는 방법은 다음과 같습니다

  • 헤더 선언이 다른 파일에 의해 사용이 포함되어 있습니다.
  • .cpp 파일에 구현이 포함되어 있습니다.

많은 파일이 기능을 활용할 수 있기를 원하지만 그 기능을 실제로 한 곳에서 정의하기를 원합니다.

1

헤더 파일은 클래스를 선언/정의합니다. 멤버 함수, 멤버 데이터, 친구 등이 포함됩니다. 일반적으로 구현 (템플릿은 예외)이 많지 않습니다.

구현 파일 (* .cpp)은 다음과 같습니다. 클래스를 구현합니다.

구현 파일을 사용할 필요는 없습니다 (VS 마법사에서 인라인 클래스를 만들면 헤더 파일 만 생성 하겠지만) 일반적으로 템플릿 클래스 (예 : STL 클래스 및 부스트 라이브러리의 많은 클래스) 또는 매우 간단한 클래스.

1

헤더 파일은 C++과 거의 다르지 않기 때문에 C++ 컴파일에 필요합니다.

C#에서 이진 모듈 간의 연결은 항상 동적입니다. C++에서는 정적 링크와 동적 링크의 차이가 있습니다. 세부 사항에 들어가기 위해서, 그것은 저에게 완전한 한 시간의 글이 걸릴 것입니다, 그러나 가능한 한 가장 짧은 방법이라고합시다.

C++에서 모든 .cpp 파일은 개별적으로 개체 파일로 컴파일됩니다. 바이너리 파일을 만들기 위해서는 그 파일을 다른 파일에 링크해야합니다. 헤더 파일은 포함 된 .cpp 파일 (모든 클래스에 대해 정의 된 메서드를 호출하는 파일)에 필요한 메서드 서명 ()을 모두 선언합니다.

C#에서 모든 파일은 단일 바이너리 파일로 컴파일됩니다. 컴파일러는 컴파일하는 멤버가 볼 수있는 클래스와 메서드를 항상 알고 있습니다.

관련 문제