提问人:Daniel Bauer 提问时间:3/1/2023 最后编辑:Daniel Bauer 更新时间:3/1/2023 访问量:112
如何仅将基类公开为 const 引用
How to expose a base class only as const reference
问:
我希望我的类仅将其基类公开为对 的常量引用。这意味着可以读取 的成员,但不能设置。
这是我尝试过的:Foo
Bar
Bar
Bar
struct Bar
{
int member;
};
class Foo : protected Bar
{
public:
operator const Bar&() { return *this; }
};
但是当使用它时,会出现以下问题:
int getBarMember( const Bar& bar )
{
return bar.member;
}
int main()
{
Foo myFoo;
const Bar& refBar = myFoo; // C2243
// const Bar& refBar = (const Bar&) myFoo; // always need to cast explicitly
int read = refBar.member;
int readByFunction = getBarMember( myFoo ); // C2243
// int readByFunction = getBarMember( (const Bar&) myFoo ); // always need to cast explicitly
}
我希望能够在没有显式强制转换的情况下调用接受常量引用的函数。Bar
编译器错误为:
C2243:存在从“Foo *”到“const Bar&”的“转换类型”转换,但 无法
答:
5赞
Yksisarvinen
3/1/2023
#1
我认为这是不可能的,gcc 和 clang 对操作员发出以下警告:
<source>:12:5: warning: converting 'Foo' to a reference to a base class 'Bar' will never use a type conversion operator [-Wclass-conversion] 12 | operator const Bar&() { return *this; } | ^~~~~~~~
如果在实际代码中可行,则可以使用组合而不是继承原则并执行以下操作(在线查看):
struct Bar
{
int member;
};
class Foo
{
public:
operator const Bar&() { return parent; }
protected:
Bar parent;
};
它可能需要对内部的访问方式进行一些更改,但它可以在没有外部世界强制转换的情况下工作。Bar
Foo
评论
0赞
Daniel Bauer
3/1/2023
表达它们之间关系的非常好的替代方式,我现在将在我的应用程序中使用它。
评论
operator Bar
private
//
//