【问题标题】:How do I use a conversion constructor with pointers?如何使用带有指针的转换构造函数?
【发布时间】:2012-12-11 03:59:35
【问题描述】:

我有一个可以转换为A 的类C 和一个以A* 作为参数的函数。我想用C* 调用它,但我似乎无法让转换构造函数工作。我得到:error: cannot convert ‘C*’ to ‘A*’ for argument ‘1’ to ‘void doSomething(A*)’。我做错了什么?

class C {
};

class A {
public:
    A(C* obj) {}
};

void doSomething(A* object);

int main()
{
    C* object = new C();
    doSomething(object);
}

【问题讨论】:

    标签: c++ constructor type-conversion implicit-conversion


    【解决方案1】:

    您可能的意思是您希望 C 成为 A 的子类:

    class C : public A {
    ...
    };
    

    【讨论】:

    【解决方案2】:

    如果您的主要要求是能够调用现有的 doSomething 函数,那么您可以这样做:

    int main()
    {
        C* object = new C();
        A a(object);
        doSomething(&a);
        // May need to delete object here -- depends on ownership semantics.
    }
    

    【讨论】:

      【解决方案3】:

      转换构造函数只能为用户定义的类型定义,在你的例子中是A。但是,它们不适用于 基本类型,作为 指针,例如 A*

      如果doSomething 使用A const& 而不是(或简单地使用A,那么转换构造函数 将如您所愿地被调用。 p>

      【讨论】:

      • 有什么办法可以解决这个问题吗?
      • 我宁愿不修改函数的签名。有没有办法让 C++ 做一些花样?
      • @Tim Mahoney:不,一点也不,因为这没有意义。如果没有 A 指向,你将如何获得指向 A 的指针?
      • @TimMahoney,如果 doSomething 要采用 const 指针,并且您不介意编译器会给出警告,并且没有所有权问题(很多ifs,不是吗!?)比您可以做类似于以下ideone.com/YgaWua的事情。
      • 获取临时地址在 C++ 中是不合法的,因为地址操作符的操作数必须是 左值,而临时地址(总是?) prvalues。这可以使用 template<typename T>T* addressof(T&& t) {return &t;} 之类的模板来解决。
      猜你喜欢
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2021-05-09
      • 2016-04-08
      • 1970-01-01
      相关资源
      最近更新 更多