在阅读我的代码时,我注意到我有一个静态成员函数,它通过指向所述类的实例的指针来更改其类的私有成员。
它可以毫无问题地编译和运行,但我只是想知道以这种方式从成员但静态函数编辑私有变量是否符合规定,或者我是否应该实现公共 setVar 函数。
请注意,我并不是试图通过编辑静态函数中的成员变量来绕过标准编码实践——该函数必须是静态的,因此它可以使用 POSIX pthread 库作为线程运行。
干杯,怀亚特
在阅读我的代码时,我注意到我有一个静态成员函数,它通过指向所述类的实例的指针来更改其类的私有成员。
它可以毫无问题地编译和运行,但我只是想知道以这种方式从成员但静态函数编辑私有变量是否符合规定,或者我是否应该实现公共 setVar 函数。
请注意,我并不是试图通过编辑静态函数中的成员变量来绕过标准编码实践——该函数必须是静态的,因此它可以使用 POSIX pthread 库作为线程运行。
干杯,怀亚特
是的,这是有效的。
尽管在大多数情况下使用非静态成员更好,但有时在需要将函数指针传递给外部库的情况下使用静态成员,例如 pthread 库。
如果在其他情况下更改此私有变量也是有意义的,并且如果您想将您的类与它使用 pthread 库的事实分开,您可以将类分成两部分:
然后第二个类将通过公共方法在第一个类中设置变量。
示例:这可能是您的原始代码:
class MyClass
{
public:
static void someMethod(MyClass *);
private:
type myMember;
};
你也可以这样写:
class MyClass
{
public:
void setMember(type value) {myMember = value; /* other other logic */}
private:
type myMember;
}
class MyClassPThreadInterface
{
public:
static void someMethod(MyClass *myclass) {myclass->...();}
}
这样,您将您的类与 PThread 库正在使用的事实完全分开。它也可以在其他情况下使用(静态方法相当无意义),并且在不污染原始类的情况下添加另一个线程库(例如 Windows 线程)也很容易。
是的。private
意味着访问仅限于类。