gpt4 book ai didi

c++ - 有没有办法防止分配指针?

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:57 26 4
gpt4 key购买 nike

一个棘手的问题。如果想编写一个返回某个 IFoo 对象的指针 的函数,是否可以阻止对该指针的赋值?我不想让 IFoo 成为单例,我可以隐藏或删除复制和赋值运算符,但 C++ 实际上是否允许一种模式,在这种模式下我必须明确地调用其他人来获取对象?

背景问题是:我正在考虑某种依赖容器,你应该总是要求容器获取一些IFoo *(为了多态性)。用户永远不能将它保存到某个局部变量或成员中,以避免对它的引用停滞。 (对于指示容器不再返回Foo的场景,它派生自IFoo而是Bar)

编辑 以进行澄清,尽管用户 R Sahu 已经表示这是不可能的。事实上,Mark B 的例子完美地说明了我想要阻止的事情:

IFoo* foo_ptr_I_will_keep_forever = obj->getIFoo();

当我没有接口(interface)而只有类型的显式实例时,我可以返回一个引用,给定私有(private) operator= 和复制构造函数就足够了。

最佳答案

你的标题是这样的:

Is there a way to prevent assignment of pointers?

不,如果你的函数返回一个指针,你就不能阻止它。

但是,如果您返回一个句柄,它可以是指向仅向前声明的类型的指针或可用于产生真实对象的整数值,并确保所有真实功能都适用于handle,那么您可以更自由地决定何时可以删除真实对象,而不会有将悬空指针留给客户端代码的风险。

这是一个演示该概念的简单程序。

#include <iostream>
#include <set>

// Foo.h

struct Foo;
using FooHandle = Foo*;

FooHandle createFoo();

void fooFunction1(FooHandle h);

void fooFunction2(FooHandle h);

// Test Program

int main()
{
FooHandle h = createFoo();
fooFunction1(h);
fooFunction2(h);
fooFunction1(h);
return 0;
}

// Foo implementation.

namespace FooImpl
{
std::set<Foo*>& getLiveFooObjects()
{
static std::set<Foo*> liveObjects;
return liveObjects;
}

bool isValid(Foo* h)
{
return (getLiveFooObjects().find(h) != getLiveFooObjects().end());
}
}

using namespace FooImpl;

struct Foo {};

FooHandle createFoo()
{
FooHandle h = new Foo{};
getLiveFooObjects().insert(h);
return h;
}

void fooFunction1(FooHandle h)
{
if ( isValid(h) )
{
std::cout << "In fooFunction1.\n";
}
else
{
std::cout << "Ooops. The handle is no longer valid.\n";
}
}

void fooFunction2(FooHandle h)
{
std::cout << "In fooFunction2.\n";
delete h;
getLiveFooObjects().erase(h);
}

输出:

In fooFunction1.
In fooFunction2.
Ooops. The handle is no longer valid.

关于c++ - 有没有办法防止分配指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43188050/

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