5

一个 C++ n00b 问题。是否可以从 cpp 中定义的静态方法调用私有构造函数?如果可能的话,我想将方法​​保留在头文件之外——我认为应该有办法做到这一点。尝试此操作时出现错误:

“无法访问在 SomeClass 类中声明的私有成员”

/////////////////
// SomeClass.h //
/////////////////

class SomeClass {
    public:
        static SomeClass SomeMethod();
    private:
        SomeClass(int i);
}

///////////////////
// SomeClass.cpp //
///////////////////

static SomeClass OSImplementation() {
    return SomeClass(0);
};

// calls implementation
SomeClass SomeClass::SomeMethod() {
    return OSImplementation();
}
4

2 回答 2

4

你可以交OSImplementation朋友的方法。

或者您可以OSImplementation在类中创建一个静态方法(但必须在标题中声明)。

或者,可能最常见的方法是拥有一个内部实现类,如下所示:

class SomeClass {
public:
    //...
private:
    struct Impl;
    Impl* intern;
};

在您的 cpp 文件中,您声明struct SomeClass::Impl.

在您的构造函数中,创建SomeClass::Impl实例。在析构函数中删除它。并实现复制构造函数和赋值运算符!

这称为 PIMPL(指向实现的指针)习语(维基百科c2.com)。它在像 Qt 这样的大型项目中被大量使用。

于 2012-06-22T18:52:58.653 回答
1

是的,通过结交OSImplementation()SomeClass 的朋友,这是可能的。下一个示例使用 g++ 4.6.1 编译没有警告和错误:

#include <iostream>

// declare in hpp
class SomeClass {

   friend SomeClass OSImplementation();

    public:
        static SomeClass SomeMethod();

        void foo();

    private:
        SomeClass(int);
};


int main()
{
  auto obj = SomeClass::SomeMethod();

  obj.foo();
}

// define in cpp
SomeClass SomeClass::SomeMethod(){
  return SomeClass( 5 );
}

SomeClass::SomeClass(int){
}

void SomeClass::foo(){
  std::cout<<"foo"<<std::endl;
}

SomeClass OSImplementation()
{
  return SomeClass::SomeMethod();
}
于 2012-06-22T19:01:01.010 回答