我正在编写一个具有内部类C
的类T
,并且我想将T
的详细信息隐藏为C
的内部实现。 C
中的方法都使用指向T
的指针。这当然是可能的:
// In header
class C {
public:
class T;
T* f();
void g(T*);
};
// In .cpp
class C::T { /* details here */ };
现在我的问题是,如何在C::T
文件中将.cpp
定义为另一个别名。以下代码根本不会编译,但是它说明了我要执行的操作:
// Outside the class C
using C::T = std::string;
在保持目标(即隐藏C::T
的详细信息的同时,是否有任何解决方法?
答案 0 :(得分:1)
您不能这样做,因为类class T;
中的前向声明C
声明了真实名称为C::T
的类类型,因此与真实名称为{{ 1}}。
您可以考虑以下内容:
std::basic_string<...>
答案 1 :(得分:1)
与之最接近的是让您的t来自字符串:
class C::T : public std::string { ... };
答案 2 :(得分:1)
正如其他人指出的那样,这是不可能完成的。这是我的建议:
// .h
class C {
public:
struct T;
T* f();
void g(T*);
};
// .cpp
struct C::T
{
IMPL_TYPE data;
//If one is carefull with lifetimes this can almost in any context act as IMPL_TYPE.
//And if necessary, the data member can be accessed.
operator IMPL_TYPE&(){return data};
}
答案 3 :(得分:-1)
T
永远不能真正隐藏或重新定义为其他.cpp文件中的类型别名。
关于方法的下一轮应该可以满足您的需求。
class C
{
public:
// Use a base class for just the pointers.
struct TBase
{
virtual ~TBase() {}
};
TBase* f();
void g(TBase*);
// Allow client code to define a concrete type using a template parameter.
template <typename Data> struct T : TBase
{
Data data;
};
};
然后,在.cpp文件中,使用:
using Type = C::T<std::string>;
Type* obj = new Type;
obj->data = "Some string";
C c;
c.g(obj);
TBase* ptr = c.f();