2013-07-29 168 views
0

基本上我想要的是在一个类中有一个全局变量GLOBAL_WRAPPER_TYPE,以便我可以存储任何数据类型。到目前为止,我有下面的代码可能有其缺点,但只要你不尝试从WRAPPED返回任何东西,它编译。试图用模板编译嵌套类?

我还想知道我的设置功能是否正常工作,是否需要重载=运算符以从WRAPPED类中检索模板类型T.我无法使GLOBAL_WRAPPER_TYPE的“提取”工作,我不确定WRAPPED类中的set()函数是否可以工作。它编译但可能会发生运行时错误(尚未运行)。

我没有得到一个编译器错误的代码...

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

回答

1

GLOBAL_WRAPPER_TYPEWRAPPER非静态成员,但是,你不能返回从封装的WRAPPER::GLOBAL_WRAPPER_TYPE它不是WRAPPED成员。

您可以使WRAPPER::GLOBAL_WRAPPER_TYPE为静态。

注: 你设定的功能设置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; 

现在,您可以访问打包机: :直接使用GLOBAL_WRAPPER_TYPE。

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

注意:你的变量名很难读,更好的选择一些更好的东西。找到一个好的C++编码风格的指导。 :)

+0

我怀疑你的意思是'不做你的想法'。它的奇怪之处在于'WRAPPED'不能“看见”GLOBAL_WRAPPER_TYPE。我怎么会这样做,虽然“定义另一个让WRAPPED持有对WRAPPER的参考。”? – pandoragami

+0

只是认为WRAPPER和WRAPPED是两个不同的类。 – billz

+0

我是否从WRAPPED声明WRAPPER,然后调用GLOBAL_WRAPPER_TYPE? – pandoragami