2010-12-14 2 views
12

나는 재미있게 C로 스택을 만들려고하는데, 스택을 나타 내기 위해 구조체를 사용하는 아이디어가 떠 올랐다. 그런 다음 push() 및 pop() 작업을위한 구조체에 함수 포인터를 추가합니다."C"가 아닌 "this"포인터

지금까지는 모든 것이 좋았지 만 push() 및 pop() 함수를 구현하기 위해 어떻게 든 이것을 참조해야합니다. 어떻게 할 수 있습니까?

이 내 구조체

struct Stack { 
    int *data; 
    int current_size; 
    int max_size; 
    int (*push)(int); 
    int (*pop)(); 
}; 

입니다 그리고 당신이 상상할 수 있듯이 예를 들어 여기에 컴파일러는 stack->current_size 같은 것을 기대하는 것처럼 current_size이 무엇인지 모르고있다,

int push(int val) { 
    if(current_size == max_size -1) 
      return 0; 

    data[current_size] = val; 
    current_size++; 

    return 1; 
} 

을 밀어입니다.

어떻게 든 극복 할 수 있습니까?

+0

스택 구조체의 포인터는 무엇입니까? – Nyan

+0

'stack-> push (10);'와 같이이 타입의 스택을 호출하는 것이 가능한지에 대한 답을 얻으려고 노력하십시오. 자, 대답이 여기에 주어지지 않는다면 저는 그것이 실제로 불가능하다는 것을 꽤 확신 할 수 있습니다. – foo

답변

26

C.에서 암시 this 그것이 명시하지 말라있다 :

int push(Stack* self, int val) { 
    if(self->current_size == self->max_size - 1) 
      return 0; 

    self->data[self->current_size] = val; 
    (self->current_size)++; 

    return 1; 
} 

당신은 물론 push과 유사한 방법에 대한 모든 호출로 구조체에 대한 포인터를 전달해야합니다.

이것은 기본적으로 Stack을 클래스로 정의하고 push 등을 메소드로 정의 할 때 C++ 컴파일러가 수행하는 작업입니다.

+1

이것은 C++가 배후에서 작동하는 방식입니다. 이 작업을 수행. – aib

+3

그건 생각이지만,'this'를 변수로 사용하는 것은 누군가가 당신의 C를 C++ 프로그램에 포함 시키려한다면 어색합니다. –

+0

@aib, @ Victor : 좋은 지적; 나는 대답을 편집했다. 감사. – NPE

1

C는 이와 같이 작동하지 않습니다. 그것은 객체 지향 언어가 아닙니다. 데이터 구조를 조작하는 함수는 구조체를 가리키는 포인터를 인수로 취해야합니다.

0

함수 포인터는 메서드가 아니므로 호출하는 개체에 대한 정보가 없습니다. 원하는 것을하기위한 유일한 방법은 객체에 대한 포인터를 전달하거나 해당 포인터를 전역으로 만드는 것입니다 (후자는 권장하지 않습니다).

-2

분명히 구조체에 Stack * 멤버를 가질 수 있고 함수 포인터를 사용하기 전에 구조체의 주소로 초기화 할 수 있습니다. 그런 다음 스택 *을 함수 포인터에 대한 매개 변수로 만듭니다.

+4

방금 ​​열쇠가 들어있는 상태에서 차를 잠갔습니다. –

+0

그건 분명해 보입니다. 그것에 관해서 그것을하지 않았고, 그것을 시험해보아야한다. 감사합니다 – foo

+0

이 사이트의 다른 사용자가 다른 사람들보다 먼저 질문을하는지 궁금합니다. 나는이 질문이 어떻게 1 분 안에 4 개의 답을 얻을 수 있는지 보지 못합니다. – ThomasMcLeod

2

C의 일반적인 접근 방식은 첫 번째 매개 변수로 this을 기대하는 함수를 갖는 것입니다.

int push(Stack *self, int val) 
{ 
    if (self->current_size == self->max_size -1) return 0; 
    self->data[self->current_size++] = val; 
    return 1; 
} 

이 당신이 다형성을 필요로하지 않는 한 당신은 그냥 대신 stack->push(stack,10)push(stack, 10)를 호출 할 수 있기 때문에, 당신은 스택에 기능을 넣어하지 않아도 추가 혜택이있다.

+0

감사합니다. 그것이 첫 번째 접근 이었지만, 나는 함수 포인터로 재미있게하고 싶었고 C가 C++ 동작을 얻는 것이 얼마나 가능했는지 알고 싶었습니다. 이것의 목적은 나 자신을 교육하고 실험하는 것입니다. 진지한 것은 아닙니다. 나는 push (stack, 10)를 사용하는 것이 C에서 가장 현명한 일임에 동의한다. – foo

-1

당신이 (당신은 분명히 스택라는 것을) 하나의 스택을 구조를해야 할 것 때문에, 당신은 전역 변수로 정의 할 수 있습니다. 이것은 팝/푸시가 스택 스택을 직접 참조 할 수있게합니다.

스택 :

당신이 뭔가를 할 것입니다.current_size + = 4;

또는 사용 - 당신이 스택에 메모리 포인터로 스택를 선언하기로 결정한 경우> 연산자를.

-1
#include <stdio.h> 
#include <stdlib.h> 
#include <malloc.h> 


typedef struct _foo 
{ 
    int q; 
    void (*Bar)(); 
} Foo; 
Foo * This; 

Foo * foo(Foo * f) 
{ 
    This = f; 
    return f; 
} 

void Bar() 
{ 
    printf("%i\n",This->q); 
    This->q++; 
} 


Foo * FooNew() 
{ 
    Foo * foo = malloc(sizeof(Foo)); 
    foo->q = 1; 
    foo->Bar = &Bar; 
} 

int main() 
{ 
    Foo *f = FooNew(); 
    Foo *g = FooNew(); 


    foo(f)->Bar(); 
    foo(f)->Bar(); 
    foo(f)->Bar(); 

    foo(g)->Bar(); 
    foo(g)->Bar(); 
    foo(g)->Bar(); 

    return 0; 
} 
관련 문제