我对C ++很新,我在使用指针时遇到困难。我刚刚创建了一个执行以下操作的对象
//////////////////////////////////////////
/// <summary> Description </summary>
//////////////////////////////////////////
然后我想将它添加到我有
方法的向量中 Object object("someText");
所以当我打电话时
void ClassA:: addObj(Object* o){
list.push_back(o);
}
我收到错误:
参数1从“对象”到“对象*”
没有已知的转换
如何将对象转换为指针以将其传递给 addObj(object);
?
答案 0 :(得分:2)
Object
和指向Object
的指针是两个不同的东西。编译器不会隐式地将类型转换为其类型。指针类型。您必须使用运算符(&
)的地址自己完成。
更改
addObj(object);
到
addObj(&object);
将指针传递给Object
。该指针将指向object
。
我将指出,如果object
超出范围,则在列表中添加指针,您现在将拥有一个悬空指针并使用它是未定义的行为。如果您想拥有指针的所有权,您可能希望查看std::shared_ptr
或std::unique_ptr
答案 1 :(得分:0)
见下面的代码:
addObj(&object);
答案 2 :(得分:0)
&
允许您获取对象的地址。所以&object
会给你指向该对象的指针。
答案 3 :(得分:0)
由于你想向你的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
}
还请记住,实施自己的矢量/列表/地图等作为一个教育项目是很好的。在生产代码中,更喜欢依赖标准库。你很可能不会让它变得更好。