【问题标题】:class declaration over different files不同文件的类声明
【发布时间】:2012-07-03 09:41:46
【问题描述】:

我无法在本网站的其他地方找到类似的问题,但是否可以在两个不同的文件上声明一个类。

例如,一个文件中的所有公共类组件和不同文件中的私有和其他组件。

publics.h

    class test {
     public:
        int geta();
        void seta(int); 
    };

privates.h

    class test {
     private:
        int a;
    };

上面的方法肯定是错的,但是有没有这样的方法。

【问题讨论】:

标签: c++ class declaration


【解决方案1】:

有一种方法可以得到非常相似的东西:private inheritance

// private.hpp
class test_details {
  protected:
    int a;
};

// public.hpp

#include "private.hpp"

class test : private test_details {
  public:
    int geta() const { return a; }
    void seta(int i) { a = i; }
};

请注意,您仍然需要(间接)在任何使用公共类的模块中包含私有标头,因此您并没有真正以这种方式隐藏任何东西。

【讨论】:

  • 哈哈。我非常喜欢这个解决方案。聪明的。干净的。但我会等待,然后再将您的答案标记为最佳答案。
  • 好吧,只是私有数据成员和函数不可移植。所以我们希望他们完全处于不同的位置。您的解决方案解决了问题。 (我不能停止对解决方案微笑!)
【解决方案2】:

不是这样,但pimpl idiom (or opaque pointer, or Chesshire cat) 可以帮助您实现类似的功能 - 您可以提供一个公共接口,其中所有实现细节都隐藏在一个实现成员中。

C++ 不支持部分类。

另外,请注意,您所拥有的是类定义,而不是声明。 C++ 规定,如果一个类的多个定义可用,它们必须是相同的,否则就是未定义的行为。

【讨论】:

    【解决方案3】:

    这是抽象基类的一个很好的用例

     //File test.h
     class test {
         public:
            virtual ~test() {}
            virtual int geta()=0;
            virtual void seta(int)=0; 
        };
    
     //File test_impl.h
     class test_impl : public test {
         public:
            int geta() { return a; }
            void seta(int a ) { a = v; }
         private:
            int a;
        };
    

    【讨论】:

    • 抽象基类需要纯 virtual 函数。
    • test 应该有一个虚拟析构函数。
    • @hmjd 同意 - 复制,粘贴到网站上 - 已修复
    猜你喜欢
    • 2014-08-21
    • 2023-03-16
    • 2013-05-27
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2021-11-06
    相关资源
    最近更新 更多