“默认定义将被形成不良”是什么意思?

11

我是C++的初学者,试图创建一个对象,但是出现了错误,我不明白哪里出了问题。这是我的hpp文件和cpp文件,在出现错误时:

Manager::Manager(const Manager &manager ) :
Worker(manager.name,manager.id,manager.salary){
   this->workers=manager.workers;
}

class Manager:public Worker {
    private:
    std::vector<Worker> workers;         
    public:
        Manager(const char* name, int id, int salary);
        Manager(const Manager &manager );      
};

错误:

In file included from Manager.hpp:5:0,
                 from Manager.cpp:1:
Worker.hpp:7:7: note: ‘Worker& Worker::operator=(const Worker&)’ is implicitly deleted because the default definition would be ill-formed:
 class Worker{

但是当我这样做时它起作用:

Manager::Manager(const Manager &manager ) :
    Worker(manager.name,manager.id,manager.salary), workers(manager.workers){
               }

有人能告诉我为什么吗?


编辑:

这是工作者类的代码:

这是worker.hpp

  class Worker{
        protected:
            const std::string name;
            const int id;
            int salary;

        public:
            Worker(const std::string& name, int id, int salary);
            Worker(const Worker& worker );
    };

这是worker.cpp:

#include "Worker.hpp"

Worker::Worker(const std::string &names, int ids, int salarys) :
name(names), id(ids), salary(salarys)
{
}

Worker::Worker(const Worker &worker): 
name(worker.name), id(worker.id), salary(worker.salary)
{

}

Worker::~Worker() {

}

std::string Worker::toString(){
    std::string s="Worker id:" + id ;
    return s;
}
1个回答

8

编译器生成的默认赋值运算符会为每个字段执行赋值操作。如果其中一个字段被标记为const或者无法复制,则编译器将无法发出赋值操作符。最可能的情况是您在问题中发布的Worker类包含一个或多个这样的字段。

请注意,调用this->workers=manager.workers;将调用每个存储在worker中的Worker的复制赋值运算符,而调用workers(manager.workers)将调用复制构造函数,这是明确定义的。


嘿,感谢您的快速回答,我添加了工作类代码。我仍然不明白为什么会出现这个错误。 - Elior Sastiel
1
@EliorSastiel 你将 name 声明为 const std::string name;,因此在构造函数初始化后无法对其进行赋值。这与 const int x(25); x = 85; 是相同的情况。 - user7860670
1
@Jake 我没有 operator= - Elior Sastiel
是的,您需要实现该运算符。这将解决那个问题。 - Jake
@Jake 无法实现,因为类不可复制。而且也没有必要,因为 workers(manager.workers) 可以正常工作,应该优先考虑使用它。 - user7860670
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接