基本上,我想要的是在一个类中有一个全局变量GLOBAL_WRAPPER_TYPE
,这样我就可以将任何数据类型存储到它中。到目前为止,我有下面的代码,它可能有错误,但只要你不试图从WRAPPED
返回任何东西,它就会编译。
我还想知道我的set函数是否正常工作,是否需要重载=
运算符来从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;
}
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++编码风格指南。:)