【问题标题】:How do i separate a class definition into 2 header files?如何将一个类定义分成 2 个头文件?
【发布时间】:2014-11-18 00:19:42
【问题描述】:

我需要拆分一个类(.h 文件)

#ifndef _L_H
#define _L_H
template<class L> class Myclass{
public:
  L();
  firstoperator(..);
  secondoperator(..);
private:
 ...
}
template <class L> Myclass<L>::L() ...
template <class L> Myclass<L>::firstoperator(..) ...
template <class L> Myclass<L>::secondoperator(..) ...

在两个不同的.h文件中,格式如下:

#ifndef _L_H
#define _L_H
template<class L> class Myclass{
public:
  L();
  firstoperator(..);
private:
 ...
}
template <class L> Myclass<L>::L() ...
template <class L> Myclass<L>::firstoperator(..) ...

#ifndef _L_H
#define _L_H
template<class L> class Myclass{
public:
  secondoperator(..);
}

template <class L> Myclass<L>::secondoperator(..) ...

我怎样才能在不冲突的情况下正确地做到这一点?

提前谢谢你。

【问题讨论】:

  • 您不能将类的声明拆分为头文件。虽然您可以将定义拆分为多个文件,但这不是一个好主意。
  • 所有方法都必须声明为成员函数吗?

标签: c++ class


【解决方案1】:

从技术上讲,你可以做到,但它很丑。 不要这样做

Class1.hpp:

class MyClass
{
    int something;
    int somethingElse;

Class2.hpp:

    int somethingBig;
    int somethingSmall;
};

我希望很清楚这有多恶心:)

【讨论】:

  • +1 表示“黑客”思维。 +1 可能会破坏 IntelliSense 以及所有其他类似的东西:P
  • IntelliSense 对需要种类拆分的 C++ 项目很不利。
  • 对于任何项目规模来说,这感觉都是有史以来最糟糕的做法。但是太聪明了!帽子的尖端,先生
【解决方案2】:

您可以使用 Heritage 将类拆分为两个标题。

你可以在基类上声明一半类,在派生类上声明另一半类。

像这样:

class C12{
public:
  void f1();
  void f2();
};

可以拆分为C1和C12

class C1{
public:
  void f1();
};

class C12: public C1{
public:
  void f2();
};

现在 C12 和以前一样,但拆分为 2 个文件。

【讨论】:

  • 这可能会产生不必要的副作用。如果是这样,提及/推荐mixins 会是更好的选择。
  • @πάνταῥεῖ 你链接的那个 SO 问题说 C++ 中的 mixins 是通过继承(除非我读错了),所以我看不出这个答案与提到 mixins 有什么不同?
  • @MicroVirus template 实际上有很大的不同!
【解决方案3】:

“我怎样才能在不冲突的情况下正确地做到这一点?”

你不能。在 c++ 中不可能将类声明分布在多个头文件中(与 c# 不同)。所有类成员的声明都必须出现在类声明主体中,在每个使用该类的翻译单元中都可以看到。

您可以将模板特化或实现分开来分开标头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多