我需要破坏一个类,首先在类本身之前调用成员的析构函数。 我知道破坏顺序通常是相反的顺序。但我在特殊情况下对此进行了讨论。
// 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
首先在卡片本身之前克隆端口。
答案 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
中取出PortB
和Card
,并将所有三个成员放在包装内:
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()
方法,然后从卡的析构函数中调用它们。