在名称空间

时间:2015-07-18 02:58:07

标签: c++ function namespaces call

是否可以在命名空间内调用函数?我需要这样做,因为函数为变量赋予有意义的值。如果没有,是否有解决方法?下面是我想要的想法,foo变量被赋值的函数,bar1bar2两个变量赋值。

namespace space{
    bar *bar1;
    bar *bar2;

    void foo(bar *b1, bar *b2) {/*b1 and b2 and given values*/}
    foo(bar1, bar2); // this foo is a function call.
}

为了澄清,bar1和bar2应该仅在第一次被调用时定义,而不是其他时间。

1 个答案:

答案 0 :(得分:1)

我相信,这确实是OP想要的,但它太可怕了。包含space.h的每个CPP文件都将实例化条1和2以及init。当链接器尝试将其全部排序时命名冲突地狱。

#ifndef SPACE_H
#define SPACE_H
#include <iostream>
namespace space
{
    class bar
    {
    public:
        // use your own stuff here. This is for sample use only.
        bar(const std::string & str):mStr(str)
        {

        }
        friend std::ostream &operator<<(std::ostream & out, const bar &bq)
        {
            out << bq.mStr;
            return out;
        }
    private:
        std::string mStr;
    };
    bar *bar1; // consider using std::unique_ptr in place of the raw pointer
    bar *bar2;

    class Init
    {
    public:
        Init()
        {
            bar1 = new bar("bar, bar, bar");
            bar2 = new bar("barbara anne");
        }
        virtual ~Init() // std::unique_ptr makes this destructor unnecessary
        {
             delete bar1;
             delete bar2;
        }
    }
    Init init; // init will construct and assign the bars before main 
               // and destruct and delete the bars when the program exits
}
#endif

static使得它稍微好一点static限制每个bar和init到每个包括CPP文件,但是现在每个包含CPP文件的重复变量,更多的RAM使用和更改一个不会改变其他人。

    static bar *bar1;
    static bar *bar2;

    class Init
    {
    public:
        Init()
        {
            bar1 = new bar("bar, bar, bar");
            bar2 = new bar("barbara anne");
        }
        virtual ~Init()
        {
             delete bar1;
             delete bar2;
        }
    };
    static Init init;

另一个调整并没有完全符合OP的要求,但它接近,更安全,取1,并且在编译单元之间统一,与2不同。extern指示编译器允许使用第1和第2条而不实例化它们,但这意味着有人必须为它们实际分配空间。

    extern bar *bar1;
    extern bar *bar2;

    class Init
    {
    public:
        Init()
        {
            bar1 = new bar("bar, bar, bar");
            bar2 = new bar("barbara anne");
        }
        virtual ~Init()
        {
             delete bar1;
             delete bar2;
        }
    };

一个主要的CPP来证明使用

#include <iostream>
#include "space.h"

// allocate the bars and the Init object
space::bar *space::bar1; 
space::bar *space::bar2;

space::Init init;

int main()
{
    std::cout << *space::bar1 << std::endl;
    std::cout << *space::bar2 << std::endl;
    return 0;
}