Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象将自身存储到数据库中 我是C++和QT的新手,我开发了一个简单的应用程序,它可以存储和获取数据库中不同类型的员工。我实现了一个层次结构,Employee是基类,然后我有三个不同的子类:月薪员工、小时薪员工和销售人员 我的同事告诉我一个好的解决方案是使用C++多态性:基类(Engress)(Engress)有一个虚拟方法,子类实现该方法,因此可以使用基类的指针来管理子类的所有实例,如下一个代码: Employee *e = new Salesman(name, salary, etc..); e->insert();_C++_Database_Qt - Fatal编程技术网

对象将自身存储到数据库中 我是C++和QT的新手,我开发了一个简单的应用程序,它可以存储和获取数据库中不同类型的员工。我实现了一个层次结构,Employee是基类,然后我有三个不同的子类:月薪员工、小时薪员工和销售人员 我的同事告诉我一个好的解决方案是使用C++多态性:基类(Engress)(Engress)有一个虚拟方法,子类实现该方法,因此可以使用基类的指针来管理子类的所有实例,如下一个代码: Employee *e = new Salesman(name, salary, etc..); e->insert();

对象将自身存储到数据库中 我是C++和QT的新手,我开发了一个简单的应用程序,它可以存储和获取数据库中不同类型的员工。我实现了一个层次结构,Employee是基类,然后我有三个不同的子类:月薪员工、小时薪员工和销售人员 我的同事告诉我一个好的解决方案是使用C++多态性:基类(Engress)(Engress)有一个虚拟方法,子类实现该方法,因此可以使用基类的指针来管理子类的所有实例,如下一个代码: Employee *e = new Salesman(name, salary, etc..); e->insert();,c++,database,qt,C++,Database,Qt,这是一个好的解决方案吗?我这样问是因为在大学里,老师们教我,为了把数据库的东西都放在一起,DAO模式更好。DAO类的问题是,我必须将Employee实例转换为子类,从而失去了很多灵活性。有了我同事的解决方案,代码就是一切,但在一起,我将有很多代码分散在很多类中,但我有更多的灵活性。哪一个是最好的方法 如果有更好的解决方案,我很乐意知道。我不确定我是否已经很好地理解了您的问题,但我会按照您同事的建议使用多态性。这并不一定意味着DAO的责任必须分散在您的程序中 例如: 在基本方法中,DAO类可以有静

这是一个好的解决方案吗?我这样问是因为在大学里,老师们教我,为了把数据库的东西都放在一起,DAO模式更好。DAO类的问题是,我必须将Employee实例转换为子类,从而失去了很多灵活性。有了我同事的解决方案,代码就是一切,但在一起,我将有很多代码分散在很多类中,但我有更多的灵活性。哪一个是最好的方法


如果有更好的解决方案,我很乐意知道。

我不确定我是否已经很好地理解了您的问题,但我会按照您同事的建议使用多态性。这并不一定意味着DAO的责任必须分散在您的程序中

例如: 在基本方法中,DAO类可以有静态方法来存储不同类型的雇员

static void StoreEmplyee(...) {...}
static void StoreSalesmen(...) {...}
然后在子类中,通过从DOA类调用正确的函数来覆盖insert函数

class Salesman(...) {
//...
void insert() override {
DOA::insertSalesman(this);
}
};
这样,数据库处理作为一项职责仍然保留在DOA类中,但是您可以从多态性中获得灵活性


另一个建议:既然“11标准C++提供智能指针”,我将使用那些.< /P> <代码>单责任原则声称对数据存储类和同一数据处理类进行划分总是好的。但是您不必同意

SOLID
。但是在这种特殊情况下,您可以在DAO之外使用多态性,并制作类似于
EmployerDbSerializer
的东西。这是处理这个问题的一个好方法。我能说的唯一“不好”的事情是,要做一些事情,我必须直接调用DAO(例如,从数据库获取所有销售人员的函数),而对于其他事情,我必须间接调用DAO,例如,首先调用函数insert()。不过它大大简化了我的代码。我明白你的问题。我认为employee->insert()对于您的解决方案来说是必要的(这就是我推荐此解决方案的原因)。如果没有,那么您应该简单地执行:DOA:insertsaller(e),其中e是指向要保存的对象的指针或引用。然后DOA:getListOfEmployees()将是获取所有员工的函数。关键的一点是要始终考虑谁的责任是您当前想要完成的,并在那里实现逻辑。如果我这样做,那么我将失去管理所有带有指向基类的指针的子类给我的所有灵活性,因为我需要分别处理每个实例(我的同事说我只调用一次Employee.insert()方法,并且由于多态性,调用了正确的方法)。这是一个非常(我认为)常见的问题,我从来没有被教过如何正确地解决它。我想你已经知道你需要知道什么:-)在存在“最佳”解决方案的地方,编码不是黑白的。有不同的方法/解决方案,有不同的权衡。作为设计师,你必须决定什么是值得的。也许在您的(小/大(?)项目中,多态性是一种方式,因为它降低了代码复杂性,即使这样的解决方案违背了可靠的原则。在我看来,“丑陋的工作”(为不同的子类创建插入)无论如何都必须在某个地方解决。您可以选择在employee类中执行,其他人可以在DOA中选择