是否可以制作一个声明类的C++头文件(.h)及其公共(public)方法,但不定义该类中的私有(private)成员?我发现了一个few pages,它说您应该在头文件中声明该类及其所有成员,然后在cpp文件中分别定义方法。我问是因为我想拥有一个在Win32 DLL中定义的类,并且希望将其正确封装:该类的内部实现可能会更改,包括其成员,但这些更改不应影响使用该类的代码。 。我猜想如果我有这个,那么编译器将不可能提前知道对象的大小。但这应该没问题,只要编译器足够聪明,可以使用构造函数,并且只需将指针传递到存储对象的内存中的位置,并且永远不要让我运行“sizeof(MyClass)”。 更新:感谢所有回答!似乎pimpl习语是实现我所谈论的内容的好方法。我将做类似的事情:我的Win32 DLL文件将具有许多独立的功能,例如:void * __stdcall DogCreate();int __stdcall DogGetWeight(void * this);void __stdcall DogSetWeight(void * this, int weight);这是Microsoft编写其DLL文件的典型方式,因此我认为可能有充分的理由。但是我想利用C++对于类的漂亮语法,因此我将编写一个包装器类来包装所有这些函数。它只有一个成员,即“void * pimpl”。这个包装器类非常简单,我不妨只声明它并在头文件中定义它。但是,除了使C++代码看起来很漂亮外,这个包装器类实际上没有其他用途。 最佳答案 我认为您正在寻找的是所谓的“皮普尔成语”。要了解它是如何工作的,您需要了解在C++中可以转发这样的声明。class CWidget; // Widget will exist sometime in the futureCWidget* aWidget; // An address (integer) to something that // isn't defined *yet*// later on define CWidget to be something concreteclass CWidget{ // methods and such};因此,转发声明意味着 promise 以后完全声明一个类型。它的说法是:“我保证会有一个叫做CWidget的东西。我稍后会再介绍给您。”前向声明规则说,您可以定义一个指针或对已被​​前向声明的对象的引用。这是因为指针和引用实际上只是地址-这个数字尚未定义。出于很多原因,能够在不完全声明某个对象的情况下声明一个指针很方便。它在这里很有用,因为您可以使用“pimpl”方法使用它来隐藏类的某些内部。 Pimpl的意思是“实现的指针”。因此,您拥有的是实际的实现类,而不是“widget”。您在 header 中声明的类只是对CImpl类的传递。运作方式如下:// Thing.hclass CThing{public: // CThings methods and constructors... CThing(); void DoSomething(); int GetSomething(); ~CThing();private: // CThing store's a pointer to some implementation class to // be defined later class CImpl; // forward declaration to CImpl CImpl* m_pimpl; // pointer to my implementation};Thing.cpp将CThing的方法定义为传递给impl:// Fully define Implclass CThing::CImpl{private: // all variablespublic: // methods inlined CImpl() { // constructor } void DoSomething() { // actual code that does something } //etc for all methods};// CThing methods are just pass-throughsCThing::CThing() : m_pimpl(new CThing::CImpl());{}CThing::~CThing(){ delete m_pimpl;}int CThing::GetSomething(){ return m_pimpl->GetSomething();}void CThing::DoSomething(){ m_impl->DoSomething();}多田!您已经在cpp中隐藏了所有详细信息,并且头文件是非常整洁的方法列表。这是一件了不起的事情。您可能会发现与上面的模板不同的唯一地方是,人们可能会将boost::shared_ptr 或其他智能指针用于impl。会自行删除的内容。另外,请记住,此方法会带来一些麻烦。调试可能会有些烦人(重定向的额外级别以逐步进行)。创建类的开销也很大。如果您在每个类(class)都这样做,您将对所有的键入内容感到厌倦:)。
07-28 00:22