当前位置: 首页 > 知识库问答 >
问题:

C++中向量对象指针的小问题

云长恨
2023-03-14

请考虑以下代码:

class test {
    public:
    int n;
    test(int n) : n(n) {}
};

int main() {
    vector<test> v;
    test one(1), two(2);
    v.push_back(one);
    v.push_back(two);
    // obviously doesn't work since a copy of the object is stored in 
    //the vector ==> different memory addess
    test* p1 = &one;

   // also doesn't work properly since when the object gets erased,
   //this pointer is pointing to a different object
    test* p2 = &v[0]; 

    v.erase(v.begin());
    // prints 2 since object two was copied to the place of object one
    cout << p2->n << endl; 
    return 0;
}

我想要一个指针,指向一个特定的对象,在一个向量,当耳环这个对象,指针也应该被删除,或指向空或类似的东西。同样,当我有一个指向矢量位置3的对象的指针时,我希望这个指针在移除例如对象1之后指向位置2,因为对象3向左“移动”了一个位置。这样的事情是可以实现的还是我应该尝试一种不同的方法?我刚开始学习C++所以我对任何高级概念都不是很熟悉。

共有1个答案

朱宇航
2023-03-14

如前所述,您应该将std::shared_ptr与std::weak_ptr一起使用。下面是用现代方法重写的代码:

#include <iostream>
#include <memory>
#include <vector>

class test {
    public:
    int n;
    test(int n) : n(n) {}
};

int main() {
    std::vector<std::shared_ptr<test>> v;
    std::shared_ptr one = std::make_shared<test>(1);
    std::shared_ptr two = std::make_shared<test>(2);
    v.push_back(one);
    v.push_back(two);

    std::weak_ptr<test> p1 = one;
    std::weak_ptr<test> p2 = v[0]; 
    
    // prints 1 two times
    if (auto sp = p1.lock()) {
        std::cout << sp->n << std::endl; 
    }
    if (auto sp = p2.lock()) {
        std::cout << sp->n << std::endl; 
    }
    
    // delete all references to one
    v.erase(v.begin());
    one = nullptr;
 
    // nothing gets printed
    if (auto sp = p1.lock()) {
        std::cout << sp->n << std::endl; 
    }
    if (auto sp = p2.lock()) {
        std::cout << sp->n << std::endl; 
    }
    return 0;
}

https://coliru.stacked-crooked.com/A/00B2072BB8CD73AD

 类似资料:
  • 本文向大家介绍解析C++中指向对象的指针使用,包括了解析C++中指向对象的指针使用的使用技巧和注意事项,需要的朋友参考一下 C++指向对象的常指针 将指针变量声明为const型,这样指针值始终保持为其初值,不能改变。 如: 定义指向对象的常指针的一般形式为: 也可以在定义指针变量时使之初始化,如将上面第2, 3行合并为: 请注意,指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其

  • 但我想使用一个指针,而不是一个简单的变量。能给我点启示吗? 谢谢

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • 在print语句中:(假设整数大小为4字节) 让arr的内存位置为1000 arr 1——给出1016(即下一行内存) 我理解了逻辑,但我无法理解编译器如何将 arr标识为“指向4整数数组的指针”,并且 即使在增量之前两者都指向相同的地址(1000)

  • C++ 类 & 对象 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符 ->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。 下面的实例有助于更好地理解指向类的指针的概念: #include <iostream> using namespace std; class Box { public:

  • 假设有一个结构 我得到一个指向该结构的成员的指针,比如作为某个函数的参数: 如何获取指向包含对象的指针?最重要的是:在不违反标准中的某些规则的情况下,也就是说,我想要标准定义的行为,而不是未定义或实现定义的行为。 附带说明:我知道这规避了类型安全。