更改析构函数订单

时间:2017-01-20 10:56:51

标签: c++

我需要破坏一个类,首先在类本身之前调用成员的析构函数。 我知道破坏顺序通常是相反的顺序。但我在特殊情况下对此进行了讨论。

// PortA
class PortA
{
public:
    PortA()     { cout << " PortA\n"; }
    ~PortA()    { cout << " ~PortA\n"; }
};

// PortB
class PortB
{
public:
    PortB()     { cout << " PortB\n"; }
    ~PortB()    { cout << " ~PortB\n"; }
};


class Card
{
public:
    Card()      { cout << "card\n"; }
    ~Card()     { cout << "~card\n"; }


    PortA mPA;
    PortB mPB;
};

产生:

 PortA
 PortB
card
~card
 ~PortB
 ~PortA

但在这种情况下我需要:

card
 PortA
 PortB
 ~PortB
 ~PortA
~card

首先在卡片本身之前克隆端口。

3 个答案:

答案 0 :(得分:2)

将基类添加到Card

class BaseCard {
public:
    BaseCard()  { std::cout << "basecard\n"; }
    ~BaseCard() { std::cout << "~basecard\n"; }
};

class Card : BaseCard
{
public:
    Card()      { std::cout << "card\n"; }
    ~Card()     { std::cout << "~card\n"; }


    PortA mPA;
    PortB mPB;
};

在需要时调用BaseCard的构造函数和析构函数:

basecard
 PortA
 PortB
card
~card
 ~PortB
 ~PortA
~basecard

或者,您可以从PortA中取出PortBCard,并将所有三个成员放在包装内:

class CardWrapper {
    Card card;
    PortA mPA;
    PortB mPB;
};

答案 1 :(得分:1)

考虑明确地操纵它们,例如:

class Card
{
public:
    Card()      
    {
        cout << "card\n";
        mPA = new PortA;
        mPB = new PortB;
    }

    ~Card()     
    {
        delete mPB;
        delete mPA;
        cout << "~card\n"; 
    }


    PortA *mPA = nullptr;
    PortB *mPB = nullptr;
};

现在,如果你写这样的东西:

{
    Card c;
}

你会得到你想要的东西。

答案 2 :(得分:0)

我要做的是强大而明确的破坏。

我会在端口中定义一个destroy()方法,然后从卡的析构函数中调用它们。