没有可行的重载'='和继承
Posted
技术标签:
【中文标题】没有可行的重载\'=\'和继承【英文标题】:no viable overloaded '=' and inheritance没有可行的重载'='和继承 【发布时间】:2021-11-05 06:22:29 【问题描述】:我有以下类结构,但是当我构建时,我不断收到错误:
error: no viable overloaded '='
p1 = new HumanPlayer();
~~ ^ ~~~~~~~~~~~~~~~~~
../Test.cpp:14:7: note: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'HumanPlayer *' to 'const Player' for 1st argument; dereference the argument with *
class Player
^
1 error generated.
class Player
public:
void getMove(int player)
cout << "Get move" << endl;
;
class HumanPlayer: public Player
public:
void getMove(int player)
cout << "Get Human move \n";
;
class MyClass
public:
int mode;
Player p1;
MyClass()
mode = 0;
cout << "Choose a mode: \n";
cin >> mode;
switch (mode)
case 1:
p1 = new HumanPlayer();
break;
default:
break;
p1.getMove(0);
;
int main()
MyClass c;
return 0;
我尝试将Player p1;
更改为Player* p1;
并将p1.getMove
更改为p1->getMove
,但它无法正常工作。它打印了Get move
而不是Get Human move
。
【问题讨论】:
new
返回一个指针。在第二种情况下,getMove 没有标记为virtual
,因此它不是多态的。
构造函数应该对对象进行简单和基本的初始化。它不应该做一些高级的事情,比如终端输入和输出。最好把它留给其他功能。
我怀疑您一直在使用其他一些语言进行编程,其中new
是您创建对象的方式。 C++ 不是那些语言。获取good book 并阅读有关多态性的信息。
是的,我一直在使用 Java,并且对 C++ 很陌生(因此使用了new
)
【参考方案1】:
如上所述
p1 = new HumanPlayer();
如果 p1 被声明为指针,则有效,与 java 不同,您可以在 c++ 中使用和不使用 new 关键字进行赋值...
在您的情况下,将 p1 声明为指针即可
Player* p1nullptr;
以后
p1 = new HumanPlayer();
【讨论】:
谢谢。我还必须使父方法virtual void getMove(int player)=0;
使其工作。以上是关于没有可行的重载'='和继承的主要内容,如果未能解决你的问题,请参考以下文章