基本上我想要的是在一个类中有一个全局变量GLOBAL_WRAPPER_TYPE
,这样我就可以在其中存储任何数据类型。到目前为止,我有下面的代码可能有它的错误,但只要你不尝试从WRAPPED
返回任何内容它就会编译。
我也想知道我的set函数是否正常工作,我是否需要重载=
运算符以从WRAPPED
类中检索模板类型T.我无法使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;
}
答案 0 :(得分:1)
GLOBAL_WRAPPER_TYPE
是WRAPPER
的非静态成员,但它不是WRAPPED
的成员,您无法从WRAPPED返回WRAPPER::GLOBAL_WRAPPER_TYPE
。
您可以将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;
现在您可以直接访问WRAPPER :: GLOBAL_WRAPPER_TYPE。
void set(T GLOBAL_WRAPPER_TYPE)
{
WRAPPER::GLOBAL_WRAPPER_TYPE = GLOBAL_WRAPPER_TYPE;
}
注意:你的变量名很难读,最好选择更好的东西。找一个好的C ++编码风格guilde。 :)