【问题标题】:c++ implicit pointer conversionc++隐式指针转换
【发布时间】:2012-09-06 20:53:19
【问题描述】:

我有以下测试程序(展示了我真正想要完成的事情)。

有谁知道如果没有 reinterpret_cast以下是否可行?

struct B;

struct A {
  A() { }
  A( const B &b) { }
  A( const B *b) { }
  A( B *b) { }

  A* operator=(const B *b) { }
  A* operator=(B *b) { }
};

struct B {
  B() { }
  B( const A &a) { }
  B( const B * b) { }
  B( B *b) { }

  B* operator=(const A *a) { }
  B* operator=(A *a) { }
};

int main(int argc, char *argv[])
{
  A *a = new A();
  B *b = new B();

  A *c = b;

  return 0;
}

我尝试了所有我能做的转换运算符,但我似乎无法得到

  A *c = b;

不要抱怨

error C2440: 'initializing' : cannot convert from 'B *' to 'A *'

【问题讨论】:

  • 你可以从A 中制作B inherit。否则指针转换并没有多大意义。
  • 这是一个人为的例子,但在我正在处理的生产代码中,A 和 B 可以通过转换构造函数进行转换(通过参考)
  • 但它们是完全不同的类型。把一个当作是另一个是没有意义的。
  • A cast 是您在源代码中编写的内容;它告诉编译器进行转换。因为它包含在源代码中,所以没有隐式转换这样的东西。然而,有诸如隐式转换之类的东西。
  • 您可以通过引用来完成。引用可以隐式转换

标签: c++ pointers casting implicit


【解决方案1】:

不,这是不可能的,因为B 不是A。您要么需要使用继承使B 成为A 的子类(这样B 就是A),要么使用组合然后引用适当的子对象。

【讨论】:

    【解决方案2】:

    不,不可能使该行不出错,因为在您的示例中 B*A* 不可隐式转换。

    如果它们以正确的顺序位于相同的继承层次结构中,或者如果Avoid 的类型定义,它们将是。现在类型是不相关的,语言规则拒绝这种不相关的指针类型之间的隐式转换。

    【讨论】:

      【解决方案3】:

      指针不能转换。即使定义了 operator= 函数。这仅适用于各自的对象,而不适用于它们的指针。

      这样:

      A *c;
      *c = b;  //or 
      c->operator=(b);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-25
        • 2019-11-29
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-15
        • 1970-01-01
        相关资源
        最近更新 更多