试图通过将它包装成 void* 来获得一个 int,然后再次将它包装回 Integer,但我没有成功

Trying to get an int by wraping it into void* and again wrap it back into Integer but i am not successfull

#include <iostream>

class Singleton {
    static Singleton instance;
    int num;
    Singleton() = default;

    Singleton(Singleton &) = delete;
    Singleton(Singleton &&) = delete;
    Singleton &operator=(Singleton &) = delete;

public:
    static Singleton &GetInstance() {
        return instance;
    }
    void* get(){
        return (void*)num;
    }
    void setNum(const int num){
        this->num = num;
    }
};

Singleton Singleton::instance;

int main() {
    Singleton::GetInstance().setNum(12);
    std::cout << *(static_cast<int*>(Singleton::GetInstance().get())) << std::endl;
}

所以我感兴趣的领域在于这个功能

void* get(){
        return (void*)num;
}

并在 int main

内接收
std::cout << *(static_cast<int*>(Singleton::GetInstance().get())) << std::endl;

但我的输出不清楚,我认为这是一些 udefine 行为,但我的目标是打印已经通过的 12。如果有适当的参考,将不胜感激任何人的帮助。

如果您需要 return 一个整数值作为通用指针 (void*) 那么您真的应该分两步进行转换:首先转换为一个足够大的整数类型既是整数又是指针,那么在第二步中指向泛型指针:

void* get()
{
    return reinterpret_cast<void*>(static_cast<std::intptr_t>(num));
}

那么当你使用 returned 指针时,你必须记住它实际上 不是 你 returned 的指针,而是实际的整数价值本身。这意味着您需要在使用该值时进行相反的转换,而不是试图以任何方式取消引用它:

auto value_ptr = Singleton::GetInstance().get();
std::cout << static_cast<int>(reinterpret_cast<std::intptr_t>(value_ptr)) << '\n';

我真的不建议通常以这种方式使用值作为指针。有几个地方可能需要它,但这似乎不是其中之一。


另一种可能的解决方案实际上是return 一个指向变量num:

的指针
void* get()
{
    return &num;
}

因为这实际上是一个指针,您应该取消引用它以获取它指向的值:

auto value_ptr = Singleton::GetInstance().get();
std::cout << *static_cast<int*>(value_ptr) << '\n';