Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++;在PHP中使用类似的特性 我正在寻找一个解决方案,如何定义C++中类似于PHP的可重用代码。_C++_Oop_Traits - Fatal编程技术网

C++;在PHP中使用类似的特性 我正在寻找一个解决方案,如何定义C++中类似于PHP的可重用代码。

C++;在PHP中使用类似的特性 我正在寻找一个解决方案,如何定义C++中类似于PHP的可重用代码。,c++,oop,traits,C++,Oop,Traits,问题描述: 我有三个类(Class、Customer、Admin),每个类有时必须执行相同的操作,如插入新的子类、添加新地址或添加新类(与update和remove操作相同)。我希望避免在每个类中再次开发这些函数 此外,如果这些函数与类“product_name”分离,我会非常高兴。我不想将所有这些函数都写到类“product\u name”或“product”中,因为否则该类对于太多的函数来说会变得太混乱 编辑 类“product_name”的名称是我的产品的占位符。目前我不知道我的产品名称:

问题描述: 我有三个类(Class、Customer、Admin),每个类有时必须执行相同的操作,如插入新的子类、添加新地址或添加新类(与update和remove操作相同)。我希望避免在每个类中再次开发这些函数

此外,如果这些函数与类“product_name”分离,我会非常高兴。我不想将所有这些函数都写到类“product\u name”或“product”中,因为否则该类对于太多的函数来说会变得太混乱

编辑
类“product_name”的名称是我的产品的占位符。目前我不知道我的产品名称:)。父类“product”是我将来要开发的所有产品的集合点。我创建了这个类,因为我想使用单点登录和相同的用户数据库。。。所以我只能开发这些部件一次

我的愿望的类图:

C++与PHP在许多方面不同。这就是如何在C++中设计域驱动的DAO的方法。p> 此示例使用库进行数据库连接。您可以将任何其他库用于同一建议

enum class Role {
   ADMIN,
   CUSTOMER,
   SCHOOL_ACCOUNT
}

class User {
protected:
  constexpr User(Role role) noexcept:
    role_(role)
  {}
public:
  User(const User&) = delete;
  User& operator=(const User&) = delete; 
  Role role() const noexcept {
   return role_;
  }
  virtual const char* id() const = 0;
  virtual ~User() = 0;
private:
  Role role_;
};

User::~User() 
{} 

class MyIDGenerator {
public:
  static std::string generate() {
    static POCO::UUIDGenerator gen;
    return gen.create().toString();
  }
};

class Customer final: public User  { 
public:
    Customer() noexcept:
       User(Role.CUSTOMER),
       id_(  MyIDGenerator::generate() ) 
    {} 
    virtual const char* id() const override
    {
      return id_.data();
    }
    virtual ~Customer() override
    {}
private:
   std::string id_;
}
...
// define your Admin and School
...
class Product {
 public:
 Product():
   id_( MyIDGenerator::generate() )
 {} 
 void insertUser(const User* user, const Poco::Data::Session& session) {
  // execute your SQL hire i.e. something like
  POCO::Data::Statement insert(session);
  insert << "insert into product_allowed_user values(?,?) << use(id_) << use(user->id());
  insert.execute(); 
 }
 private:
   std::string id_;
}
enum类角色{
管理
顾客
学校户口
}
类用户{
受保护的:
constexpr用户(角色)无例外:
角色(角色)
{}
公众:
用户(const User&)=删除;
用户和运算符=(const User&)=删除;
Role Role()常量noexcept{
返回角色;
}
虚拟常量char*id()常量=0;
virtual~User()=0;
私人:
角色!;
};
用户::~User()
{} 
类MyIDGenerator{
公众:
静态std::string generate(){
静态POCO::UUIDGener;
返回gen.create().toString();
}
};
类Customer final:公共用户{
公众:
客户()无例外:
用户(角色.客户),
id(MyIDGenerator::generate())
{} 
虚拟常量char*id()常量重写
{
返回id.data();
}
虚拟客户()覆盖
{}
私人:
std::字符串id;
}
...
//定义你的管理员和学校
...
类产品{
公众:
产品():
id(MyIDGenerator::generate())
{} 
void insertUser(常量用户*用户,常量Poco::数据::会话和会话){
//执行SQL雇用,例如
POCO::Data::语句插入(会话);

插入我不确定我是否理解您的继承。为什么“客户”是“产品名称”或“学校”?或者为什么“产品名称”应该是“产品”?也许如果您有一个通用的“产品”类,然后有一个更具体的“名称产品”用于有名称的产品?我仍然看不到继承到“客户”、“管理员”和“学校”C++支持,所以你不需要任何特性或混合等。在这里,我编辑了我的文章,希望你能理解我的方法……VistoGuBin或者更具体地说,特性、混合、接口等都是C++中的类类型,并且用“代码>类< <代码>或<代码>结构> /代码>来声明,而这并不重要。我爱你use@Caleth我如何使用traits?这里的
角色
枚举的目的是什么?
virtual~User()=0;
你不是说
virtual~User()=default;
?为什么
std::string id_uu2;
virtual const char*id()const;
?您没有UUID类型吗?为什么不使用一个自由函数
UUID GeneratorUID(){static POCO::UUIDGenerator gen;return gen.create()}
?或者只使用一个命名空间范围
POCO::UUIDGenerator
?这是一个示例,可以使用UUID或uint64\t或其他任何东西。