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

时间:2016-04-01 14:03:58

标签: c++ pointers

我对C ++很新,我在使用指针时遇到困难。我刚刚创建了一个执行以下操作的对象

//////////////////////////////////////////
/// <summary> Description </summary>
//////////////////////////////////////////

然后我想将它添加到我有

方法的向量中
  Object object("someText");

所以当我打电话时

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

我收到错误:

  

参数1从“对象”到“对象*”

没有已知的转换

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

4 个答案:

答案 0 :(得分:2)

Object和指向Object的指针是两个不同的东西。编译器不会隐式地将类型转换为其类型。指针类型。您必须使用运算符(&)的地址自己完成。

更改

addObj(object);

addObj(&object);

将指针传递给Object。该指针将指向object

我将指出,如果object超出范围,则在列表中添加指针,您现在将拥有一个悬空指针并使用它是未定义的行为。如果您想拥有指针的所有权,您可能希望查看std::shared_ptrstd::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
}

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