我有10个名为Car的char *属性,编写这10个char *属性的setter的最佳方法是什么?一种方法是直接设置其中的值:
void Car<T>::setKey(const char* toCopyKey)
{
delete[] key;
int length=strlen(toCopyKey);
key=new char[length+1];
strcpy(key,toCopyKey);
}
并且这样做10次,我想到的其他解决方案是创建一个函数,创建传递的char *的副本,然后在setter中分配它:
char* Car<T>::copyString(const char* s)
{
int length=strlen(s);
char* property=new char[length+1];
strcpy(property,s);
return property;
}
并在每个setter中使用copyString方法,如下所示:
void Car<T>::setModel(const char* toCopyModel)
{
delete[] model;
model=copyString(toCopyModel);
}
但是我想知道第二个解决方案是否正确以及是否有更好的方法来进行复制?我不能使用std :: string和vector。
答案 0 :(得分:1)
我想这是一些C ++课程或教程的分配,因为否则我会建议质疑整个设计。
总的来说,我会尽早学习根本不做手动内存管理并使用C ++标准库智能指针。这样可以减轻编写析构函数,复制|移动赋值和复制构造函数的负担。
在您的示例中,您可以使用std::unique_ptr<char[]>
来保存字符串数据。这也是异常安全的,可以防止内存泄漏。 unique_ptr<char[]>
对象的创建可以集中在辅助方法中。
class Car {
private:
std::unique_ptr<char[]> model;
std::unique_ptr<char[]> key;
static std::unique_ptr<char[]> copyString(char const* prop) {
auto const len = std::strlen(prop);
auto p = std::make_unique<char[]>(len+1);
std::copy(prop, prop + len, p.get());
p[len] = '\0';
return p;
}
public:
void setModel(char const* newModel) {
model = copyString(newModel);
}
void setKey(char const* k) {
key = copyString(k);
}
char const* getModel() const {
return model.get();
}
};
如果您不了解它们,我建议您阅读rule of zero。
答案 1 :(得分:0)
您可以使用参考参数组合两种方法:
In Connection.php line 664:
could not find driver (SQL: select * from information_schema.tables where
table_schema = mamaput and table_name = migrations)
In Connector.php line 67:
could not find driver
确保构造函数在调用setter之前将所有属性初始化为static void Car<T>::setStringProp(char *&prop, const char *toCopyString) {
delete[] prop;
prop = new char[strlen(toCopyString)+1];
strcpy(prop, toCopyString);
}
void Car<T>::setModel(const char *toCopyModel) {
setStringProp(model, toCopyModel);
}
,因为NULL
要求它是一个初始化指针。
delete[] prop