【问题标题】:Peculiar behavior of nested class pointers?嵌套类指针的特殊行为?
【发布时间】:2017-01-24 21:27:17
【问题描述】:

我正在使用 mysql-conntector++,我对指针类型的一些行为感兴趣,例如:

sql::Driver *driver__; 

sql::Connection *connection__;

当我尝试在堆上初始化这些指针中的任何一个时,显然::Driver::Connectionsql 的嵌套类:

sql::Driver *driver__ {new sql::Driver()};

错误:

error: invalid new-expression of abstract class type ‘sql::Driver’
    sql::Driver *driver__ {new sql::Driver()};

库如何使用嵌套类和指向此类类的指针来实现这种类型的行为?

我查看了 mysql-connector++ 源代码,似乎无法识别相关部分。

注意,上述错误是使用带有-std=c++14的CMake产生的

【问题讨论】:

  • 我不知道mysql-connector++,但似乎sql::Driver 是一个抽象类(至少有一个纯虚函数),所以你不能创建它的实例。这对于一般的类都是如此,无论它们的范围如何。
  • 显然库创建了派生类的对象,并使用指针向上转换(这是隐式的)将指针存储在sql::Driver*中。
  • 如果程序被编译,变量名driver__会导致程序有未定义的行为,因为这个名字是为实现保留的。你应该想出另一个变量名。

标签: c++ pointers heap-memory mysql-connector


【解决方案1】:

库如何使用嵌套类和指向此类类的指针来实现这种类型的行为?

抽象类的具体实例仅作为基类子对象存在。实现这些的方法是继承:

struct MyDriver : sql::Driver {
    //TODO implement all pure virtual functions of sql::Driver
}

// imaginary implementation
Driver* get_driver_instance() {
    static MyDriver instance;
    return &instance;
}

PS。 Driversql(命名空间?)的成员这一事实对用户来说并不重要,除了它影响名称查找的方式。

【讨论】:

    【解决方案2】:

    其实,当你声明时

    sql::Driver *driver__;
    sql::Connection *connection__;
    

    您声明对实现以下接口的实例的引用:

    • SQL 驱动程序
    • SQL 连接

    为了实例化这样的实例,库以这种方式为您提供工厂

    driver__ = get_driver_instance();
    connection__ = driver->connect("tcp://127.0.0.1:3306", "root", "root");
    

    一旦实例化,您将只操作此类实例的公共接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-10
      • 2019-05-25
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 2013-02-11
      相关资源
      最近更新 更多