4

我对此不确定,并且搜索了一下并没有发现任何特别有用的东西。所以,假设我有一个头文件,其名称空间包含一些 C1 和 C2 类;

namespace my_namesp {

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

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

} //-End namespace

现在假设在实现(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

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

4

1 回答 1

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(...) {
       ...
    }
}
于 2012-06-25T22:05:31.773 回答