【问题标题】:How to make a const getter for an array which contains another class's instances?如何为包含另一个类的实例的数组创建一个 const getter?
【发布时间】:2020-03-07 10:29:21
【问题描述】:

问题是 getter 必须在 const bar 对象上工作。但是编译器说:

[Error] invalid conversion from 'const foo*' to 'foo*' [-fpermissive]

代码:

class foo
{
private:
    string name;
public:
    foo()
    {
        name = "default";
    }
};

class bar
{
private:
    foo array_of_foo[43];
public:
    foo* get_array_of_foo() const { return array_of_foo; }
};

【问题讨论】:

    标签: c++ c++11 member-functions


    【解决方案1】:

    实际上是否需要从常量bar 获取可变foos 数组?这听起来不太可能,而且可能不是您真正想要的,除非您正处于一个大而痛苦的重构之中。

    更好的选择是:

    // Return a mutable foo array from a mutable bar.
    foo* get_array_of_foo() {return array_of_foo;}
    
    // and/or
    
    // Return a const foo array from a const bar.
    const foo* get_array_of_foo() const {return array_of_foo;}
    

    但是,如果您确实将自己画在一个您真的需要这样做的角落,那么您可以使用const_cast<> 来摆脱困境。

    foo* get_array_of_foo() const {return const_cast<foo*>(array_of_foo);}
    

    话虽如此,这是一种巨大的代码气味,也是最后的手段。

    【讨论】:

    • 这是我大学的实习任务,但我认为这是一个非常大的废话。他们总是强迫我们把一切都做 const 。 ://
    • @PéterSchweitzer 大多数东西应该是const。这样,您实际必须更新数据的重要位置将更加明显。递归强制 const 是 C++ 的最佳特性之一。
    • 它只会给我带来问题。 :S 我讨厌这种语言。 Java 要简单得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 2016-08-25
    相关资源
    最近更新 更多