2016-09-01 15 views
0

C++宣言ができる「固定順序」があるのでしょうか?私はクラス宣言内の宣言を見ています。C++の宣言順序(const/type/function)

Iが配列CONST型機能使用の線に沿って考えであろうPascalで

: objpasを用い

  1. 。 //整数
  2. CONST c_limit = 5。整数の
  3. タイプ t_int_array =配列[0..c_limit]。
  4. 機能 my_func(a_arg0:t_int_array):整数。

プライベートで保護された公序良俗を使用しているため、私のクラス宣言は一部のユーザーに反するものです。しかし、これらのセクション内で宣言の順序を固定することもできますか?

私が考えているものの種類は以下のとおりです。これに

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++のように固定注文はありません。しかし、固定注文が動作することが証明できれば、ユーザはどのような「リスト」が利用可能かを見て、最小/最大表示でアイテムをドロップするのに役立つだろう。私はおよそほとんどわからないんだ

分野の一つは、私はメンバーが事のクラスfunction..thatの種類を指すことができるかどうかはわからないので、関数やメンバ値は、宣言された順番です。私はC++よりもパスカルで強く、この点については何か考えていただければ幸いです。

また、一部のユーザーは、アイテムが表示される順序を優先させることがわかっています。なぜなら、GUIは宣言の「必要な順序」にのみ集中できるような方法でセクションを最小化するためです。

+0

参照する前に宣言する必要があります。それ以外には、固定注文はありません。 – Barmar

+1

@Barmarインラインメンバー関数本体は、まだ宣言されていないメンバーを参照できます。 –

答えて

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からクラス定義を生成するときに暗黙的な依存関係に従ってそれらを宣言したりすることはできません。

はい、依存関係を把握するために宣言を解析する(または理解する)必要がありますが、実行可能です。また、C++の解析にはlibclangなどのツールがあります。

また、宣言順と継承で達成することができるいくつかの先進的な効果(1)を防ぎますが、これは初心者に向けた環境の中で問題になることはありません。


(1)そのようなトリックの例:

struct Base 
{ 
    typedef int Buddy; 
}; 

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

private-publicの例struct Somethingとの関連で、データのtypedefをクラスの外に置くことはできますか?そうすれば、セクションオーダーは私的なものになる可能性がありますか?私はまだクラス内で宣言されていない型があると思っています。それとも、ここに与えられていない他の例ではこれはあまりにも制限されていますか –

+0

アイテムの散布に関して、クラス宣言とクラス定義は異なるファイル(* .C++、* .h)に置かれますが、GUIは両方を視覚的に組み合わせることができます。私の好みは、実装ファイルを格納するための仕様とユニットファイルをヘッダファイルに含めることです。 Barmarは、まだ宣言されていないメンバーを参照するインラインメンバー関数についての前のコメントで言及しました。 –

+0

@MichaelCollier Re:クラス外の 'Data'です。技術的には、クラス外で宣言することができます。しかし、それは名前空間を汚染し、 'std :: vector :: iterator'などのようなものを持つことはできません。C++のビットが許される十分な制限を課すときはもちろん、固定の順序を導入することができます。しかし、もしあなたがそれを行うなら、なぜC++を気にするのでしょうか? – Angew

0

を、これは可能な解決策だろうか?

私は、定数と型を任意の順序で宣言する必要性と、それが他のものより前に行われなければならないことを考慮しました。

また、コード本体はclassの関数宣言の内部に配置することはできません。

その後、以下で説明するセクションを、私が与えた順番に、あるいは実際には他のより良い順序で修正することができますか?

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... 
    } ; 

    */ 

} ; 
関連する問題