c++ - 如何在 C++ 中从 "pointer-to-objects"的 vector 访问对象

标签 c++ pointers vector

我正在编写一个程序来创建指向对象的指针 vector 。

如何从指向对象的指针 vector 访问指针引用的各个对象?

我正在尝试为 vector 中的指针引用的每个对象调用类 Object 中的 speak() 函数。

谢谢你的时间

class Object
{
public:
    void speak()
    {
        cout<<"Hello!"<<endl;
    }
};

int main()
{
    int choice;

    vector<Obj*> objVector; //create empty vector of "pointer-to-object"
    Object* ptrObj; //point to object

    while (choice!=5)
    {
        cout <<"1.Create Object\n";
        cout <<"2.Destroy Object\n";
        cout <<"3.Print number of existing Objects\n";
        cout <<"4.Tell existing Objects to say Hello\n";
        cout <<"5.Quit Program"<<endl;
        cout <<"Please enter your choice: ";
        cin >> choice;

    if (choice==5)
        cout <<"\nProgram is quitting\n"<<endl;
    else if (choice==1)
    {
        ptrObj= new Object;
        ObjVector.push_back(ptrObj); //adding an Object object
    }
    else if (choice==2)  //remove object
    {
        objVector.pop_back();
    }
    else if (choice==3)
    {
        cout <<"\nThere are " << objVector.size() <<" objects total.\n" << endl;
    }
    else if (choice==4)
    {
        for (int i=0; i<objVector.size(); i++)
        {
           ????????????
        }
    }
    }
    return 0;
}

最佳答案

在您现有的代码中,您可以完全按照在代码中其他地方使用它的方式访问指针:

Object* obj = objVector[i];
obj->speak();
// or, simply:
objVector[i]->speak();

使用运算符 -> 只是 (*objVector[i]).speak() 的另一种表达方式。

或者,编写循环的惯用方法如下所示:

for(vector<Object*>::iterator it = objVector.begin(); it != objVector.end(); ++it) {
    // iterators work like another level of pointers, and need to be dereferenced:
    (*it)->speak();
}

如果您的编译器支持 C++11,您可以像这样重写循环:

for(auto it = std::begin(objVector); it != std::end(objVector); ++it) {
    (*it)->speak();
}

或者像这样,使用基于范围的 for,它为您取消引用迭代器:

for(auto& obj : objVector) {
    obj->speak();
}

顺便说一句,有些情况下您根本不确定 objVector[i] 是否在 vector 中,访问它可能会使您的程序崩溃甚至导致恶魔飞出从你的鼻腔。

为了增加安全性,您可以使用 at 函数引用 vector 中的位置,如下所示:

try {
    for (int i=0; i<objVector.size(); i++)
    {
        Object* obj = objVector.at(i);
        obj->speak();
    }
} catch (const std::out_of_range& ex) {
    cerr << "no object at position " << i << " in objVector" << endl;
    cerr << "objVector says " << ex.what() << endl;
}

尽管如此,请注意,这要慢得多,尽管它使您有机会在 catch block 中处理问题。如果 at 函数抛出异常,则 try block 将运行循环并停止并运行 catch block - 这将是类型异常超出范围。另请注意,使用 [i] 不会做同样的事情,因为它不会抛出异常 - 它甚至不会检查 i 是否在长度范围内的 vector 。这恰好也是 [i].at(i) 更快的原因。

最后,还要注意使用迭代器的循环不会遇到这个特殊问题,只要您不在 vector 中添加或删除某些内容后尝试使用迭代器即可。

关于c++ - 如何在 C++ 中从 "pointer-to-objects"的 vector 访问对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523843/

相关文章:

c++ - ofxFaceTracker(开放框架)示例的问题

c++ - reinterpret_casting 一个指针类型的整数和返回是否产生相同的值?

c++ - 如何让 C++ vector 变大?

c++ - Vector<元组>, make_tuple<int, ignore, float>

vector - 是否有一种简单的方法可以从 `Vec` 中准确提取一个元素?

使用共享库时未在此范围内声明 C++ [类]

c++ - boost json 解析器的 json 数组映射问题

C++ Fork Join 并行阻塞

c - 字符指针预增

c - 我无法理解这个区别