[英]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_ptr
或std::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.