求大神帮忙看看关于这个类的构造函数该如何改

求大神帮忙看看关于这个类的构造函数该怎么改。


class WarSystem
{
public:
WarSystem();
void PrintSoldiers();
void startWar();
        void startRound();
public:
Soldier *pGroupA[3];
Soldier *pGroupB[3];
};
WarSystem::WarSystem()
{
Soldier A1("A1"),B1("B1");
Wizard  A2("A2"),B2("B2");
Master  A3("A3"),B3("B3");
pGroupA[0]=&A1;
pGroupA[1]=&A2;
pGroupA[2]=&A3;
pGroupB[0]=&B1;
pGroupB[1]=&B2;
pGroupB[2]=&B3;
}
求解一下,新手第一次写关于指针的构造函数,这样写貌似问题很严重。没办法构造

------解决方案--------------------
A1,A2……等都是局部变量,构造函数执行完成后就被析构。而pGroupA和pGroupB是类成员变量,与WarSystem的对象生存期相等。于是,构造函数执行完成后,pGroupA和pGroupB中的六个指针全都指向失效的对象,自然不会正常。

至于如何修改,那要取决于你的程序逻辑是什么。最简单的修改方法就是不使用指针:

class WarSystem
{
public:
WarSystem();
void PrintSoldiers();
void startWar();
void startRound();
public:
Soldier pGroupA[3];
Soldier pGroupB[3];
};
WarSystem::WarSystem()
{
Soldier A1("A1"),B1("B1");
Wizard  A2("A2"),B2("B2");
Master  A3("A3"),B3("B3");
pGroupA[0]=A1;
pGroupA[1]=A2;
pGroupA[2]=A3;
pGroupB[0]=B1;
pGroupB[1]=B2;
pGroupB[2]=B3;
}

------解决方案--------------------
不要返回/保存局部对象的指针或引用。
------解决方案--------------------
如果一定要使用指针,那么就需要在构造函数中new,在析构函数中delete,并且要禁止或重写拷贝构造函数、拷贝赋值操作符:


class WarSystem
{

public:
WarSystem();
~WarSystem();//增加析构
void PrintSoldiers();
void startWar();
void startRound();
public:
Soldier *pGroupA[3];
Soldier *pGroupB[3];
private:
  WarSystem( WarSystem const & );//禁止拷贝构造
  WarSystem & operator = ( WarSystem const & );//禁止拷贝赋值
};
WarSystem::WarSystem()
{
std::fill(&pGroupA[0], &pGroupA[3], 0 );
std::fill(&pGroupB[0], &pGroupB[3], 0 );

Soldier A1("A1"),B1("B1");
Wizard  A2("A2"),B2("B2");
Master  A3("A3"),B3("B3");
pGroupA[0]=new Soldier ("A1");
pGroupA[1]=new Wizard ("A2") ;
pGroupA[2]=new Master("A3") ;
pGroupB[0]=new Soldier ("B1");;
pGroupB[1]=new Wizard ("B2") ;;
pGroupB[2]=new Master("B3")  ;
}

WarSystem::~WarSystem()
{
for( int i = 0; i < 3; ++ i)
{
  if(pGroupA[i])
  {
     delete pGroupA[i];
  }
}
for( int i = 0; i < 3; ++ i )
{
  if(pGroupB[i])
  {
    delete pGroupB[i];
  }
}
}