这更像是一个意见/最佳实践问题。
我是C ++的新手,我目前正致力于使用动态分配字符串的程序。我最终得到了构造函数,复制构造函数和重载赋值运算符之间的区别。我还需要为这些对象提供析构函数。
(我正在构建一个包含问题对象的考试对象,这些对象包含一组T / F答案对象,每个对象都指向字符串的动态存储空间。)
以下是我的问题:在专业领域,创建这些对象的最佳做法是什么?当我坐在这里思考这个问题时,我可以从用户那里收集信息并将这些值存储在临时位置,并使用构造函数实例化问题对象,或者我可以使用复制和分配方法构建每个对象......我和#39 ;我不知道该怎么做。一种方法比另一种更好吗?我应该建立并测试这三个吗?请帮忙。
答案 0 :(得分:4)
在这种情况下,最佳做法是不自行管理资源。使用标准库(本例中为std::string
和std::vector
/ std::map
)。类似的东西:
#include <string>
#include <map>
class Exam {
public:
std::map<std::string, std::string> questions_;
};
std::string
为您完成资源管理。当它的析构函数被调用时,它会在它后面清理。 std::map
或std::vector
也是如此。
这里的神奇之处在于,所有3个类中的成员(std::string
,std::map
,Exam
)保证在超出范围时被妥善处理,{{3 }}。所以,如果你使用它:
void foo() {
Exam e;
e.questions_["6 x 7 = ?"] = "42";
} // Here, you're guaranteed that all storage for all your questions and answers is disposed.
您不必担心编写构造函数,析构函数或管理堆分配的对象。
通常,我建议您尽量避免在程序中编写new
和delete
。如果您需要在不适合容器的用例中进行动态分配,请使用std::unique_ptr
或std::shared_ptr
。尽可能多地遵守RAII。