【问题标题】:hidden implementation of member function (like static global function)成员函数的隐藏实现(如静态全局函数)
【发布时间】:2016-07-06 17:04:05
【问题描述】:

假设您有两个内容相同的实现源文件:

// foo{a,b}.cpp
class Foo {
public:
  void bar();
}
void Foo::bar() { std::cout << "bar\n"; }

实现一个普通函数(不是成员方法),我会简单地将这个方法标记为static。但这在方法声明上有不同的含义,不能在实现时指定。

如何更改foob.cpp 以便在编译和链接两个文件时不会出现链接器错误?

【问题讨论】:

  • 哦...我想说“将包含文件放在命名空间中”,但后来我读到了this。哦,好吧,我相信有一个很好的答案。
  • 好吧,我不能完全看出你真正想在这里解决哪个问题,但闻起来像 pimpl idiom 应该是正确的方法(假设 Foo 已经有一个公开声明)。
  • @πάνταῥεῖ:我认为 OP 已经过度简化了他的问题,但假设 2 个不同的助手类具有相同(糟糕的)名称。
  • @Jarod42 啊,这个假设很有意义,也许 OP 可以澄清这个问题。
  • @Jarod42 你的假设是正确的,很抱歉没有更清楚。

标签: c++ c++11 linker


【解决方案1】:

你可以把整个放在一个未命名的命名空间中

// foo{a,b}.cpp
namespace
{

    class Foo {
    public:
      void bar();
    }
    void Foo::bar() { std::cout << "bar\n"; }
}

该类在外部不可见,只能在当前翻译单元中使用。

【讨论】:

  • 缺点是Foo的公共接口丢失了。我实际上不确定这是否解决了 OP 的问题。
  • 这行得通,谢谢! :) @πάνταῥεῖ 我不确定Foo 失去其公共界面是什么意思。我想包装在namespace { } 中的那个只在foob.cpp 文件中声明和使用。
【解决方案2】:

正常的解决方案是从foob.cpp 中删除Foo::bar() 的定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多