Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在类之外封装数据 我写了一些C++函数,这些函数会生成这些数据,这些数据可能会或可能不会被这些函数处理,但不会在其他地方被处理。这些函数对于某些更高级别的GUI更改来说是“低级”的_C++ - Fatal编程技术网

在类之外封装数据 我写了一些C++函数,这些函数会生成这些数据,这些数据可能会或可能不会被这些函数处理,但不会在其他地方被处理。这些函数对于某些更高级别的GUI更改来说是“低级”的

在类之外封装数据 我写了一些C++函数,这些函数会生成这些数据,这些数据可能会或可能不会被这些函数处理,但不会在其他地方被处理。这些函数对于某些更高级别的GUI更改来说是“低级”的,c++,C++,我现在将这些函数包装在一个单独的名称空间中,并声明了一个静态的内部链接向量来包含向量中的这些对象。这些对象被定义为一个结构,也包含在名称空间中。因此,总体结构: namespace Foo { struct Bar { string data; }; void func1(); void func2(); static std::vector<Bar> cachedBars; } 我真的不需要上课,也不想求助于单身汉

我现在将这些函数包装在一个单独的名称空间中,并声明了一个静态的内部链接向量来包含向量中的这些对象。这些对象被定义为一个结构,也包含在名称空间中。因此,总体结构:

namespace Foo
{
    struct Bar
    {
        string data;
    };

    void func1();
    void func2();
    static std::vector<Bar> cachedBars;
}

我真的不需要上课,也不想求助于单身汉。这个解决方案是否足够?具体来说,内部链接命名空间范围集合是限制对该集合的访问的最佳方式,也是避免全局变量的所有陷阱的最佳方式,还是有更好的方式?

确定。在这种情况下,我通常会将func1和func2函数放在.h文件中。静态向量与函数体一起进入.cpp


我怀疑您需要在.h文件中显示struct Bar,因为函数通常返回或将该结构作为参数。但是如果没有人需要知道这个结构,那么也可以将它隐藏在.cpp中。也可能只传递/返回指针或引用。然后您可以向前声明它。

好的。在这种情况下,我通常会将func1和func2函数放在.h文件中。静态向量与函数体一起进入.cpp


我怀疑您需要在.h文件中显示struct Bar,因为函数通常返回或将该结构作为参数。但是如果没有人需要知道这个结构,那么也可以将它隐藏在.cpp中。也可能只传递/返回指针或引用。然后你可以向前声明它。

实际上,我会把它放在.h中的函数声明中

void func1();
void func2();
以及匿名名称空间下.cpp中隐藏的内容

namespace
{
    struct Bar
    {
        string data;
    };

    static std::vector<Bar> cachedBars;
}

void func1() { /* do something */ }
void func2() { /* do something else */ }
这样,func1和func2就可以从任何地方访问,但是Bar和cachedbar只能由.cpp中定义的函数访问,所以func1和func2。如果.cpp中没有其他内容,则只有func1和func2能够修改cachedBars


以防您不知道,当用于修改可见性时,匿名名称空间将具有与static关键字相同的效果。然而,它更强大,因为你可以用它隐藏几乎任何东西。

事实上,我将把它仅仅放在.h中的函数声明中

void func1();
void func2();
以及匿名名称空间下.cpp中隐藏的内容

namespace
{
    struct Bar
    {
        string data;
    };

    static std::vector<Bar> cachedBars;
}

void func1() { /* do something */ }
void func2() { /* do something else */ }
这样,func1和func2就可以从任何地方访问,但是Bar和cachedbar只能由.cpp中定义的函数访问,所以func1和func2。如果.cpp中没有其他内容,则只有func1和func2能够修改cachedBars



以防您不知道,当用于修改可见性时,匿名名称空间将具有与static关键字相同的效果。但是,它更强大,因为你可以用它隐藏几乎任何东西。

它不能避免全局文件的任何陷阱,因为它是全局文件和所有文件。这是头文件吗?如果是这样的话,您将在包含该文件的任何地方获得cachedBars的单独副本。@Cat:我希望它至少是全局的-。如果可以访问cachedBars的人只有func1 func2,那么只需将该向量放入.cpp文件中,所以你从来没有向任何人展示过它。@R.Martinho Fernandes那么包含cachedBars的行是做什么的呢?它没有避免全局的任何陷阱,因为它是一个全局的和所有的。这是一个头文件吗?如果是这样的话,您将在包含该文件的任何地方获得cachedBars的单独副本。@Cat:我希望它至少是全局的-。如果可以访问cachedBars的人只有func1 func2,那么只需将该向量放入.cpp文件中,所以你从来没有向任何人展示过它。@R.Martinho Fernandes那么包含cachedBars的行是做什么的呢?这对接口问题很有帮助,但是向量本身呢?命名空间范围内部链接是管理对类外集合的访问的有效方法,还是有更好的方法?隐藏在匿名命名空间下的.cpp中更容易。然后,只有在.cpp中定义的函数才能访问所有这些。这对接口问题很有帮助,但是向量本身呢?命名空间范围内部链接是管理对类外集合的访问的有效方法,还是有更好的方法?隐藏在匿名命名空间下的.cpp中更容易。然后,只有在.cpp中定义的函数才能访问所有这些。但是,这不会弄乱全局名称空间吗?不是真的。匿名名称空间不是全局名称空间,而是文件的本地新名称空间。因此对全局名称空间没有影响。正如我所说的,这就像使用静态关键字一样。这不会弄乱全局搜索吗
名称空间,但不是真的。匿名名称空间不是全局名称空间,而是文件的本地新名称空间。因此对全局名称空间没有影响。正如我所说,这就像使用static关键字一样。