0

我想更好地了解如何在存在 PIMPL 习语的情况下使用静态字段方法。考虑以下代码。

MyClass.h 文件:

#ifndef MYCLASS
#define MYCLASS

class MyClass{
     public:
     void method();
     static void static_method();

     private:
     Type field;
     static Type *static_field;
}

#endif

MyClass.cpp 文件:

#include MyClass.h

void MyClass::method(){
     /*OK method definition*/
     field = new Type();   /*OK field construction*/
}

void MyClass::static_method(){
     /*NOT WORKING method declaraion */
     static_field = new Type();   /*not working */
}

我有这两个错误:

  1. 不能将成员函数 static_method 声明为具有静态链接
  2. static_field 未在此范围内声明

我对pimpl成语不是很熟悉。

所以我的问题是我如何实现静态方法和字段声明以尊重 PIMPL 习语并成功编译它?

我在这段代码中做错了什么?

我该如何更改我的代码?

4

3 回答 3

2

pimpl 的目的是消除编译依赖。pimpl 类具有私有静态成员这一事实是实现细节,因此不应出现在头文件或 pimpl 类定义中。

将私有静态变量连同 pimpl 类的成员函数的定义一起放入未命名命名空间中的 .cc/.cpp 文件中。

于 2011-03-28T10:41:06.723 回答
1
  • 向我们展示您已验证的实际代码会产生相同的错误
  • .cpp文件中的函数定义前面不要放static
  • 你没有static_field- 你有两个field
于 2011-03-28T10:34:08.263 回答
1

确实,你需要有定义

Type* MyClass::static_field = new Type();

在你的 cpp 文件中。这是因为这样你告诉编译器应该在哪个目标文件中实例化该字段,否则编译器无法知道。

于 2011-03-28T11:00:47.010 回答