在类外定义的类typedef

时间:2018-10-11 20:07:37

标签: c++ c++11

我正在编写一个具有内部类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的详细信息的同时,是否有任何解决方法?

4 个答案:

答案 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();