2013-08-24 3 views
-1

는 : 역 참조 typecasted 무효 * 객체 포인터 코드의이 부분에 관해서

#include <iostream> 

class CClass1 
{ 
public: 
    void print() { 
     std::cout << "This should print first" << std::endl; 
    } 
}; 

class CClass2 
{ 
public: 
    void print() { 
     std::cout << "This should print second" << std::endl; 
    } 
}; 

그래서 누군가가 (말하자면) 다른의 여러 인스턴스를 가리 할 수있는 "자유 포인터를"문제에 대해 흥미로운 질문을 새로운 유형의 객체를 만들 필요없이 객체를 생성 할 수 있습니다. 이 포인터는 유형이 void * 일 수 있으며 무효이므로 객체의 모든 인스턴스를 가리키고 객체의 공용 속성에 액세스 할 수 있다고 생각할 수 있습니다.

다음 솔루션은 제출 :

int main() { 
    void *pClass(NULL); 
    ((CClass1 *)(pClass))->print(); 
    ((CClass2 *)(pClass))->print(); 
    std::cin.ignore(); 
    return 0; 
} 

내 질문입니다 위의 작업을 수행하지만, 이것은하지 않는 이유 :

int main() { 
    (CClass1 *FG)->print(); 
    (CClass2 *FG)->print(); 
    std::cin.ignore(); 
    return 0; 
} 
+0

첫 번째 것도 작동하지 않습니다. 적절한 대상을 가리키고 있지 않습니다. – chris

+0

그것은 나를 위해 잘 컴파일 된 이유입니다. 그래서 실험을 시작한 이유입니다. @chris 정확히 제가 왜 놀랍습니까? 실제 개체가 가리킬 수 없기 때문에 효과가 있었지만 여전히 정확한 것을 인쇄했기 때문입니다. – smac89

+0

그 것을 좋아하게 될 것입니다. 그것을 컴파일하는 것은 전투의 절반, 일반적으로 쉬운 반이다. – chris

답변

1

첫 번째 예는 비를 호출하여 정의되지 않은 동작을 보여줍니다 유효한 개체를 가리 키지 않는 포인터를 통한 정적 멤버 함수. 문제의 기능이 어떤 식 으로든 this을 사용하지 않기 때문에 우연히 만 작동합니다.

두 번째 예제는 구문이 올바르지 않습니다. 나는 네가 그곳에서 무엇을하려고하는지조차 확신하지 못한다. 코드는 말이되지 않습니다.

+0

첫 코드가 수행 한 작업을 복제하려고했습니다. 유효한 객체를 가리키는 것이 아니기 때문에 두 번째 코드를 시도하고 어떤 결과가 발생하는지 확인해야한다고 생각했습니다. – smac89