iterator 구조를 정의 할 때 뭔가 놓친 것 같습니다. 왜 이터레이터는 iterator를 받아들이는 'end'함수에 대한 함수 포인터를 가지고 있습니까? 반복자를 만들려면 다음 함수를 정의 할 수있는 벡터의 정의에서
typedef struct __iterator {
void * ptr_to_container;
int (*end)(void *);
} iterator;
int end(iterator * it) { return it->end(it->ptr_to_container)); }
(및 기타 데이터 유형) : 당신이 정말 일반적인 싶은 경우
, 당신은 아마도이 대신 정의를 사용할 수 있습니다 :
static int vector_end(vector * v) { /* implementation omittted */ }
iterator * vector_create_iterator(vector * v)
{
iterator * it = malloc(sizeof(iterator));
it->ptr_to_container = v;
it->end = vector_end;
return it;
}
그러나 솔루션은 실제로 데이터 구조가 정의되는 방법에 따라 달라집니다. 위의 제안에서, 트래버스하는 방법을 구현하는 것은 각 데이터 구조에 달려 있습니다.
는 대안으로
typedef struct _container container;
struct _container {
int (*end)(container * c);
};
같은 일반적인 데이터 구조 인터페이스를 설정할 수 있습니다 그리고 벡터 구현 것 "전용"이 컨테이너 구조를 입력해야합니다 :
typedef struct _vector {
container c;
/* other fields required by the vector */
}
static int vector_end(container * c)
{
vector * v = (vector *) c;
...
}
container * create_vector()
{
vector * v = malloc(sizeof(vector));
v->c.end = vector_end;
return v;
}
. 반복기는 일반 컨테이너로만 작동 할 수 있습니다.
typedef struct _iterator {
container * c;
/* other fields used by the iterator, such as current position */
}
int end(iterator * it) { return it->c->end(it->c); }
샘플을 보면 거의 두 가지 접근법이 뒤섞인 것처럼 보입니다 :-)
itr-> ptr_to_container를'__vector *'로 변환 해 보았습니까? –
[식별자로 __vector는 정의되지 않은 동작입니다.] (http://stackoverflow.com/questions/224397/why-do-people-use-double-underscore-so-much-in-c) 나는 여러 컴파일러에 대해 알고 있습니다. 실제로 이것에 대해서도 질식 할 것입니다. [참고] (http://c-faq.com/decl/namespace.html) – Flexo
정적 (즉, 컴파일 타임) 다형성을 얻으려고합니다. 이것은 C에서 (코드 생성 단계의 일종) 없이는 본질적으로 불가능합니다. –