相关疑难解决方法(0)

将指针转换为指针时的 static_cast VS reinterpret_cast

鉴于以下条件:

struct A
{
    int a;
};

struct B
{
    int b;
};

int main()
{
    A  a {1};
    A* p = &a;
Run Code Online (Sandbox Code Playgroud)

使用static_cast和使用reinterpret_castvia 进行铸造void*会产生相同的结果吗?即以下表达式之间有什么区别吗?

    static_cast      <A*> ( static_cast      <void*> (p) );
    reinterpret_cast <A*> ( reinterpret_cast <void*> (p) );
Run Code Online (Sandbox Code Playgroud)

如果我们投指针到一个类的指针到其他课程,static_cast并与reinterpret_cast?这两个运营商之间有什么区别吗?下列表达式是否相同?

    static_cast      <B*> ( static_cast      <void*> (p) );
    reinterpret_cast <B*> ( reinterpret_cast <void*> (p) );
    reinterpret_cast <B*> (                           p  );
Run Code Online (Sandbox Code Playgroud)

我可以B*在此之后使用指针来访问b成员吗?

c++ static-cast reinterpret-cast

2
推荐指数
1
解决办法
142
查看次数

何时使用reinterpret_cast而不违反严格的别名规则?

很长一段时间我都是reinterpret_cast这样使用的:

static_assert(sizeof(int) == sizeof(float));
int a = 1;
float b = *reinterpret_cast<float*>(&a); // viewed as float in binary.
Run Code Online (Sandbox Code Playgroud)

然而,当我最近回顾C++中的类型转换时,我发现当考虑严格的别名规则时,它是UB!可以优化对初始数据的不同类型(或者确切地说,非相似类型)的指针的引用。(我知道std::bit_cast在 C++20 中这是另一种方法。)

从我的角度来看,reinterpret_cast主要是用于指针类型转换。然而,考虑到禁止取消引用,我如何使用另一种类型的指针?

我浏览了何时使用reinterpret_cast,下面引用了一个答案:

需要reinterpret_cast 的一种情况是与不透明数据类型交互时。这种情况经常发生在程序员无法控制的供应商 API 中。下面是一个人为的示例,其中供应商提供了用于存储和检索任意全局数据的 API。

但是当涉及到这些API的实现时,如果要在那里使用数据,就很难避免取消对指针的引用。

看起来只有转换为另一种指针类型并返回初始指针类型才是合理的(但这有什么意义?为什么不使用初始类型或直接定义模板?)。所以我的问题是:什么时候使用reinterpret_cast而不违反该规则?有没有通用的用法?

我真的是 C++ 的新手,所以任何建议将不胜感激。

c++ casting reinterpret-cast

2
推荐指数
1
解决办法
458
查看次数

对指针及其地址感到困惑

我已经在代码中创建了一些指针,但是结果却不是我期望的。

这是简单的代码:

int main(int argc, char const* argv[])
{
    int myInt = 23;
    int* ptr = &myInt;

    char* buffer = new char[8];
    memset(buffer, 0, 8);

    char** ptr2 = &buffer;

    std::cout << "ptr address is " << ptr << std::endl;
    std::cout << "buffer pointer is pointing to address " << buffer << std::endl;
    std::cout << "ptr2 pointer is pointing to address " << ptr2 << std::endl;
    std::cout << "Dereferencing ptr2 = " << *ptr2 << std::endl;
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

这是运行代码的结果:

ptr地址是0x7ffde215a14c …

c++ pointers

1
推荐指数
1
解决办法
50
查看次数

重新解释为子类的父类可以在其函数中使用子类的函数吗?

我想在重新解释的类中从父函数调用子函数,如下所示。

例子

#include <iostream>

class A {
public:
    void func1() {
        // some code
        func2();
        // some code
    }
protected:
    virtual void func2() {
        printf("class A\n");
    }
};

class B : public A {
protected:
    virtual void func2() {
        printf("class B\n");
    }
};

int main() {
    A* ab = new A();
    ab->func1(); // this print "class A"

    B* bab = reinterpret_cast<B*>(ab);
    bab->func1(); // this also print "class A"
    // I want to print "class B" when I use bab->func1() 
} …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance

1
推荐指数
1
解决办法
225
查看次数

从void指针中获取一个指向short的int

我有一个库的返回值,它是一个void指针.我知道它指的是一个简短的int; 我尝试以下列方式获取int值(用简单的赋值替换函数调用a void *):

short n = 1;
void* s = &n;
int k = *(int*)s;
Run Code Online (Sandbox Code Playgroud)

我尝试转换一个指向一个地址的空指针,其中有一个短的,我试图将指针转换为指向一个int,当我这样做时,输出变成一个垃圾值.虽然我理解为什么它表现得像我不知道是否有解决方案.

c++ pointers type-conversion void-pointers

-2
推荐指数
1
解决办法
114
查看次数