[C++]void*의 구조체나 클래스를 사용하여 판별하는 방법

void 지침의 클래스, 구조체를 이용한 판별 방법


제목과 같이void*나template를 사용하여 유니버설 코드를 만드는 것이 유용하지 않습니까?
이제 알고리즘을 만들면서 얻은 기술 노하우를 비망록으로 남겼다.

1.원래,void 포인터는 무엇입니까?


[void*]는 어떤 종류의 지침에도 대응할 수 있는 만능 지침을 가리킨다.
[void*]가 가리키는 유형은char,int,short,long,(복합체)struct 또는class일 수 있습니다
그렇기 때문에 통용성이 높지만 사용하기 어려운 것은 [void*]이다.

2.void*를 사용하여 반과 구조체를 구분하는 것은 어떻게 된 일입니까?


보이드*란 무엇이든 표현할 수 있는데도 그것을 분리하는 것은 어떻게 된 일입니까?그런 생각을 하는 사람이 있을 것 같아서요.
분할에 필요한 키워드는'로고·아이디'다.
구조체와 클래스의 머리에는 식별자를 대체할 수 있는 ID가 있어야 합니다.
예컨대
ssample.cpp
typedef struct stSample {
  char  m_ID; // ← このように、先頭に識別の役割をするIDを置く
  char* m_pData;
} Sample;
그러면 메모리의 설정은 다음과 같다.

32비트 CPU라면 포인터 처리의 주소 자체가 4Byte이고 포인터의 변수 부분은 4Byte이다.
※ 더블*이든 보이드*든'포인터'라면 마찬가지입니다.(64비트에서 8Byte.)
요점은 정의된 순서에 따라 앞에서부터 채워서 메모리에 비추는 것입니다.

3. 실제 간단한 코드로 상상해보세요


이렇게 써 봤어요.콘솔의 와이어를 사용할 수 없습니다.
아무런 의미가 없는 코드에 대해서...
sample.cpp
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;
  }
}

4. 안전 주의


3. 위에 적힌 코드라면 외부에 공개된 상태에서 ID가 변조되어 예상치 못한 동작에 빠질 수 있다.
이 경우 다음과 같이 액세스 제한을 두면 안전합니다.(단, C 언어는 안 돼요.)
나는 찬반 두 가지 의견이 있다고 생각한다
sample.cpp
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
식별용 변수에 해당하는 값을 얻을 수 있기 때문에 이용할 수 있다고 한다.

좋은 웹페이지 즐겨찾기