我在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
?
答案 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');
}
的关系:
答案 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