gpt4 book ai didi

c++ - Pimpl 不工作

转载 作者:太空狗 更新时间:2023-10-29 23:42:31 25 4
gpt4 key购买 nike

这是一个非常愚蠢的错误,但我不知道这里发生了什么。

有很多 pimpl 示例,但我不明白为什么这不起作用(这或多或少是示例之一,但我看不出有什么区别)。

我有一个非常简单的 Pimpl 示例,但它不起作用。

// Foo.hpp
#include <boost/scoped_ptr.hpp>

class Foo
{
struct Bar;
//boost::scoped_ptr<Bar> pImpl;
Bar* pImpl;

public:
Foo();
~Foo() {}

int returnValue();

private:

};

// Foo.cpp
#include "foo.hpp"

struct Foo::Bar
{
Bar() {}
~Bar() {}
int value;
};

Foo::Foo() : pImpl(new Bar())
{
pImpl->value = 7;
}

int Foo::returnValue() {
return *pImpl->value;
}

编译这个给我错误。C2100:非法间接。

谢谢。

最佳答案

int returnValue() 应该是一个成员函数:

//  vvvvv
int Foo::returnValue() {
return pImpl->value; // no need to dereference, value isn't a pointer
}

您需要在定义实现类后定义构造函数、复制构造函数、复制赋值运算符和析构函数。 (否则隐式析构函数是危险的,scoped_ptr 不会让您这样做):

// Foo.hpp
#include <boost/scoped_ptr.hpp>

class Foo
{
struct Bar;
boost::scoped_ptr<Bar> pImpl;

public:
Foo();
~Foo();

int returnValue(); // could be const (so should be)

private:
// just disable copying, like scoped_ptr
Foo(const Foo&); // not defined
Foo& operator=(const Foo&); // not defined
};

和:

// Foo.cpp
#include "foo.hpp"

struct Foo::Bar
{
int value;
};

Foo::Foo() :
pImpl(new Bar())
{
pImpl->value = 7;
}

Foo::~Foo()
{
// okay, Bar defined at this point; scoped_ptr can work
}

int Foo::returnValue()
{
return pImpl->value;
}

关于c++ - Pimpl 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3985830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com