以下头文件和实现文件合并了所有三个概念,但不会编译:
$ cat a.h
#include <memory>
class Base {
protected:
class BaseImpl;
std::shared_ptr<BaseImpl> pImpl;
Base(BaseImpl* impl)
: pImpl{impl}
{}
public:
virtual ~Base()
{}
virtual void func() =0;
};
class Der : public virtual Bas
我有以下设置:
foo.h
class A {
friend class B;
private:
A() {}
};
class B {
public:
void addObject(Object &o); // adds to myMember; A is not exposed!
void computeResult(Result &r); // uses myMember to compute result
private:
vector<A> myMember;
};
A的对象将永远不会暴露在任何程序中,包括foo.
在将源文件编译到.o文件并使用"ar arylib.a *.o“创建库后,我将得到分段错误,因为我使用的是一个头文件,其中包含成员变量和私有函数。当我使用完全相同的标题时,我不会得到错误。删除映射中的指针时会发生分段错误。
用于创建库的标头
#include <**Type**>
class A
{
public:
A();
~A(); //In the destructor I iterate through the map to free everything before
void function();
private:
我知道策略和抽象工厂设计模式--但是它们不能解决我当前的问题:
我正在创建一个C++库,它提供了一个非常基本的图形用户界面。但是,我希望用户能够在编译时选择使用哪个GUI库(比如Qt或FLTK)来实际呈现GUI。然而,用户应该只需要知道我的库中的方法。
应该可以使用Qt后端或FLTK后端编译相同的代码,而无需任何更改。
我想到了类似这样的东西:
class A
{
// do things that are not specific to QT or FLTK here as there are many
// methods I will need independent of t
我试图实现一个基于谈话 幻灯片 和 进一步 资料来源的“快速Pimpl”成语,它本质上是一个大小对齐的存储,在实现Pimpl成语时可以用作std::unique_ptr的插入替代:
// ...
private:
// std::unique_ptr pimpl_; // allocation and pointer redirection is required
// versus:
FastPimpl pimpl_; // no allocation, no redirection
// BUT: size and alignment of Impl must be pro
我有一个任务要创建一个多平台的C++图形用户界面库。它在不同的平台上封装了不同的GUI框架。库本身提供了一个界面,用户可以通过这个界面进行统一的通信,而不管他使用的平台是什么。
我需要正确地设计这个接口和与框架的底层通信。我试过的是:
Pimpl成语-这个解决方案首先是因为它的优点-二进制兼容性,削减依赖树以增加构建时间.
class Base {
public:
virtual void show();
// other common methods
private:
class impl;
impl* pimpl_;
};
#ifdef Framework
我正在阅读Scott的有效C++,我有一个关于第31项的问题,“最小化文件之间的编译依赖”。
在一个例子中,他展示了丘疹成语:
#include <string> // standard lib shouldn't be forward-declared
#include <memory>
class PersonImpl; // Forward decl of Person impl.class
class Date; // forward decls of classes used in Person interface
class A
我正在编写一个简单的库来处理跨不同平台的窗口创建。为了抽象出特定于平台的代码,我想使用带有PImpl的std::unique_ptr成语,并提供一个带有工厂函数的特定于平台的私有实现。这就是我目前的情况:
Window.h:
#pragma once
#include <memory>
class Window
{
public:
Window();
~Window();
private:
class WindowImpl;
std::unique_ptr<WindowImpl> impl;
};
Wi