0

基本的に私が望むのは、クラス内にグローバル変数を用意して、GLOBAL_WRAPPER_TYPE任意のデータ型を格納できるようにすることです。これまでのところ、以下のコードには問題がある可能性がありますが、から何も返そうとしない限りコンパイルされますWRAPPED

また、set 関数が適切に機能するかどうか、およびクラス=からテンプレート型 T を取得するために演算子をオーバーロードする必要があるかどうかも疑問に思いました。WRAPPEDの「抽出」を機能させるのに問題があり、クラス内の関数が機能GLOBAL_WRAPPER_TYPEするかどうかはわかりません。コンパイルはできますが、実行時エラーが発生する可能性があります (まだ実行していません)。set()WRAPPED

コードでコンパイルエラーが発生しました...

nested_class_global_template.cpp|44|error: invalid use of nonstatic data member 'WRAPPER<NODE>::GLOBAL_WRAPPER_TYPE'|

62行目のためNODE temp = WRAPPING.INSIDE.get();、コードはその行なしでコンパイルされますが、set()関数が機能するかどうかはわかりません。

NODE*そして最後に、ポインターとして宣言されていると、静的ではないことを確認してすべてを台無しにする方法を知りたかったのですか?

コードはこちら。

#include <iostream>

using namespace std;

class NODE
{
    int data;

    public:

    NODE(){}
    ~NODE(){}
    NODE(int data)
    {
        this->data = data;
    }
    void print()
    {
        std::cout<<"data: "<<this->data<<std::endl;
    }
};
template <class T>
class WRAPPER
{
    public:

     T GLOBAL_WRAPPER_TYPE;

    WRAPPER(){}
    ~WRAPPER(){}

    class WRAPPED
    {
        public:

        WRAPPED(){}
        ~WRAPPED(){}
        void set(T GLOBAL_WRAPPER_TYPE)
        {
            GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;
        }
        T& get()
        {
            return GLOBAL_WRAPPER_TYPE;
        }
        WRAPPED& operator=(const WRAPPED &INSIDE)
        {
            GLOBAL_WRAPPER_TYPE = INSIDE.GLOBAL_WRAPPER_TYPE;

            return *this;
        }
    };

    WRAPPED INSIDE;
};
int main()
{
    WRAPPER<NODE> WRAPPING;
    WRAPPING.INSIDE.set(NODE(99));


    NODE temp = WRAPPING.INSIDE.get();

    return 0;
}

編集これはうまくいきます!

    #include <iostream>

using namespace std;

class NODE
{
        int data;

    public:

        NODE(){}
        ~NODE(){}
        NODE(int data)
        {
            this->data = data;
        }
        void print()
        {
            std::cout<<"data: "<<this->data<<std::endl;
        }
};
template <class T>
class WRAPPER
{
    public:

        static T GLOBAL_WRAPPER_TYPE;

    WRAPPER(){}
    ~WRAPPER(){}

        class WRAPPED
        {
            public:

            WRAPPED(){}
            ~WRAPPED(){}
            void set(T GLOBAL_WRAPPER_TYPE)
            {
                WRAPPER::GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;
            }
            T& get()
            {
                return GLOBAL_WRAPPER_TYPE;
            }
            WRAPPED& operator=(const WRAPPED &INSIDE)
            {
                GLOBAL_WRAPPER_TYPE = INSIDE.GLOBAL_WRAPPER_TYPE;

                return *this;
            }
        };

        WRAPPED INSIDE;
};
template <class T>
T WRAPPER<T>::GLOBAL_WRAPPER_TYPE;
int main()
{
    WRAPPER<NODE> WRAPPING;
    WRAPPING.INSIDE.set(NODE(99));
    NODE temp = WRAPPING.INSIDE.get();
    temp.print();

    return 0;
}
4

1 に答える 1

1

GLOBAL_WRAPPER_TYPEは の非静的メンバーですWRAPPERが、 のメンバーではありません。WRAPPED からWRAPPED戻ることはできませんWRAPPER::GLOBAL_WRAPPER_TYPE

WRAPPER::GLOBAL_WRAPPER_TYPE静的にすることもできます。

注:set関数はGLOBAL_WRAPPER_TYPE、に設定するのではなく、それ自体に設定しますWRAPPER::GLOBAL_WRAPPER_TYPE

  void set(T GLOBAL_WRAPPER_TYPE)
  {
        GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;  // Doesn't do what you think!!!
  }

GLOBAL_WRAPPER_TYPEコメントから更新すると、静的メンバーを作成できます。

template <class T>
class WRAPPER
{
    public:    
     static T GLOBAL_WRAPPER_TYPE;
    //......
};

template <class T>
T WRAPPER<T>::GLOBAL_WRAPPER_TYPE;

WRAPPER::GLOBAL_WRAPPER_TYPE に直接アクセスできるようになりました。

 void set(T GLOBAL_WRAPPER_TYPE)
 {
       WRAPPER::GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;
 }

注: 変数名は非常に読みにくいため、より適切なものを選択してください。優れた C++ コーディング スタイル ギルドを見つけてください。:)

于 2013-07-29T01:44:38.237 に答える