没有可行的重载'='和继承

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-&gt;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; 使其工作。

以上是关于没有可行的重载'='和继承的主要内容,如果未能解决你的问题,请参考以下文章

自定义类没有可行的重载运算符 []

类型匹配没有可行的重载运算符

即使我重载了赋值,也没有可行的重载'='错误

没有可行的重载'='用于将std :: function回调赋值为成员函数

重载和重写的区别

逆向第十九讲——类继承和成员类运算符重载模板逆向20171211