c ++声明顺序(const / type / function)

时间:2016-09-01 09:41:41

标签: c++ class namespaces declaration

我想知道是否有"固定订单"哪个c ++声明可以做?我正在查看类声明中的声明。

在pascal中,我会考虑使用-const-type-function sequence:

  1. 使用 objpas; //整数
  2. const c_limit = 5;
  3. 类型 t_int_array =整数的数组[0..c_limit];
  4. 功能 my_func(a_arg0:t_int_array):整数;
  5. 我的类声明与某些用户相反,因为我使用私有保护的公共秩序。但在这些部分中,声明的顺序是否也可以修复?

    我想到的是:

    type declarations (types, enum, class etc)
    friend class
    friend functions
    static member value
    static functions
    virtual functions
    member function
    member value 
    operators
    bitfields
    constructors
    destructors
    using clause
    (..plus any I may have missed?)
    

    这背景是我在GUI上工作,允许孩子将项目(例如虚拟功能)拖放到列表中(例如虚拟功能列表) - 所以这些列表的顺序是对我来说很重要。

    目前没有固定的订单,按照c ++。但是,如果一个固定的订单可以被证明是有效的,那么它将有助于"转向"用户看到了什么样的"列表"可用,并以最小/最大观看次数将项目放入其中。

    我最不确定的一个方面是声明函数和成员值的顺序,因为我不确定某个成员是否可以指向类函数......这是什么类型的事情。我在pascal方面比c ++更强,并且会对此有任何想法吗?

    此外,我知道有些用户偏好显示项目的顺序,例如因为他们更喜欢先查看最公开的项目,但在我的情况下,这不是因素,因为GUI可以最大限度地减少部分,使我能够只关注"所需的顺序&# 34;声明。

2 个答案:

答案 0 :(得分:0)

没有通用的顺序可以放置这些类型的成员声明。这是类型和反对的反例。常量:

struct One
{
  static constexpr std::size_t dim = 4;
  typedef float Array[dim];
};

struct Two
{
  typedef float Data;
  static constexpr std::size_t dataSize = sizeof(Data);
};

如果你考虑decltype,那么当然任何两种这样的宣言类型都可以在两种方式上相互依赖。

此外,即使是受私人保护的公共秩序也无法修复。考虑这个课程:

struct Something
{
public:
  typedef std::pair<int, double> Data;

  Data getData() const;

private:
  Data prepareData();
};

但是,对于拖放式UI,您可以进一步分离UI表示和类声明。没有什么可以阻止您在UI中呈现这些声明类型,并在从UI生成类定义时根据它们的隐式依赖性散布它们。

是的,它确实需要您解析声明(或以其他方式理解它们)以找出它们的依赖关系,但它是可行的。并且有libclang等工具可用于解析C ++。

它还可以防止使用声明顺序和继承(1)实现的一些高级效果,但这不应该是针对初学者的环境中的问题。

(1)这样一招的例子:

struct Base
{
  typedef int Buddy;
};

struct Derived : Base
{
  Buddy getInt();
  typedef Buddy float;
  Buddy getFloat();
};

答案 1 :(得分:0)

这可能是一个可行的解决方案吗?

我已经考虑到需要以任何顺序声明常量和类型,并且必须在其他任何顺序之前完成它们。

此外,代码体不能放在类中的函数声明中。

之后,下面列出的部分可以按照我给出的顺序修复,还是以其他任何/更好的顺序修复?

class t_maybe_this_will_work
{
    //1.
    // This MUST be first, and allow declarations in ANY order
    // constexpr,typedefs,enums,nested classes

    //2.
    // What is best/only order for these..?
    // I have listed them so that functions come before values in case
    // functions are referenced?

    // friend                  classes
    // friend                  functions
    // using                   clauses

    // static                  functions
    // virtual                 functions
    // virtual                 operator
    // non-static,non-virtual  function
    // non-static,non-virtual  operator

    // static                  value
    // non-static              value
    // bitfield                value

    // virtual                 destructors
    // non-virtual             destructors
    //                         constructors

    /*     ***** RULE *****

    The body of functions are NOT defined within the class.

    int not_allowed_body_here (void)
    {
       // defining some code here...
    } ;

    */

} ;