[C++]void*의 구조체나 클래스를 사용하여 판별하는 방법
void 지침의 클래스, 구조체를 이용한 판별 방법
제목과 같이void*나template를 사용하여 유니버설 코드를 만드는 것이 유용하지 않습니까?
이제 알고리즘을 만들면서 얻은 기술 노하우를 비망록으로 남겼다.
1.원래,void 포인터는 무엇입니까?
[void*]는 어떤 종류의 지침에도 대응할 수 있는 만능 지침을 가리킨다.
[void*]가 가리키는 유형은char,int,short,long,(복합체)struct 또는class일 수 있습니다
그렇기 때문에 통용성이 높지만 사용하기 어려운 것은 [void*]이다.
2.void*를 사용하여 반과 구조체를 구분하는 것은 어떻게 된 일입니까?
보이드*란 무엇이든 표현할 수 있는데도 그것을 분리하는 것은 어떻게 된 일입니까?그런 생각을 하는 사람이 있을 것 같아서요.
분할에 필요한 키워드는'로고·아이디'다.
구조체와 클래스의 머리에는 식별자를 대체할 수 있는 ID가 있어야 합니다.
예컨대
ssample.cpptypedef struct stSample {
char m_ID; // ← このように、先頭に識別の役割をするIDを置く
char* m_pData;
} Sample;
그러면 메모리의 설정은 다음과 같다.
32비트 CPU라면 포인터 처리의 주소 자체가 4Byte이고 포인터의 변수 부분은 4Byte이다.
※ 더블*이든 보이드*든'포인터'라면 마찬가지입니다.(64비트에서 8Byte.)
요점은 정의된 순서에 따라 앞에서부터 채워서 메모리에 비추는 것입니다.
3. 실제 간단한 코드로 상상해보세요
이렇게 써 봤어요.콘솔의 와이어를 사용할 수 없습니다.
아무런 의미가 없는 코드에 대해서...
sample.cppenum structType {
structType_1 = 1,
structType_2
}
typedef struct stSample1 {
char m_ID;
char* m_pData;
} Sample1;
typedef struct stSample2 {
char m_ID;
double m_Data;
} Sample2;
void disp(void* pData);
void main() {
Sample1 sample1;
Sample2 sample2;
sample1.m_ID = structType_1;
sample1.m_pData = "てすと";
sample2.m_ID = structType_2;
sample2.m_Data = 0.125;
disp(sample1);
disp(sample2);
}
void disp(void* pData) {
// ((char*)pData)[0] が 2.の画像にある【m_ID】を表しています。
switch( ((char*)pData)[0] ) {
case structType_1:
Sample1* pTmp = (Sample1*)pData;
printf("Data: %s\n", pTmp->m_pData);
break;
case structType_2:
Sample2* pTmp = (Sample2*)pData;
printf("Data: %f\n", pTmp->m_Data);
break;
}
}
4. 안전 주의
3. 위에 적힌 코드라면 외부에 공개된 상태에서 ID가 변조되어 예상치 못한 동작에 빠질 수 있다.
이 경우 다음과 같이 액세스 제한을 두면 안전합니다.(단, C 언어는 안 돼요.)
나는 찬반 두 가지 의견이 있다고 생각한다
sample.cppenum structType {
structType_1 = 1,
structType_2
}
typedef struct stSample1 {
private:
char m_ID;
public:
stSample1() {
m_ID = structType_1;
}
public:
char* m_pData;
} Sample1;
typedef struct stSample2 {
private:
char m_ID;
public:
stSample1() {
m_ID = structType_2;
}
public:
double m_Data;
} Sample2;
총결산
void*를 사용한 구조체와 클래스의 판별 방법을 썼습니다.
클래스나 구조체의 시작 부분에서 식별용 변수를 준비하여 주소의 시작 부분에서 ID의 변수 형식만 얻을 수 있는 Byte
식별용 변수에 해당하는 값을 얻을 수 있기 때문에 이용할 수 있다고 한다.
Reference
이 문제에 관하여([C++]void*의 구조체나 클래스를 사용하여 판별하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/subrutm/items/f8695b5589a0e5402ced
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
typedef struct stSample {
char m_ID; // ← このように、先頭に識別の役割をするIDを置く
char* m_pData;
} Sample;
enum structType {
structType_1 = 1,
structType_2
}
typedef struct stSample1 {
char m_ID;
char* m_pData;
} Sample1;
typedef struct stSample2 {
char m_ID;
double m_Data;
} Sample2;
void disp(void* pData);
void main() {
Sample1 sample1;
Sample2 sample2;
sample1.m_ID = structType_1;
sample1.m_pData = "てすと";
sample2.m_ID = structType_2;
sample2.m_Data = 0.125;
disp(sample1);
disp(sample2);
}
void disp(void* pData) {
// ((char*)pData)[0] が 2.の画像にある【m_ID】を表しています。
switch( ((char*)pData)[0] ) {
case structType_1:
Sample1* pTmp = (Sample1*)pData;
printf("Data: %s\n", pTmp->m_pData);
break;
case structType_2:
Sample2* pTmp = (Sample2*)pData;
printf("Data: %f\n", pTmp->m_Data);
break;
}
}
enum structType {
structType_1 = 1,
structType_2
}
typedef struct stSample1 {
private:
char m_ID;
public:
stSample1() {
m_ID = structType_1;
}
public:
char* m_pData;
} Sample1;
typedef struct stSample2 {
private:
char m_ID;
public:
stSample1() {
m_ID = structType_2;
}
public:
double m_Data;
} Sample2;
void*를 사용한 구조체와 클래스의 판별 방법을 썼습니다.
클래스나 구조체의 시작 부분에서 식별용 변수를 준비하여 주소의 시작 부분에서 ID의 변수 형식만 얻을 수 있는 Byte
식별용 변수에 해당하는 값을 얻을 수 있기 때문에 이용할 수 있다고 한다.
Reference
이 문제에 관하여([C++]void*의 구조체나 클래스를 사용하여 판별하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/subrutm/items/f8695b5589a0e5402ced텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)