如何在C ++中创建动态对象列表

时间:2017-01-25 19:12:27

标签: c++ c++11 pointers return-by-reference

我在C ++中有这个简单的程序

using System.Linq;

我们的想法是创建一个嵌套列表列表。 #include <iostream> #include <string> #include <list> using namespace std; class test { private: string _name; list<test*> _list; public: test(const string& S): _name(S) { this->_list.clear(); } const string& to_string() { string*sp = new string("["); *sp += this->_name; for(test*tp: this->_list) { *sp += ","; *sp += tp->to_string(); } *sp += "]"; return *sp; } test& add(const string& S) { test*tp = new test(S); this->_list.push_back(tp); return *tp; } }; int main() { test x("one"); x.add("two"); test y = x.add("three"); y.add("four"); cout << y.to_string() << '\n'; cout << x.to_string() << '\n'; } 应该是y的元素,但是当我修改x时,y不会被修改。

所需的输出是:

x

但我得到

[three,[four]]
[one,[two],[three,[four]]]

我可以通过在[three,[four]] [one,[two],[three]] 中返回指针并修改test::add来解决问题:

main

然而。有没有办法将int main() { test x("one"); x.add("two"); test*p = x.add("three"); p->add("four"); cout << y->to_string() << '\n'; cout << x.to_string() << '\n'; } 用作y类型而不是test作为类型p

3 个答案:

答案 0 :(得分:2)

您创建了“三个”的副本并添加了“四个”。

test y = x.add("three");

你可以这样做:

test& y = x.add("three");

顺便说一下,你的代码会造成内存泄漏。编写虚拟析构函数。

答案 1 :(得分:1)

是的,您只需y test& x即可保留与var button = document.querySelector('button'); button.addEventListener('click', toggleClickedClass); function toggleClickedClass() { this.classList.toggle('clicked'); } 的关系:

Live Example

答案 2 :(得分:1)

您似乎正在使用在堆上动态分配的大量对象。考虑使用智能指针(如std::shared_ptr)而不是原始拥有指针,以便正确清理并避免泄漏。

我没有花太多时间在这上面,但是拿出你的初始代码并用智能指针替换一些原始指针使用(和std::list std::vector;除非你想要list对于它的迭代器失效属性,std::vector往往是一个更好的选择),我得到了这个似乎有用的代码(live sample):

<强>输出:

[three,[four]]
[one,[two],[three,[four]]]

<强>来源:

#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;

class Test {
private:
    string _name;
    vector<shared_ptr<Test>> _list;
public:
    explicit Test(const string& S) : _name(S) { }

    string to_string() const {
        string s("[");
        s += _name;

        for (auto const& p : _list) {
            s += ",";
            s += p->to_string();
        }

        s += "]";
        return s;
    }

    shared_ptr<Test> add(const string& S) {
        auto p = make_shared<Test>(S);
        _list.push_back(p);
        return p;
    }
};

int main() {
    auto x = make_shared<Test>("one");
    x->add("two");
    auto y = x->add("three");
    y->add("four");

    cout << y->to_string() << '\n';
    cout << x->to_string() << '\n';
}

作为替代方案,如果它对您的特定设计有意义,您也可以考虑从T&而不是(智能)指针向对象返回引用(test::add),并使用{{1使用unique_ptr向量数据成员(而不是shared_ptr)。这是一种替代版本(live):

_list