【发布时间】:2013-11-20 08:42:18
【问题描述】:
什么是 C++ getter 方法的最佳实践,它应该返回一个非平凡的类型,但是一个类型为 class 或 struct 的成员。
- 按值返回,如:
MyType MyClass::getMyType() { return mMyType; } - 通过 const 引用返回:
const MyType& MyClass::getMyType() { return mMyType; } - 按地址返回:
MyType* MyClass::getMyType() { return &mMyType; }
在哪里
class MyType { /* ... */ };
class MyClass
{
private:
MyType mMyType;
}
我特别担心这种方法的以下用法。如果function() 想要保存它以供进一步使用,您能否详细说明这可能如何影响复制对象,以及悬空引用和野指针的危险。
MyType* savedPointer;
SomeType function(MyType* pointer) { savedPointer = pointer; };
一个。适用于 1. 和 2.
{
MyType t = myClass.getMyType();
function(&t);
}
// is savedPointer still valid here?
b.适用于 1. 和 2.
{
const MyType& t = myClass.getMyType();
function(&t);
}
// is savedPointer still valid here?
c。适用于 1. 和 2.
{
MyType& t = myClass.getMyType();
function(&t);
}
// is savedPointer still valid here?
d。有效期为 3。
{
MyType* t = myClass.getMyType();
function(t);
}
// is savedPointer still valid here?
其中myClass 是MyClass 类型的对象。
【问题讨论】:
-
这在很大程度上取决于上下文。您想查看类内部的修改(例如修改向量元素)还是想明确地只拥有值,但从不(!)对原始值进行任何修改?在我看来,一般不应该使用指针。容器类型应按 ref 或 const ref 返回,其余按值返回(甚至根本没有 getter!)。类的重点是数据封装(以及其他功能)。总是通过非常量引用返回是愚蠢的。
-
您还可以返回智能指针,让您省去很多烦恼...
-
@jbat100 您不能在此处返回智能指针。没有动态分配的对象(也不应该有)。
-
@JamesKanze 同意,要返回智能指针,实例变量必须是智能指针,这就是我的意思
-
@jbat100 但是为什么要让实例变量成为智能指针呢?