是否可以在命名空间内调用函数?我需要这样做,因为函数为变量赋予有意义的值。如果没有,是否有解决方法?下面是我想要的想法,foo
变量被赋值的函数,bar1
,bar2
两个变量赋值。
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应该仅在第一次被调用时定义,而不是其他时间。
答案 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;
}