如何解决带有指针成员
让我们有一个示例程序:
struct Example
{
int* pointer;
Example(int* p) : pointer(p) {}
};
int main()
{
int var = 30;
const Example object(&var);
object.pointer = &var; // error
*object.pointer = var;
}
我知道为什么会出现错误 - 创建 const Example
对象时,pointer
实际上是 const 指针,而不是指向 const 的指针。因此,将 &var
分配给 object.pointer
是不正确的,但将 var
分配给 *object.pointer
可以正常工作。
那么有什么办法可以使这条线:
*object.pointer = var;
不编译?我希望指针指向的值也是常量。换句话说,当创建一个 const 对象时:
const Example object(&var);
我希望常量也应用于值本身,而不仅仅是指针:
const int* const pointer; // something like that
解决方法
要么像这样声明数据成员
const int *pointer;
或使其成为受保护或私有数据成员。在最后一种情况下,您可以声明一个非常量成员函数,该函数允许更改指针指向的值。对于类的常量对象,不会调用该函数。例如
struct Example
{
private:
int* pointer;
public:
Example(int* p) : pointer(p) {}
int & get_value() { return *pointer; }
const int & get_value() const { return *pointer; }
};
,
const Example object(&var);
这会创建一个 const
对象。 const
对象一旦创建就无法更改。根据定义,这就是常量对象的含义。
object.pointer = &var;
这会尝试更改此对象的成员。此对象无法更改。它现在是一个常量对象,因此出现错误。
我希望常量也应用于值本身,而不仅仅是应用于 指针:
const int* const pointer; // something like that
“类似的东西”声明了一个pointer
,它两者本身就是一个常量值,并且它指向一个常量值。
如果你想要一个指向 const int
的对象,那就是:
const int *pointer;
并且使对象本身保持不变与它完全无关,无论如何。它只防止修改对象本身。一旦你做了一些事情const
它不能以任何理由改变。
你可以这样做
- 使
pointer
成为返回指针的成员函数 - 让函数的非常量版本返回对指针的引用以允许对其进行赋值
- 使用 const 版本的函数返回指针的副本以防止赋值
struct Example
{
private:
int* pointer_internal;
public:
Example(int* p) : pointer_internal(p) {}
int*& pointer() { return pointer_internal; }
int* pointer() const { return pointer_internal; }
};
int main()
{
int var = 30;
const Example object(&var);
object.pointer() = &var; // error: lvalue required as left operand of assignment
*object.pointer() = var;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。