首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >c++单例在父类中创建子类

c++单例在父类中创建子类
EN

Stack Overflow用户
提问于 2016-08-04 02:33:52
回答 1查看 355关注 0票数 0

在父类中创建子类实例有问题。

这里是单例(父类)的定义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.hpp
-------
#ifndef DB_HPP
#define DB_HPP

#include <string>
#include "mysqldb.hpp"

class Db
{
  public:
    static Db& instance()
    {
      // can be added other database implementations
      #ifdef DBMYSQL
        static Db *instance = new MySQLDb();
      #elseif DBORACLE
        //static Db *instance = new OracleDb();
      #endif
      return *instance;
    }

    virtual ~Db() {}
    virtual void Insert(std::string& query) = 0;
  protected:
    Db() {}
};
#endif // DB_HPP

这就是那个孩子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysqldb.hpp
-----------
#ifndef MYSQLDB_HPP
#define MYSQLDB_HPP

#include "db.hpp"
#include <mysql.h>

class MySQLDb : public Db
{
  public:
    virtual void Insert(std::string& query);

  private:
    MYSQL *MySQLConnection_;
    MySQLDb();
    ~MySQLDb();
};
#endif // MYSQLDB_HPP

在“MySQLDb”之前,我得到了错误的类型说明符。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
g++ -DDBMYSQL  `mysql_config --cflags` `mysql_config --libs` -DBOOST_LOG_DYN_LINK -std=c++11 -c -o mysqldb.o mysqldb.cpp

In file included from mysqldb.hpp:4:0,
             from mysqldb.cpp:1:
db.hpp: In static member functionstatic Db& Db::instance():
db.hpp:16:35: error: expected type-specifier before ‘MySQLDb’
     static Db *instance = new MySQLDb();
                               ^
Makefile:39: recipe for target 'mysqldb.o' failed

你知道怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-04 02:44:42

首先,您有一个循环依赖项(这是当前错误背后的原因):Db依赖于MySQLDb,依赖于Db,等等。

这很容易解决:在定义了"mysqldb.hpp"类之后包含Db头文件。然后将Db::instance的定义移出类之外,但请记住显式地标记它为inline。具有实现Db::instance函数的源文件,并且只在"db.hpp2"头文件中转发声明MySQLDb类,而不包括"mysqldb.hpp"文件。

这样做之后,您将遇到另一个问题,即MySQLDb构造函数是私有的,而Db类无法访问它。这可以通过使Db成为friend of MySQLDb来解决。

然而,所有这一切,循环依赖和使Db成为friend是一个糟糕的设计的标志,IMO。

相反,我可能会做一些事情,比如让Db成为一个纯抽象类,并将工厂函数移到其他地方。也许用模板。

单身和继承很少在一起玩得好。

此外,如果您希望具有多个同时连接,怎么办?也许是不同类型的数据库?那么不能使用单例模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38764949

复制
相关文章
Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
FatherA.__init__(self) # 在子类中调用父类的方法:父类名.方法名称(参数)
授客
2019/09/11
3.2K0
[python]父类、子类、子类实例属性
本文旨在说明 父类、子类、子类实例的属性继承关系: >>> A = type('A', (), {'name':1}) >>> B = type('B',(A,), {'addr':'beijing'})    #B的父类为A >>> A.__dict__ mappingproxy({'name': 1, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute
py3study
2020/01/19
1.9K0
【Python】面向对象 - 继承 ② ( 子类重写父类成员 | 子类调用父类重名成员 | 子类中使用 父类类名 调用父类成员 | 子类中使用 super 调用父类成员 )
子类 继承 父类的 成员属性 与 成员方法 后 , 如果对 继承的 父类成员 不满意 , 可以 重写 父类成员 ;
韩曙亮
2023/10/11
7890
【Python】面向对象 - 继承 ② ( 子类重写父类成员 | 子类调用父类重名成员 | 子类中使用 父类类名 调用父类成员 | 子类中使用 super 调用父类成员 )
在NHibernate的单表继承模式下通过父类Repository查询子类
在NHibernate中经常遇到继承与关系数据库的ORMapping的问题,我之前的一篇博客(http://www.cnblogs.com/studyzy/archive/2011/08/16/2140675.html)介绍了有3种常用的实现方式:
深蓝studyzy
2022/06/16
3610
java 父类 new 子类
父类: public class A {   public  void  say(){        System.out.println("Hello   A");   } } 子类: public class B extends  A{ public  void  say(){ System.out.println("Hello   B"); } public void sing(){ System.out.println("sing   hell
用户1220053
2018/02/09
2.5K0
C++ Trick:小心,子类隐藏父类成员函数
学习面向对象的语言,了解继承是必不可少的。您可能觉得这太基础了,大家可都是老“996”了,还用介绍封装、继承、多态那老三样吗?
果冻虾仁
2021/12/08
1.8K0
子类继承父类,父类的初始化
含有自变量的构建器 上述例子有自己默认的构建器;也就是说,它们不含任何自变量。编译器可以很容易地调用它们,因为不存 在具体传递什么自变量的问题。如果类没有默认的自变量,或者想调用含有一个自变量的某个基础类构建 器,必须明确地编写对基础类的调用代码。这是用 super 关键字以及适当的自变量列表实现的,如下所示:
秋白
2019/02/21
1.9K0
golang继承——接口父类子类
从面向对象的角度上看,总会有一些使用子类不想做,希望父类去做的事情,在java这样的纯面向对象的语言中,方法就是使用父类和子类,子类通过继承父类的方法,实现子类自己的属性,如果没有某个方法没有经过子类重写,那么这个方法通过子类调用时,就会调用父类的方法。
Java架构师必看
2021/05/14
4.6K0
java父类引用指向子类对象好处_java子类调用父类属性
Java之所以引入多态的概念,原因之一就它在类的继承上的问题和C++不同,后者允许多继承,这确实给其带来了非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,势必在功能上有很大的限制,所以,Java引入多态性的概念以弥补这点不足,此外,抽象类和接口也是解决单继承规定限制的重要手段.同时,多态也是面向对象编程的精髓所在.
全栈程序员站长
2022/11/03
1.3K0
创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法?
问题:为什么创建A对象的时候父类会调用子类方法? 但是:创建B对象父类会调用父类的方法?
zhangheng
2020/04/28
6.3K0
Java父类强制转换子类原则
最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了。 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗? 来看下面这段程序: public class TestObjectConvert { public static void main(String[] args) { test1(); test2(); } private static void test1() { F
Java技术栈
2018/04/02
2.3K0
Java父类强制转换子类原则
Golang语言--子类调用父类函数
例子:
李海彬
2018/03/21
2.2K0
Golang语言--子类调用父类函数
禁止 Python 子类覆盖父类方法
当子类试图覆盖父类的时候,可以通过类型标注来发出警告。今天,我们来讲讲如何直接禁止覆盖。
用户9239730
2021/11/30
1.8K0
Python实现子类调用父类方法
这是因为尽管Student类继承了Person类,但是并没有调用父类的__init__()方法,那么怎样调用父类的方法呢? 有如下两种解决方案:
用户2936342
2018/08/27
3.1K0
子类赋值父类的赋值兼容
C++ 中,类型的匹配检测是非常严格的,但是你会发现一个现象,如果一个类继承了另外一个类,把子类的对象赋值给父类的时候,系统不但不提示错误,而且程序还能顺利的编译通过并运行。这其实就是 C++ 内部提供的赋值兼容的过程,但是要注意,如果子类数据成员比父类多,则会出现数据截断。具体表现形式如下图:
我与梦想有个约会
2023/10/20
1960
子类赋值父类的赋值兼容
Java中类的加载机制---父类和子类的多态调用
上面程序最大的难点,也是最重要的地方就是:在父类的构造函数中调用了虚函数,并且这个函数被子类重载了
wust小吴
2019/07/08
2.8K0
Groovy: 创建一个单例类
在Groovy中创建单例类很简单。 我们只需要使用@Singleton转换注释,并为我们生成一个完整的单例类。
白石
2019/08/29
1.5K0
PHP 子类重写父类成员详解 overwrite
致命错误:用户::$name的访问级别必须是public(如在class Base中),位于E:\www\1.php的第15行
很酷的站长
2023/02/03
2K0
子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?
父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数
用户9854323
2022/06/25
2.2K0
点击加载更多

相似问题

在C++中创建单例类实例

26

单例类的子类必须是单例类吗?

26

C++难以在单例类中创建类实例

10

创建单例类的子类有什么好处?

11

防止单例类的子类调用单例类的构造函数

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文