如何在没有setter的情况下设置类内部类的成员变量?
How to set member variables of class inside class without setter?
我想在不使用setters的情况下设置类内部类的成员变量的值。
我的代码:
class MyWindowSettings {
public:
const ofGLFWWindowSettings& get(){
return settings;
}
int numSamples;
bool resizable;
private:
ofGLFWWindowSettings settings;
};
ofGLFWWindowSettings
还具有公共成员变量,这些变量是
int numSamples;
bool resizable;
我希望能够在不使用二传手的情况下设置这些变量的值。
我希望能够......例如,
MyWindowSettings settings;
settings.numSamples = 8;
settings.resizable = true;
然后内部ofGLFWWindowSettings
的numSamples
和resizable
应立即设置为这些值。
是否有任何可能的解决方案可以在不使用二传手或继承ofGLFWWindowSettings
的情况下实现这一目标?
是的,有几个选项,与您喜欢的语法具有不同程度的相似性。
选项 1 - 成员参考
class MyWindowSettings {
public:
MyWindowSettings()
: numSamples(settings.numSamples),
resizable(settings.resizable)
{}
~MyWindowSettings() = default;
MyWindowSettings(const MyWindowSettings & other)
: settings(other.settings),
numSamples(settings.numSamples),
resizable(settings.resizable)
{}
MyWindowSettings& operator=(const MyWindowSettings & other)
{
settings = other.settings;
return *this;
}
MyWindowSettings(MyWindowSettings && other)
: settings(std::move(other.settings)),
numSamples(settings.numSamples),
resizable(settings.resizable)
{}
MyWindowSettings& operator=(MyWindowSettings && other)
{
settings = std::move(other.settings);
return *this;
}
const ofGLFWWindowSettings& get(){
return settings;
}
int & numSamples;
bool & resizable;
private:
ofGLFWWindowSettings settings;
};
优点:
- 正是您想要的语法。
缺点:
- 非常冗长的定义。很容易错过某个地方的错误。
选项 2 - 公共ofGLFWWindowSettings
class MyWindowSettings {
public:
ofGLFWWindowSettings settings;
};
优点:
- 非常简洁
- 你也不需要吸气剂来
ofGLFWWindowSettings
缺点:
- 语法不完全一样
我个人更喜欢这个,假设MyWindowSettings
还有其他成员没有显示。
MyWindowSettings settings;
settings.settings.numSamples = 8;
settings.settings.resizable = true;
选项 3 - 无MyWindowSettings
只需直接使用ofGLFWWindowSettings
选项 3.a - 别名定义
using MyWindowSettings = ofGLFWWindowSettings;
如果您有权访问类的代码ofGLFWWindowSettings
则可以将其成员定义为引用itn numSamples
和bool resizable
,以便在构造函数中启动。然后MyWindowSettings
的构造函数将其成员int numSamples
、bool resizable
(初始化后(传递给ofGLFWWindowSettings
的构造函数。
请参阅以下示例:
struct ofGLFWWindowSettings {
int& numSamples;
bool& resizable;
ofGLFWWindowSettings(int& _numSamples, bool& _resizable) :
numSamples(_numSamples), resizable(_resizable) { }
};
class MyWindowSettings {
public:
const ofGLFWWindowSettings& get(){
return settings;
}
int numSamples;
bool resizable;
MyWindowSettings(int _numSamples, bool _resizable) :
numSamples(_numSamples), resizable(_resizable),
settings(numSamples, resizable) { }
private:
ofGLFWWindowSettings settings;
};
ofGLFWWindowSettings::numSamples
和ofGLFWWindowSettings::resizable
只是参考,它们始终是最新的。
如果您在编写settings.numSamples = 8
时需要更复杂的行为,例如修改对象ofGLFWWindowSettings settings
或调用其他一些成员函数,那么您可以重载operator=
。也就是说,您可以将其声明为用户定义的类,而不是将MyWindowSettings::numSamples
声明为简单的 int,该类重新定义了其operator=
,即采用 int,同时根据需要执行一些其他工作。但在这一点上,我想"二传手"套路会是一个更容易的选择。
是的- 如果你使用Visual Studio编译器。
您可以使用 declspec(property( 设置 numSamples 并可调整大小,您的代码如下所示:
class MyWindowSettings
{
public:
__declspec( property( put=SetSamples ) ) int numSamples;
__declspec( property( put=SetResizable ) ) bool resizable;
private:
void SetSamples(int s)
{
numSamples = s;
UpdateOfgl();
}
void SetResizable(bool b)
{
resizable = b;
UpdateOfgl();
}
void UpdateOfgl()
{
//update ofgl settings internal state
}
}
- 从模板化父类中的派生内部类访问受保护的成员变量
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 如何在没有setter的情况下设置类内部类的成员变量?
- 内部类私有成员访问和封闭的友好性
- 从内部类访问外部公共成员
- C++ 将成员函数指针传递给内部类
- 嵌套类:具有外部类成员的内部类
- 嵌套类的类内好友是否可以访问外部类成员?
- 不能使外部类成为内部类内的成员对象
- clang或gcc关于这个内部类成员访问是否正确
- C++ 内部类无法访问外部类的成员
- 在C++调用内部类成员的情况下,是否应使用此 -> 运算符?
- 可以将外部类的成员函数声明为内部类的友元函数吗?
- 无法使用外部类对象访问内部类成员
- Visual Studio 2012中的智能:类模板中的内部类没有成员可用
- 内部类-嵌套类作为C++中成员函数的参数
- 使用(非类型)枚举参数定义内部类成员函数模板
- C++:初始化英特尔SIMD内部类成员
- 内部类——c++,内部类,以及为什么你只能创建成员作为指向它们的指针
- 如何在派生类中定义内部类成员