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'|

由于第 62NODE 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,您不能WRAPPER::GLOBAL_WRAPPER_TYPE从 WRAPPED 返回。

您可以制作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 回答