我想在类内部设置类的成员变量的值,而不使用设置器。
我的代码:
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
的{{1}}和numSamples
应该立即设置为这些值。
在不使用setter或继承resizable
的情况下,是否有任何可行的解决方案?
答案 0 :(得分:3)
是的,有两个选项,与您喜欢的语法有不同的相似性。
选项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;
答案 1 :(得分:2)
如果您可以访问类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并同时执行其他操作根据需要工作。但是在这一点上,我认为“设置”例程将是一个更容易的选择。
答案 2 :(得分:1)
是-如果您使用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
}
}