在C ++中,哪种方式更好?
// this is class, not a struct (just means members are public by default)
struct foo {
int w, h;
private:
public:
};
或者
class foo {
private:
int w, h;
public:
int getW() { return w; }
int getH() { return h; }
};
在这种情况下:
foo *A;
如果我想要获得w
和h
的值,
我应该使用A->w
和A->h
作为第一个示例,还是A->getW()
和A->getH()
作为第二个示例?
现在我正在使用第一个示例,但是以任何方式更好的做法是使方法返回私有变量吗?一种方式比另一种方式有优势吗?
答案 0 :(得分:1)
如果这是您唯一关注的问题,那么就没有实际意义。如果您打算只通过访问者方法拥有对外部可见的成员,那么它们也可以公开(或POD)。例如:
struct SomeSortOfInformation
{
int w, h, x, y, pixelFormat, whatever;
};
如果您打算保护实现细节,或者更改访问变量的行为(即,这是C#中常见的习惯用法),那么请随意使用访问器方法。
void setWidth(const int& w) {
if (w <= 0) this->w = 0;
else this->w = w;
}
答案 1 :(得分:0)
直接的区别在于,该类用户可以在第一个示例中分配w
和h
的值,但不能分配给第二个。{/ p>
未来代码更改的不同之处在于,类的作者可以更改第二个示例中foo
的数据存储方式,而不是第一个。例如,如果类表示一个矩形,那么您可以切换到存储角的坐标,并在请求时计算宽度和高度。
没有一种“更好”的方式。如果你有一个定义的类是一个哑数据容器,用户可以读取和写入,并保证它将来不会执行任何聪明的计算,那么你可以使用公共数据成员。标准库中的一个示例是std::pair
,其中包含公开数据成员first
和second
。许多OOP程序员(原则上)从不定义或记录任何此类保证,但C ++标准库的设计者不同意这一绝对原则。在任何情况下,C ++都不是按照严格的OOP原则设计的。
如果您有一个类恰好来存储对用户有用的值,但不保证将它们存储为成员,那么您将在必要时使用访问器。标准库中的一个示例是std:vector
,其函数为begin()
和end()
。在vector
的某些实现中,它们只返回两个私有数据成员的值,在其他实现中,它们执行其他操作。
但是,如果可能,请为该类提供用户所需的功能,以便它们不需要公共数据或访问器。标准库中的一个示例是std::stack
,它具有受保护的数据成员供派生类使用,但不向“普通”用户提供任何直接访问它的权限。如果您发现自己经常为您编写的大多数类的大多数数据成员编写访问器,那么您应该认真考虑是否可以改进您的设计。访问器意味着类的用户必须提供使用数据成员的逻辑。但是类的主要优点是能够保持在定义数据的同一位置使用数据的逻辑。如果用户总是提供逻辑,那么你就没有利用这个机会。
顺便说一下,你的问题中有几个错误:
这是类,而不是结构
是一个结构。它也是一种类型。
int getW() { return w; }
Getters应该是const函数:int getW() const { return w; }