相关疑难解决方法(0)

常规演员与static_cast与dynamic_cast

我已经编写了近二十年的C和C++代码,但这些语言的一个方面我从未真正理解过.我显然使用常规演员表,即

MyClass *m = (MyClass *)ptr;
Run Code Online (Sandbox Code Playgroud)

到处都是,但似乎有两种其他类型的演员,我不知道其中的区别.以下代码行之间有什么区别?

MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
Run Code Online (Sandbox Code Playgroud)

c++ pointers casting

1661
推荐指数
8
解决办法
67万
查看次数

如何"动态"将Object类型的实例强制转换为其特定的数据类型?

public Object foo(int opt){
  if (opt == 0) return new String();
  else if (opt == 1) return new Integer(1);
  else if (opt == 2) return new Double(1);
  else if ...
  .. and many more
}

public void doSomething(String s){..}
public void doSomething(Integer i){..}
public void doSomething(Double d){..}
... and many more doSomething method

public static void main(String[] args){
  ...
  Object o = foo(x); //x is a value obtained during runtime, e.g. from user input

  //now I want to call doSomething …
Run Code Online (Sandbox Code Playgroud)

java reflection types casting dynamic

14
推荐指数
1
解决办法
3万
查看次数

是否将指向类的指针强制转换为它的第一个成员非法?

我在我们的项目中看到一些奇怪的代码,如下所示。我测试它并得到正确的答案。但我认为这是非法的,谁能给我解释一下?

class Member
{
public:
    Member():
        a(0),b(1)
    {}

    int a;
    int b;
};

// contains `Member` as its first member
class Container
{
public:
    Container():
        c(0),d(0)
    {}

    Member getMemb(){return fooObject;}

    Member fooObject;
    int c;
    int d;
};
Run Code Online (Sandbox Code Playgroud)

以及我们如何使用它:

int main()
{
    auto ctain = new Container;
    auto meb = (Member *)ctain; // here! I think this is illegal

    cout << "a is " <<  meb->a << ", b is" << meb->b << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了正确的答案,a是0,b是1。这只是巧合吗?我还注意到如果fooObject不是第一个成员,我会得到错误的答案。

c++ pointers casting

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

标签 统计

casting ×3

c++ ×2

pointers ×2

dynamic ×1

java ×1

reflection ×1

types ×1