C++中的独立函数/数据

squ*_*boo 4 c++ oop

我不确定这一点,搜索有点并没有发现任何特别有用的东西.所以,假设我有一个带有命名空间的头文件,其中包含一些类C1和C2;

namespace my_namesp {

class C1 {
public:
  blah1;
  ...
private:
  blah2;
...
};

class C2 {
public:
  junk1;
  ...
private:
  junk2;
  ...
};

} //-End namespace
Run Code Online (Sandbox Code Playgroud)

现在假设在实现(CPP)中,我已经定义了C1,C2的所有成员函数,然后假设我有一些我希望C1和C2共享的常见数据,比如枚举和字符串数组,但我不知道我们一定希望他们成为任何一个班级的一部分.那么执行以下操作是合法的(注意:它构建并且工作正常); 如果我将此实现导出为客户端应用程序的库,该怎么办?这还行吗?这种设计是不是因为我应该注意的任何原因而不受欢迎?也许OOP的一个特定功能可能更适合这种事情?

namespace my_namesp {

enum some_list_num {
   list_member1,
   list_member2,
   ...,
   list_length
}

static const std::string string_list[] = {
   str1,
   str2,
   ...,
   strN 
}

return_type C1::some_func1(...) {
   ...
}

...

return_type C1::some_func1(...) {
   ...
}

} //-End my namespace
Run Code Online (Sandbox Code Playgroud)

再次提前感谢任何想法/更正.

Use*_*ess 7

如果C1和C2共享一些应该保留在翻译单元本地的实现细节,那很好.

最好将它们放在cpp文件中的匿名命名空间中,这样以后就不存在链接器符号冲突的风险(即,如果库客户端轻率地向命名空间添加了某些东西并意外地重用了一个"私有"名称) .

cpp文件可能如下所示:

namespace { // private implementation details

    enum some_list_num {
       list_member1,
       list_member1,
       ...,
       list_length
    }

    static const std::string string_list[] = {
       str1,
       str2,
       ...,
       strN 
    }

}

namespace my_namesp { // define externally-visible functions etc.

    return_type C1::some_func1(...) {
       ...
    }

    return_type C1::some_func1(...) {
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果客户端向库命名空间添加了一些内容,那么它们应该得到它们获得的任何破坏,IMO. (4认同)