c++:我可以禁止引用 MyClass 的对象吗?

问题描述 投票:0回答:1

问题

有什么办法可以阻止消费者创建指向特定类类型的对象的引用和指针吗?

MyClass object; // default constructor. shall be possible
MyClass& reference = object; // shall be impossible
MyClass* pointer = &object; // shall be impossible

所以问题是我如何实现

MyClass
以便实现上述三个属性。

我尝试了什么

我尝试将每个运营商定义为私有。然后,我尝试使 MyClass 成为对类型的实际使用,其中第二部分是引用,以便利用编译器将禁止引用引用的事实。但它不起作用,因为它是对一对的引用。

要求

只要消费者体验到 MyClass 的行为就像一个类,我很高兴 MyClass 实际上可以是任何东西(例如,数组、指针、引用等)。但它不应该需要动态内存。

原因

我让用户编写一个带有掩码模板类型的类。这些稍后将被使用,以便一旦代码生成器将用户类转换为派生类,所述类的属性就具有不同的类型。如果现在用户引用以前以与外部类相同的方式代码生成的属性,则掩码类型与设计模式不兼容。因此,我提供了一个所有屏蔽类型都继承自的引用类型。考虑一下,例如继承自

Spline<mask>
template<mask> using SplineRef = SplineBase<mask::numbertype>
因为 splinebase 实际上是传递信息所需的唯一东西,例如在节点或横坐标数组中设置值时,同时提取所有评估类型掩码之间兼容的信息。然后,为了防止用户不使用 SplineRef 而是使用 Spline& ref=obj,我希望后者导致编译错误。对我来说,在当前的代码情况下,这似乎是最干净的延续。

c++ oop reference
1个回答
0
投票

不,这是不可能的。

对于任何对象

x
,用户始终可以执行任何类型的操作

auto&& ref = x;

获取对象的引用。

同样,用户始终可以这样做

auto ptr = std::addressof(x);

获取指向该对象的指针。即使

std::addressof
在某种程度上被禁止,用户始终可以通过一系列
reinterpret_cast
来实现相同的目的。

这只能通过文档来强制执行。

© www.soinside.com 2019 - 2024. All rights reserved.