우선 stack
및 stack_l
에 다른 식별자를 요구하지 않습니다. 자, 질문 :
Push
기능이 copy
필드의 유형과 호환되지 않습니다 (stack_l
). struct
에 (member-) 함수에 대한 포인터를 포함하여 C++처럼 보이게하려면이 함수에 객체를 전달해야합니다.
예, 어딘가에서 기능을 구현해야하며 이는 struct stack
의 정의 안에있을 수 없습니다. 이것은 어떤 종류의 생성자 함수가 필요함을 의미합니다 (원할 경우 newStack
이라고 부를 수 있습니다). 생성자는 최소한 함수 포인터를 초기화해야합니다 (유지하려는 경우). 당신이이 함수 포인터를 유지하지 선택하는 경우 당신이 제안 당신이 당신의 push
일상에서 잘 초기화 코드를 넣을 수 있습니다 : 당신이 명시 적으로 빈 스택이 무엇인지 명시해야
stack_l* stackPush(stack_l* head, void* content) {
// head might be NULL, meaning the stack is "empty" or it might be an actual pointer
// we don't care
stack_l* const front = malloc(sizeof(stack_l));
*front = (stack_l){.data = content, .next = head};
return front;
}
참고.당신의 마지막 질문에
void stackDestroyEmpty(stack_l* s) {
assert(s == NULL && "Tried to destroy non-empty stack.");
}
:
stack_l* stackCreateEmpty() {
retun NULL;
}
을 그리고 어쩌면 소멸자 : 그래서 당신은 명확성을 위해 생성자를 구현할 수 있습니다 위에서 보듯이, 당신이 공간을 얻을 수 malloc
을 사용해야합니다 stack_l
의 일부이므로 void*
회원에게 추가 공간을 할당 할 필요가 없습니다.
분명히 요소를 제거하는 Pop 함수도 만들었습니다. – Kyrol