为 char[ ] 字段创建 getter 的安全方法
Secure way to create a getter for a char[ ] field
所以我在做作业,我必须使用 C 风格的字符串作为我 class 的字段。我正在尝试为其创建一个安全的 getter,但我不知道该怎么做。
我使用的字段:
char name[20];
到目前为止我尝试了这些东西:
char* Car::getName() {
return &name[0];
}
^ 唯一有效但如果我是对的 returns 允许对其进行编辑的字段地址。
char* Car::getName() {
char ret[20];
strcpy(ret, name);
return ret;
}
^另一种我试过但没有成功的方法
所以我想问一下创建这样的 getter 的正确方法是什么? (对不起,如果这是一个天真的问题,但我一生中没有使用过很多 C)
将 return 类型声明为 const char *
,并使函数本身成为 const
(以指示调用未更改对象)。调用者可以通过强制转换忽略它,但那是他们的事;这是为了正确性,而不是安全性。
const char* Car::getName() const {
return &name[0];
}
它们将有一个指向 class 内部结构的指针,但明确指出该指针指向只读数据。
其他选项包括将其公开为您按需构建的 std::string
(return std::string(name);
,return 类型 std::string
),或 returning某种指向动态分配内存的智能指针(在道德上等同于 returning std::string
)。制作一个副本并 returning 一个哑指针(例如 return strdup(name);
)是一个坏主意,因为现在你已经打开了内存泄漏的大门;调用者必须手动 free
/delete
内存。
所以我在做作业,我必须使用 C 风格的字符串作为我 class 的字段。我正在尝试为其创建一个安全的 getter,但我不知道该怎么做。 我使用的字段:
char name[20];
到目前为止我尝试了这些东西:
char* Car::getName() {
return &name[0];
}
^ 唯一有效但如果我是对的 returns 允许对其进行编辑的字段地址。
char* Car::getName() {
char ret[20];
strcpy(ret, name);
return ret;
}
^另一种我试过但没有成功的方法
所以我想问一下创建这样的 getter 的正确方法是什么? (对不起,如果这是一个天真的问题,但我一生中没有使用过很多 C)
将 return 类型声明为 const char *
,并使函数本身成为 const
(以指示调用未更改对象)。调用者可以通过强制转换忽略它,但那是他们的事;这是为了正确性,而不是安全性。
const char* Car::getName() const {
return &name[0];
}
它们将有一个指向 class 内部结构的指针,但明确指出该指针指向只读数据。
其他选项包括将其公开为您按需构建的 std::string
(return std::string(name);
,return 类型 std::string
),或 returning某种指向动态分配内存的智能指针(在道德上等同于 returning std::string
)。制作一个副本并 returning 一个哑指针(例如 return strdup(name);
)是一个坏主意,因为现在你已经打开了内存泄漏的大门;调用者必须手动 free
/delete
内存。