c++ - `const` ness、引用和函数调用

标签 c++ pointers inheritance reference

class Foo{};

class BarParent
{
    Foo* p_foo;

    public:
    BarParent(Foo * const p_x) //OR BarParent(Foo const * x) OR BarParent(Foo * x)
                             //OR (Foo const * const x)
    {
        p_foo = x;
    }
};


class BarChild: public BarParent
{
    public:
    BarChild(const Foo& x)
    : BarParent(& x){}
};

我的意图是:在使用 BarChild 构造函数时,使用 p_foo 指向 x。有办法吗?

我已经为 BarParent 构造器尝试了所有可能的签名,但没有成功。

总结: 出于某种原因,我混淆了将一个(指向非 const 对象的指针)分配给(指向一个const object) 打破了 const 的限制。

最佳答案

我为您提供两种选择:

  1. 要么您确实希望 BarChild 构造函数采用 const Foo&,在这种情况下,您需要坚持您的 promise ,即永远不允许 Foo 待修改的对象。为此,p_xp_foo 都需要是 const Foo*(即指向 const Foo 的指针).如果它是一个指向非 const Foo 的指针,您将有效地允许修改该对象,从而违反您的 promise 。

    class BarParent
    {
        const Foo* p_foo;
    
        public:
        BarParent(const Foo* p_x)
        {
            p_foo = x;
        }
    };
    
  2. 或者,您确实希望保留 Foo* 而不是 const Foo*,因此 BarChild 构造函数应该采用 Foo& 而不是 const Foo&。这样,您就不会在保持对象 const 方面撒谎。

    class BarChild: public BarParent
    {
        public:
        BarChild(Foo& x)
        : BarParent(& x){}
    };
    

关于c++ - `const` ness、引用和函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15773917/

相关文章:

c++ - IXSomething 与 ISomething

c++ - 带开始/结束 anchor 的 CAtlRegExp 表达式问题

Java类初始化难题

Javascript 原型(prototype)继承

swift - Self 类型的存储变量(特别是在子类化时)

c++ - 将文本文件读入字符串。 C++ ifstream

c++ - 我的函数链不想工作,为什么?

c - char 变量如何接受 Pointer(NULL) 作为其值?

c++ - 重载函数以同时获取指针或引用是不好的做法吗?

c++ - 使用 'pointer' 和结构调用 DLL (C++ -> VB.NET)