2010-03-05 5 views
0

C++에서는 객체를 정수로 변환 할 수 있습니까?타입 캐스팅 (C++)

내 질문을 분명히해라. - 파일 생성, 열기, 쓰기, 쓰기와 같은 모든 파일 관리 작업을 수행하는 인터페이스를 만들었다 고 가정 해 보겠습니다. 파일의 모든 인스턴스에 대해 고유 한 핸들을 갖고 싶습니다. 그 인스턴스를 정수로 형변환 만하면 파일 인터페이스의 모든 인스턴스에서 파일 핸들을 얻을 수 있습니까?

모두에게 - 나는 희망합니다.

+1

'개체'는 무엇을 의미합니까? C++에는 이러한 내장 유형이 없습니다. 달성하려는 목표를 제시하십시오. – Kerido

+0

당신은 무엇을 기대합니까? – kennytm

+3

질문을 더 명확하게하고 더 자세하게 설명해주십시오. 당신이하려고하는 것에 대한 코드 예제는 아마도 좋은 생각 일 것입니다. –

답변

5

일부 개체는 아닙니다. C++의 모든 객체에는 유형이 있습니다. 해당 유형의 객체는 int에 대한 캐스트가 존재하는지 여부를 정의하고, 그렇다면 어떤 알고리즘이 사용되는지를 정의합니다.

3

개체가 있고이를 int으로 전송하려는 경우 명시 적으로 해당 클래스에 operator int을 제공해야합니다.

0

편집 : 파일을 고유 한 핸들에 매핑하므로 std::vector<std::string> 또는 vector<shared_ptr<fstream> > 또는 vector<FILE*>을 사용할 수 있습니다.

POSIX 호환 시스템에서는 FILE*int 인 파일 설명자로 변환하는 fileno도 있습니다.


해시를 얻으려면 : boost에서 hash_value 함수를 사용하십시오.

은 전적으로 정수로 값을 변환하려면 그냥 (int)value을 사용 : 정수로 값을 캐스팅하기 위해 부스트

에서 lexical_cast<int> 기능을 사용합니다.

위의 코드가 작동하려면 변환 할 클래스에 몇 가지 특수 멤버 함수를 구현해야합니다. operator<<operator int.

개체를 임의의 고유 한 정수로 변환하려면 (int)&value을 사용하십시오.

임의의 정수를 얻으려면 rand()을 사용하십시오.

0

나는 오히려 long 유형으로 변환하고 싶습니다. 포인터 값이 x64 시스템에서 정수 유형으로 변환 될 때 더 안전합니다. 이 경우 reinterpret_cast<long>(myInterfacePointer)을 사용할 수 있습니다.

+2

'길다'가 아닙니다. 'uintptr_t'. – asveikau

+0

또한 int 로의 캐스팅 포인터는 물을 밟는 나쁜 생각입니다. – Potatoswatter

+0

당신은 LP64를 가정합니다. Windows는 x64와 IA64 모두 LLP64를 사용하고 'long'은 32 비트이므로 위험합니다. asveikau가 맞다면 uintptr_t를 사용해야하며, 그렇지 않은 경우 이식성 헤더에서 가짜 코드를 사용하십시오. –

0

sizeof (int) == 4로 가정하면 개체의 처음 4 바이트 부분에 액세스 할 int로 개체를 캐스팅하여 sizeof (int)와 비교하여 sizeof (YourObject) , 귀하의 개체가 sizeof (int)보다 어딘가에 있다면 액세스 위반 또는 충돌이 발생합니다. 캐스팅 :

`

MyObject object; 
int castedObject = *((int*)&object); 

`

중간 포인터없이 캐스팅, 당신은 MyObject를 클래스 내부 배역 연산자를 제공해야합니다.또는

+0

그건별로 의미가 없으며 작동하기 쉽지 않습니다. 특정 행동을 보장하는 것이 훨씬 적습니다. – Potatoswatter

+0

글쎄, 질문을 편집하기 전에, 그게 그가 원하는대로, 나는 그저 효과를 상관없이 어떤 개체를 int int로 캐스팅하는 방법을 설명합니다. – uray

+0

1.sizeof (int) == 4는 잘못된 가정입니다. 2. object가 int보다 작 으면 충돌이 발생하지 않을 가능성이 있으므로 정크 데이터를 얻게됩니다. 3. object가 int보다 큰 경우 첫 번째 바이트는 플랫폼에 따라 다릅니다. 4. 포인터를 통해 캐스팅하는 것은 모든 작업에 적합하지 않습니다. 5. 연산자 =를 클래스 외부에서 정의 할 수 없으므로 내장 유형을 정의 할 수 없습니다. 6. 가능하다면'int '를 반환하기 위해'int'를 어떻게 구성할까요? – Potatoswatter

1
class File 
{ 
public: 
    ... 
    ... 
    operator int() { return int(this); } 
    ... 
} 

int& operator=(const MyObject& object){...}의 글로벌 정적 함수를 선언 할 수 있습니다 그리고

File myFile; 
int myFileHandle = myFile; 
+0

'int'는 포인터만큼 클 수는 없습니다. 대부분의 64 비트 시스템은 64 비트 포인터와 32 비트 int를 가지므로 두 개의 다른 포인터가 동일한 int에 별칭을 지정할 수 있습니다. ID로 포인터를 사용하고 int를 완전히 피하는 것이 좋습니다. – Potatoswatter

+0

@Potatoswatter - 네, 맞습니다. ID로 포인터를 사용하는 방법에 대해 자세히 설명 할 수 있습니까? – khushi

+0

@ khushi : 이드에게 필요한 것은 무엇입니까? 'void *'는 원래 포인터 타입으로 캐스팅하고 동등성을 테스트하는 것을 지원합니다. – Potatoswatter

0

왜 그냥 파일 기술자는/운영 체제에서/어떤 ID를 처리하고 그것을 사용하는거야? 대부분의 시스템에는 그런 종류의 개념이 있습니다.

핸들이 실제로 포인터가되도록하려면 int 대신 void *을 사용하는 것이 좋습니다. 그런 다음 포인터를 객체에 캐스팅하여 핸들에 쉽게 캐스팅 할 수 있으며 구현을 숨길 수 있습니다.

+0

예, u r 오른쪽하지만이 파일 핸들을 생성해야하는이 부분에 대한 제한이 있습니다. – khushi

+0

각 인스턴스에 대해 UUID를 생성 할 수 있습니까? – uray

+0

@ khushi : 파일 핸들에는 어떤 한계가 있습니까? 'int'는 할 수 있지만'void *'는 할 수없는 것은 무엇입니까? – Potatoswatter

0

@ potatoswatter 님의 답변에 대한 첫 번째 응답입니다.

나는 물건을 던지기를 좋아하지 않습니다. 오히려 파일 이름이나 읽기/쓰기 플래그를 기반으로 정수 해시를 생성하는 해시 함수를 사용하려고합니다. 지금, 나는 정수 변환 연산자가 이제 해시 함수 다른 답변

class File 
{ 
public: 
    ... 
    ... 
    operator int(); 
    ... 
private: 
    char fileName[]; 
    int flags; 
}; 

을 게시 할 수 있습니다

File::operator int() 
{ 
int hash = 0; 
int c; 
char *str = fileName; 

while (c = *str++) 
    hash += c; 

hash += flags; 

return hash; 
} 

나는 해쉬 함수가 형편 알고있다. 그러나 더 형편없는 캐스트를 피할 수 있으며 사용자의 요구에 더 잘 맞는 자신의 해시 함수를 제안 할 수 있습니다.

+0

이 경우 IMO는 명명 된 함수 (getHash())를 사용하는 것이 훨씬 낫습니다. 기본 클래스로 클래스를 형변환하는 것은 클래스가 기본 클래스를 에뮬레이트 할 때만 의미가있을 것입니다. – visitor