【问题标题】:Const class object with a pointer member带有指针成员的 const 类对象
【发布时间】:2021-07-25 20:38:32
【问题描述】:

让我们有一个示例程序:

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 对象时:

const Example object(&var);

我希望常量也适用于值本身,而不仅仅是指针:

const int* const pointer; // something like that

【问题讨论】:

  • 这个声明有什么问题 const int* const pointer;还是使用这个 const int *pointer?
  • pointerprivate 时,该行将无法编译;)

标签: c++ class constants member-access


【解决方案1】:

要么像这样声明数据成员

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; }
};

【讨论】:

    【解决方案2】:
    const Example object(&var);
    

    这将创建一个const 对象。一旦创建了const 对象就无法更改。这就是常量对象的定义。

    object.pointer = &var;
    

    这会尝试更改此对象的成员。此对象无法更改。它现在是一个常量对象,因此会出现错误。

    我希望 constness 也适用于值本身,而不仅仅是 指针:

    const int* const pointer; // something like that
    

    “Something like that”声明了一个pointer,它本身就是一个常量值,并且它指向一个常量值。

    如果你想要一个指向const int 的对象,那就是:

    const int *pointer;
    

    并且使对象自身 恒定与它完全无关,无论如何。它只防止修改对象本身。一旦你做了某件事const它不能以任何理由改变

    【讨论】:

    • 这行不通,因为 OP 希望 constness 仅适用于 const Example 实例,而不适用于非常量实例。
    【解决方案3】:

    你可以这样做

    • 使pointer 成为返回指针的成员函数
    • 让非 const 版本的函数返回对指针的引用以允许对其赋值
    • 让函数的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2010-09-18
      相关资源
      最近更新 更多