2012-11-14 5 views
-2

그래서 C를 배우려고하는데 클래스가 없다는 것을 이해합니다. 그러나 저는 C++ 프로그래밍 만하고 특수 유형의 객체를 만들려했습니다. 차를 예로 들어 보겠습니다. 클래스를 만들어야합니다. 이런 식으로 뭔가 :C 데이터 형식 생성

class Car { 
    //code 
}; 

void main() { 
    Car c; //or Car c = new c(//constructor); 
} 

하지만 C 때 당신이 뭔가 this 같은 클래스를 가질 수 없습니다 방법을 이해하지 않습니다. 유형이 FILE 인 변수를 선언하고 있습니다. 그렇다면 FILEstdio.h 파일의 구조체입니까? 데이터 유형은 C에서 정확히 어떻게 작동합니까?

+0

귀하의 의견을 잘 듣고 있습니다 - 나는 당신과 동의합니다 – paulsm4

+5

위키피디아의 ['typedef'] (http://en.wikipedia.org/wiki/Typedef)의 어떤 부분이 당신을 모호하게합니까? – mouviciel

+1

C에는 복합 유형 ("structs")이 있지만 멤버 함수가있을 수 없으므로 OO 의미에서 "클래스"가 아닙니다. 그것들은 단지 복합 유형입니다. –

답변

2

는하지만 그것은 엄격하게 객체 지향 언어 아니니까 C 클래스

를 가질 수 없습니다 방법을 이해하지 않습니다.

그렇다면 FILE은 stdio.h 파일의 구조체입니까?

예.

데이터 유형이 C에서 정확히 어떻게 작동합니까?

(Google, 첫 번째 히트) 주제에 entire paper이 있습니다.

Sidenote : 당신 구조체를 사용하여 C에서 객체 지향 프로그래밍 스타일을 에뮬레이션 할 수 있습니다. OO를 호출할지 여부는 시점의 문제 일뿐입니다. 이 자세하게 (명시 적) 본질적으로

CURL *hndl = curl_easy_init(); 
curl_easy_setopt(hndl, CURLOPT_URL, "http://example.com"); 
curl_easy_perform(hndl); 
curl_easy_cleanup(hndl); 

다음과 같은 몇 가지 OOP 코드를 작성 :

CURL hndl; 
hndl->url = "http://example.com"; 
hndl->perform(); 

There also is a paper이 주제에 대한 예를 들어, 악명 높은 libcurl에서 네트워킹 라이브러리의 사용을 고려한다. 그런

struct car_st { 
    int numberOfSeats; 
}; 
typedef struct car_st CAR; 
typedef struct car_st * CAR_PTR; 

뭔가 :

+2

그 주제에 하나 이상의 논문이 있지만, 질문하기 전에 하나도 읽지 않았습니다. – Mithrandir

+0

@Mithrandir 물론 나는 "이것에 단 하나의 종이 만있는 것이 아닙니다. 그래서 당신이 지금까지했던 철저한 인터넷 검색으로 그것을 찾지 못했습니다"... : P –

+0

나는 C와 프로그래밍 유형은 Google보다 앞서고 실제로 종이에 쓰여집니다. 물론 더 이상 적절한 지식이 아닙니다. ;-) – Mithrandir

0

당신은 나는 보통 이런 종류의 작업을 수행 C.에 유형을 만들 수 typedef 키워드를 사용할 수 있습니다.

사실 C는 클래스를 가질 수 있습니다. C++ 및 Objective C의 초기 구현은 전처리기로 수행되었습니다. 문제는 당신이 진정한 데이터 숨기기와 메소드를 얻지 못한다는 것입니다. 결국 메서드에 대한 함수 포인터를 사용하게됩니다. 이는 유지 관리의 어려움과 설정해야 할 많은 작업입니다. 어떻게 당신이 상속을 할 지 모르겠지만 아마 다른 구조체에 대한 포인터의 엉망이 될 것입니다.

그래, 너는 그걸 함께 때릴 수있어. 그러나 제발하지 마.

+0

OO-C에 관해서는 프로그래머 SE에서 [C 프로그램을위한 OO 베스트 프랙티스] (http://programmers.stackexchange.com/q/118253/1033)를보십시오. – mouviciel

0

C 등가는 Car의 속성에 대한 구조체 유형을 정의한 다음 Car 유형의 객체를 조작하는 함수를 정의하는 것입니다.FILE 유형이 어떻게 작동하는지 그 본질적이다 :

FILE *f = fopen("afile.txt", "r"); // open a file for reading 
fgets(buffer, sizeof buffer, f); // read from a file 
fprintf(f, "%d on the wall", bottles--); // write formatted text to the file 

우리가 직접 FILE 유형의 개체를 조작 할 수없는 시점에서; 우리는 패스 포인터를 앞뒤로 전달합니다.

액세스 제어가 없습니다. C 구조체의 일부분을 만들 수 없습니다. public 및 기타 private; 당신이 지금과 같은 구현을 숨길 수 있습니다 :이 예에서

/** Car.h */ 
... 
struct Car; 

struct Car *createCar(void); 
void deleteCar(struct Car **theCar); 
int startCar(struct Car *theCar); 
... 

/** Car.c */ 

#include "Car.h" 
... 
struct Car { 
    char *make; 
    char *model; 
    int year; 
    ... 
}; 

struct Car *createCar(void) 
{ 
    struct Car *p = malloc(sizeof *p); 
    if (p) 
    { 
    ... // initialize attributes 
    } 
    return p; 
} 

void deleteCar(struct Car **theCar) 
{ 
    free(*theCar); 
    *theCar = NULL; 
} 

void startCar(struct Car *theCar) 
{ 
    theCar->running = 1; 
} 

/** main.c */ 
#include "Car.h" 
... 
int main(void) 
{ 
    struct Car *c = createCar(); 
    startCar(c); 
    ... 
    deleteCar(&c); 
} 

main.cCar.h에서 전방 선언 struct Car;을 본다; 형식이 불완전하기 때문에 main포인터struct Car으로 만 선언 할 수 있습니다. Car.c에서는 구조체 유형이 struct Car {char *make; char *model; ...};으로 완료되므로 Car.c 내의 함수가 해당 멤버에 액세스 할 수 있습니다.