【问题标题】: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

标签: c++ eclipse inheritance reference


【解决方案1】:

如上所述

p1 = new HumanPlayer();

如果 p1 被声明为指针,则有效,与 java 不同,您可以在 c++ 中使用和不使用 new 关键字进行赋值...

在您的情况下,将 p1 声明为指针即可

Player* p1{nullptr};
 

以后

p1 = new HumanPlayer();

【讨论】:

  • 谢谢。我还必须使父方法virtual void getMove(int player)=0; 使其工作。
猜你喜欢
  • 2014-10-12
  • 1970-01-01
  • 2015-12-25
  • 2017-01-07
  • 2011-02-27
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多