一、C++类里面vector问题
定义一个类Intent
class Intent{
...
}
定义一个类Domain
class Domain{
std::vector<Intent*> intents;
std::vector<Intent*> getIntents();
}
调用getIntents()返回的是Domain里面的intents的拷贝副本,不能直接操作,比如不能getIntents().push_back(new Intent()),因为是副本拷贝,不会存入Domain类的intents里面,需要提供Domain::addIntent()接口。
二、构造函数问题
1.在拷贝构造函数中不要将将要拷贝的值打印出来,打印会出现APR问题,如下:
error: Cannot access memory at /third_party/jsoncpp/src/lib_json/json_value.cpp
2.拷贝构造函数和赋值函数区别
拷贝构造函数是用已经存在的对象初始化另一个对象;
复制构造函数是将已经存在的对象复制给另外一个已经存在的对象。
3.如果不想写拷贝构造函数和赋值函数,又不允许别人使用编译器生成的缺省函数,最简单的方法是将拷贝构造函数和赋值函数声明为私有函数,不用编写代码。如:
Class A {
private:
A(const A& a); // 私有拷贝构造函数
A& operate=(const A& a); // 私有赋值函数
}
4.如果类定义中有指针或引用变量或对象,为了避免潜在错误,最好重载拷贝构造函数和赋值函数
三、构造函数和toMembers问题
当一个类里面存着指针变量b(类型为B)的时候,在构造函数和toMembers函数里面要非常小心,常见的问题有:
1.在构造函数里面new出了B,在toMembers()函数里面也new了一次B,并将new出来的赋值给b
A::A() {
B b = new B();
}
A::toMembers(std::string member) {
Json::Reader reader;
Json::Value root;
if (reader.parse(member, root)) {
if (!root["b"].isNull()) {
B b2 = new B();
b2->toMembers(root["b"]);
b = b2;
}
}
}
A a1 = new A();
a->toMembers();
2.isNull()少了取非判断