2011-03-28 67 views
0

我想更好地理解如何在存在PIMPL惯用语的情况下使用静态字段的方法。 考虑下面的代码。C++ 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 */ 
} 

我有这2个错误:

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

我对pimpl习语不太熟悉。

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

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

我该如何更改我的代码?

+1

'field'和'static_field'必须是'Type'的指针,而不是'Type'类型。 – Dialecticus 2011-03-28 10:39:44

+0

@Dialecticus:是另一个错误。这是一个指针,在我的实际实现 – Heisenbug 2011-03-28 10:41:36

回答

1
  • 告诉我们,您已验证产生相同的错误
  • 不要把静态函数定义的前面.cpp文件
  • 你没有static_field实际代码 - 你有两个field
+0

抱歉,但我来自Java语言存在静态变量。我如何在C++中声明静态变量? – Heisenbug 2011-03-28 10:36:28

+0

Erik说的是你的代码中有'static Type field',你明显的意思是'static Type static_field'。 – Dialecticus 2011-03-28 10:38:09

+0

@Dialecticus:固定。对不起 – Heisenbug 2011-03-28 10:39:45

2

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

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

1

事实上,U必须在u'r CPP文件definiton

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

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