2

これが私が持っているコードです

class A
{
public:
    void Func1() const;
};

class B
{
public:
    A* a;
    void Func2() const
    {
        // do something with 'a'
    }
};

void A::Func1() const
{
    B b;
    b.a = this;
    b.Func2();
}

constからnon-constに変換しようとしているので、明らかにこれは行にエラーを与えています。

b.a = this;

Func2の恒常性を捨てずに呼び出す方法はありますかthis?とにかくconst関数なのでFunc2、変更されませんthis

4

4 に答える 4

3

A*を const として宣言する必要があります。

class A
{
public:
    void Func1() const;
};

class B
{
public:
    const A* a;
    void Func2() const
    {
        // do something with 'a'
    }
};

void A::Func1() const
{
    B b;
    b.a = this;
    b.Func2();
}

以降A::Func1thisポインターは const です。

于 2012-05-17T12:14:16.630 に答える
1

Func2変更されない可能性がthisありますが、変更されてb.aおらずconst、後で自由に変更できます。mutableまたはなどの回避策はありますが、これを行う正しい方法はありませんconst_cast

設計ミスのサインです。

于 2012-05-17T12:14:19.570 に答える
1

はい、A *定数を作成します。

class B {
public:
    const A *a

...
};
于 2012-05-17T12:14:40.713 に答える
1

class B常にオブジェクト*aとして機能する場合constは、他の人が言っているように、宣言を次のように変更するだけです。

public: const A* a

この時点で、 の constness は、 の constness とB::Func2はまったく関係がないため、ニシンであることに言及する必要がありB::aます。つまり、 の値を変更することは許可されていませB::Func2ん。ただし、結果のオブジェクトを逆参照して変更すること許可されています。constaa

ここで、と 非操作class Bの両方がある場合、クラスの設計を変更する必要があります。上記のようにa を使用するように切り替え、すべての変更操作をカプセル化する別の a を追加すると、はるかに優れたものになります。さらに、プロパティ セッターの背後に隠されている必要があります。これにより、次のようなことができますconstconst*aclass Bconst A* aclass D : public Ba

class B {
    const A* a;
public:
    void setA(const A* a) { this->a = a; }
    void Func2() const {}
};

class D : public B {
    A* a;
public:
    using B::setA;
    void setA(A* a) { 
        this->a = a;
        static_cast<B*>(this)->setA(const_cast<const A*>(a));
    }
    void Func3() { /* do something to D::a */ }
};

このスキームを使用すると、アクセスするオブジェクトへの適切に型指定された独立したポインターを維持できますB。、またはパラメータを指定して で呼び出されたD場合は、 のみが設定されます。が で呼び出された場合、と の両方が適切に設定されます。これが可能になったのは、セッターの背後でメンバーを抽象化することにより、パラメーターの constness でセッターをオーバーロードできるためです。setABDconst A*B::asetADA*B::aD::a

于 2012-05-17T12:25:20.780 に答える