"Call to implicitly deleted default constructor of "错误



我不断收到三个错误,它们都与"调用隐式删除的默认构造函数____"有关。有人知道为什么会这样吗?

/Users/vivekreddy/Desktop/Vivek/School/Spring2016/CS32/项目3/项目3/Player.cpp:114:18:调用隐式删除的"BadPlayerImpl"默认构造函数

#include "provided.h"
#include <iostream>
#include <string>
using namespace std;

class HumanPlayerImpl:public Player
{
  public:
    virtual bool isInteractive() const { return true;};
    int chooseMove(const Scaffold& s, int N, int color);
};
class BadPlayerImpl: public Player
{
  public:
    int chooseMove(const Scaffold& s, int N, int color);
};
class SmartPlayerImpl: public Player
{
  public:
    virtual bool isInteractive() const { return true;};
    int chooseMove(const Scaffold& s, int N, int color);
};


//implementations

//put virtual in front of implementations only or declarations here as well?

int HumanPlayerImpl::chooseMove(const Scaffold& s, int N, int color)  //goal is to get N in a row, return the column necessary to put the checker so we could do that.  otherwise return -1.  can make the column be arbitrary
{
    //algorithm is inputting N so maybe don't need this check?
    if (N>s.cols()||N<=0) {
        cout<<"Enter a number within the valid range of columns you specified";
        return -1;
    }
    if(s.numberEmpty()==0)
    {
        return -1;
    }
    int columnnum;
    while (columnnum<=s.cols()||columnnum<=0) {
        cout<<"Enter column number of your move";
        cin>>columnnum;
        if (columnnum<=s.cols()) {
            return columnnum;
        }
        cout<<"Column number not valid ";
    }
    return -1; //OK?
}
int BadPlayerImpl::chooseMove(const Scaffold& s, int N, int color)
{
    if ((N>=s.cols()&&N>=s.levels())||N<=0) { //make sure this works
        cout<<"Enter a number within the valid range of columns you specified";
        return -1;
    }
    for (int j=0; j<s.cols();j++) {
        if (s.checkerAt(j,0)==VACANT) { 
            return j;
        }
    }
    return -1; //see if this OK
}
int SmartPlayerImpl::chooseMove(const Scaffold& s, int N, int color)
{
    return -1;  //  This is not always correct; it's just here to compile
}
//******************** Player derived class functions *************************
// These functions simply delegate to the Impl classes' functions.
// You probably don't want to change any of this code.
HumanPlayer::HumanPlayer(string nm)
 : Player(nm)
{
    m_impl = new HumanPlayerImpl;  //error is here
}
HumanPlayer::~HumanPlayer()
{
    delete m_impl;
}
int HumanPlayer::chooseMove(const Scaffold& s, int N, int color)
{
    return m_impl->chooseMove(s, N, color);
}
BadPlayer::BadPlayer(string nm)
 : Player(nm)
{
    m_impl = new BadPlayerImpl;  //error is here 
}
BadPlayer::~BadPlayer()
{
    delete m_impl;
}
int BadPlayer::chooseMove(const Scaffold& s, int N, int color)
{
    return m_impl->chooseMove(s, N, color);
}
SmartPlayer::SmartPlayer(string nm)
 : Player(nm)
{
    m_impl = new SmartPlayerImpl;  //error is here 
}
SmartPlayer::~SmartPlayer()
{
    delete m_impl;
}
int SmartPlayer::chooseMove(const Scaffold& s, int N, int color)
{
    return m_impl->chooseMove(s, N, color);
}

下面是我对类Player的声明,它是基类:

class Player
{
  public:
    Player(std::string nm) : m_name(nm) {}
    virtual ~Player() {};
    std::string name() const { return m_name; };
    virtual bool isInteractive() const { return false; }
    virtual int chooseMove(const Scaffold& s, int N, int color) = 0;
      // We prevent any kind of Player object from being copied or assigned by
      // making the copy constructor and assignment operator unavailable in
      // the base class (and thus in any derived class).
    Player(const Player& other) = delete;
    Player& operator=(const Player& other) = delete;
  private:
    std::string m_name;
};

因为您在基类中声明了构造函数,特别是Player::Player(std::string nm),所以编译器不可能为子类提供隐式默认构造函数,因为父类Player不能首先默认构造。

要么在子类中提供构造函数,要么继承基类(C++11)的构造函数。例如:

BadPlayerImpl::BadPlayerImpl(std:string nm)
  : Player(nm)
{
   ...
}

这很可能是因为在代码的某个地方,您正在复制构造或分配给BadPlayerImpl的实例,并且显式删除了其超类的复制构造函数和赋值运算符。

默认构造函数通常是自动为类创建的,但有关于何时不创建的规则(比如创建另一个构造函数时)。当您有"//error is here"时,您正在调用一个子类的默认构造函数,该构造函数将调用基类的默认构造函数(在本例中,不存在)。

相关内容

最新更新