당신은 다른 해결책에 대해 생각할 수 있습니다. 루프에서는 선택한 솔루션과 상관없이 기능이 실행되지 못하도록 일부 여분의 코드가 항상 실행됩니다. funX의 실행을 루프에서 건너 뛸 수 있지만, funX를 실행하고 다르게 배치 할 수 있는지 확인하는 데는 추가 코드가 필요합니다.
일반적으로 다른 작업 전에 초기화가 수행되기 때문에 이상한 문제이거나 잘못된 이름입니다 (초기화라고해서는 안됩니다). 당신이 원하는 경우
이 기능은
if (!initialized) initialize();
항상 여분의 코드처럼, 스스로 이니셜 라이저를 호출 할 수 있습니다! 항상 다음부터 잘못된 것 초기화.
하지만 반복해서 확인하는 것을 피하는 방법은 게임이 실제 게임을 시작하기 전에 올바른 위치에서 초기화를 명시 적으로 호출하는 것입니다. (그렇지 않으면 초기화라고하지 마십시오.)
개체라면 ... 개체를 필요로하지 않습니다. 생성자를 "trig"하려면 적어도 new MyClass()
또는 "선언"과 같이 객체를 생성해야합니다 (많은 OO 언어에서). 여기에서는 "new"에 대한 호출 (호출이 아니지만이 연설을 위해 우리는 이런 식으로 생각할 수 있습니다) 또는 "선언"이 명시 적 초기화 자의 호출로 변경됩니다.귀하 분명히 간단한
Object a;
// ...
a.method(); //or
Object *a = new Object();
// ...
a->method();
것이 예, 그것은 명시 적으로 초기화 그렇게 대단히 나쁘지 않다과 OO 언어 정말 명확하지 않다 "일치"를 "필요"해야 않더라도
init()
// ...
funA();
이 문제를 "고칠"필요는 없습니다.
이러한 기능을 호출 할 수있는 시간을 제어 할 수 있으므로 전혀 점검 할 필요가 없습니다. 그것은 당신이 그들을 사용할 수 있기 전에 특수한 init 함수를 먼저 호출해야하는 많은 라이브러리에서 발생하거나 "이상한"동작이 예상되어야합니다. 생산은 무 조작으로 평가됩니다 빌드에 -이 초기화 코드를 확인 만 디버그 빌드합니다
#ifdef DEBUG
# define ENSURE_INITIALIZED(obj) \
do { \
if (obj->initialized != INIT_CODE) { \
fprintf (stderr, "Object %p not initliaized (%s:%d)\n", obj, __FILE__, __LINE__); \
abort(); \
} \
} while (0)
#else
# define ENSURE_INITIALIZED(obj)
#endif
voif foo (Object *obj) {
ENSURE_INITIALIZED (obj);
}
:
그러나 각 If는 초기화 된 경로에 정확히 하나의 추가 기계 명령어 즉 단일 비교를 생성합니다. 오버 헤드가 그렇게 나쁠 것이라고는 생각하지 않습니다. – JeremyP
당신은 그것을 '객체'로 만들 수 있습니다. 그냥 struct에 물건을 넣은 다음 각 함수에 구조체를 전달한 다음 Init에 할당하고, 초기화하고, 포인터를 반환하고, 하나의 소스 파일에 구조체 정의를 유지하여 포인터 불투명하고 멤버 변수 private 인 클래스와 같습니다. – Spudd86