0
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){}
};

私が意図しているのは、 ctorを使用するときにxwithを指すことです。そうする方法はありますか?p_fooBarChild

BarParentctorのすべての可能な署名を試してみましたが、うまくいきませんでした。

概要:何らかの理由で、(非constオブジェクトへのポインター) を (オブジェクトへ制限constが破られるconst

4

3 に答える 3

3

2 つの選択肢を提示します。

  1. BarChildコンストラクターに を取得させたい場合は、オブジェクトの変更const Foo&を決して許可しないという約束を守る必要があります。Fooこれを行うには、 と の両方p_xp_foo必要ですconst Foo*(つまり、 へのポインターconst Foo)。それが非へのポインターである場合const Foo、オブジェクトの変更を効果的に許可し、約束を破ることになります。

    class BarParent
    {
        const Foo* p_foo;
    
        public:
        BarParent(const Foo* p_x)
        {
            p_foo = x;
        }
    };
    
  2. Foo*または、実際には aではなく aを保持したいconst Foo*ので、BarChildコンストラクターは aFoo&ではなくa を取得する必要がありconst Foo&ます。このように、オブジェクトを保持することについて嘘をついているわけではありませんconst

    class BarChild: public BarParent
    {
        public:
        BarChild(Foo& x)
        : BarParent(& x){}
    };
    
于 2013-04-02T20:55:27.383 に答える
2

あなたは a が何であるかを誤解していconst Foo&ます。

Aconst Foo&は変数へのエイリアスまたは参照であり、それを介して変数を変更することはできません (const_castまたは C スタイルのキャストを使用せずに)。「今すぐ」変更しないという約束だけではありませんが、この変数についてあなたが話すすべての人が同じように変更しないという約束でもあります。

後で変更するためにこのデータへのポインターを保存する場合はconst Foo&、 ではなくFoo&.

したがって、コードを修正するには、BarChild次のように書き直します。

class Foo{};

class BarParent
{
  Foo* p_foo;

  public:
    BarParent(Foo * p_x):
      p_foo(p_x)
    {}
};

class BarChild: public BarParent
{
  public:
  BarChild(Foo& x):
    BarParent(& x)
  {}
};
于 2013-04-02T20:58:20.240 に答える
1

const-ness をconst_cast次のようにキャストできます。

p_foo = const_cast<Foo *>x;

しかし、これは一般的に悪い考えです。これには2 つの理由があります。

  • const-correctness の全体的なポイントは、誰が何を変更できるかについての特定の期待を文書化/強制することです。 const_castそれを覆します。

  • 状況によっては、未定義の動作(つまり、実際にはconstconstポインターを介して行われる基になるオブジェクトの変更)を解き放つことさえあります。

一般に、最初からこれを行う必要を回避する方法を見つけてください (ユースケースが何であるかがわからないため、具体的な提案はできません)。

于 2013-04-02T20:40:54.207 に答える