ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 仅限标题库中的静态成员变量的正确setter和getter

2019-08-28 11:08:38  阅读:287  来源: 互联网

标签:c singleton getter-setter static-members header-only


我有一些小的头文件库(仅头部部分很重要).在初始版本中,我在其中定义的类中有一些静态成员.直到后来(当我在一个更大的项目中使用它们时)我才发现静态成员会违反ODR.我想让它们只保留头文件,因此在一个单独的.cpp文件中定义静态成员是不可能的.一个众所周知的解决方案是对每个静态成员使用Meyers单例函数 – 局部静态变量(如建议的,例如,here).

这一切都很好,但由于我希望单例表现得像一个成员变量,我希望能够使用setter和getter来获取和设置值.但是Meyers单例功能的局部静态变量看起来像是什么?我无法找到任何特定问题的解决方案.

澄清一下,这些是要求:

>我想在一个仅限头的库中使用静态成员变量的行为(所以我不能将定义放在.cpp文件中)
>我想要一个只有吸气剂的吸气剂(我不能通过分配吸气剂返回的参考来修改该值)
>我还希望能够通过专用的setter修改该值.

编辑1:

我想解释一下为什么你可能需要这个.

我提到的库中的静态变量定义了一些参数的默认值.但是,我想让用户在程序开头设置默认值,而不是硬编码这些默认值,这样他们就不必在每次调用成员函数或构造一个函数时手动传递值.新实例.

此外,虽然我同意在这里提供的示例中使用术语“Meyers singleton”具有误导性(我只是使用int值),但是没有什么能阻止您使用这个范例而只需要自定义类单个实例.在这种情况下,“Meyers singleton”一词是合理的.

编辑2:

这与C 17中的内联静态变量的引入有些无关,但是我会把它留给那些没有选择使用C 17的人.

解决方法:

#include <iostream>

class Foo
{

    private:

        static int& val()
        {
            static int v = 0;
            return v;
        }

    public:

        Foo()
        {
            set_val(14);
        }

        Foo(const int _v)
        {
            set_val(_v);
        }

        // The setter uses the fact that val()
        // returns a non-const reference,
        // so we can assign to it.
        static void set_val(const int _v)
        {
            val() = _v;
        }           

        // A true getter.
        // Returns const int&, so we cannot assign to it.
        static const int& get_val()
        {
            return val();
        }
};

int main(void)
{

    std::cout << "val is " << Foo::get_val() << "\n";
    Foo f1; // Set the value implicitly via an object constructor
    std::cout << "val is " << Foo::get_val() << "\n";
    Foo f2(5); // Set the value explicitly via an object constructor
    std::cout << "val is " << Foo::get_val() << "\n";
    Foo::set_val(42);
    std::cout << "val is " << Foo::get_val() << "\n";
    // Foo::get_val() = 4; // Doesn't compile, as required

    return 0;
}

输出:

val is 0
val is 14
val is 5
val is 42

通过构造函数设置值可以(也可能应该)省略.我只想表明它可以做到.这是一个仅用于一个变量的代码,但不比非静态成员多得多.

欢迎任何想法,意见和建议!

标签:c,singleton,getter-setter,static-members,header-only
来源: https://codeday.me/bug/20190828/1750930.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有