繁体   English   中英

C++ - 参数 1 从“Object”到“Object*”没有已知的转换

[英]C++ - no known conversion for argument 1 from 'Object' to 'Object*'

我对 C++ 相当陌生,并且在使用指针时遇到了困难。 我刚刚创建了一个对象,执行以下操作

  Object object("someText");

然后我想将它添加到我有一个方法的向量中

 void ClassA:: addObj(Object* o){
     list.push_back(o);
 }

所以当我打电话

 addObj(object);

我收到错误:

参数 1 从“Object”到“Object*”没有已知的转换

如何将对象转换为指针以将其传递给addObj()

一个Object和一个指向Object是两回事。 编译器不会将类型隐式转换为其指针类型。 您必须自己使用 operator( & ) 的地址来完成此操作。

改变

addObj(object);

addObj(&object);

传递一个指向Object的指针。 该指针将指向object

我会指出,如果object在列表之前超出范围,您将指针添加到您现在将有一个悬空指针,并且使用它是未定义的行为。 如果您想拥有指针的所有权,您可能需要查看std::shared_ptrstd::unique_ptr

见下面的代码:

addObj(&object);

&允许您获取对象的地址。 所以&object ,会给你指向那个对象的指针。

由于您想将指向您的对象的指针添加到您的 Vector,我假设,在堆栈上分配的对象并不是您真正要查找的对象。 最好用new在堆上分配它

Object* object = new Object("someText");
// ....
addObj(object);

从 C++11 开始,您可以使用更优雅的语法:

auto object = new Object{"someText"};

正如 NathanOliver 已经指出的那样,您应该更喜欢使用std::shared_ptr<>std::unique_ptr<> 哪一个取决于谁负责在使用后释放您的对象。

如果向量类拥有所有对象,并且一旦向量不再拥有它们就应该删除它们,那么向量应该获得unique_ptr<>并让用户访问原始指针。

void ClassA::addObj(unique_ptr<Object>&& o) { // take a rvalue-reference here
    list.push_back(std::move(o)); // hand over ownership to the unique pointer in the list
}

Object* get(const size_t index) {
    // please add some sanity checks here
    return list.at(index).get(); // assuming, list actually ist a std::vector
}

如果用户应该能够从向量中保留指向对象的指针,该指针比向量保留的时间更长,请在任何地方使用std::shared_ptr<>

void ClassA::addObj(const shared_ptr<Object>& o) {        
    list.push_back(o);
}

shared_ptr<Object> get(const size_t index) {
    // please add some sanity checks here
    return list.at(index); // assuming, list actually ist a std::vector
}

还请记住,实施您自己的矢量/列表/地图等作为一个教育项目很好。 在生产代码中,更喜欢依赖标准库。 你很可能不会得到更好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM