如何在不使用setter的类内设置类的成员变量?

时间:2018-07-03 12:14:07

标签: c++ class variables

我想在类内部设置类的成员变量的值,而不使用设置器。

我的代码:

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的情况下,是否有任何可行的解决方案?

3 个答案:

答案 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 numSamplesbool resizable定义为引用,以在构造函数中进行初始化。然后MyWindowSettings的构造函数将其成员int numSamplesbool 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::numSamplesofGLFWWindowSettings::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
    }
}