C++
夜风里唱
这个作者很懒,什么都没留下…
展开
-
C++:什么情况下函数应该声明为纯虚函数
这是因为当删除一个指向派生类的基类指针时,会首先调用派生类的析构函数,然后调用基类的析构函数。因此,即使析构函数是纯虚函数,也需要在基类中提供一个实现(可以是空的)。:当你希望定义一个基类,该基类不能被实例化,只能作为其他类的基类时,你应该在基类中声明至少一个纯虚函数。这样的基类被称为抽象基类。纯虚函数通过在函数声明后添加 “= 0” 来定义,表示该函数在基类中没有实现,派生类必须提供实现。:如果你希望所有派生类都实现某个特定功能,而该功能在基类中没有意义或无法提供通用实现,你应该将该功能声明为纯虚函数。原创 2024-03-16 00:07:20 · 461 阅读 · 0 评论 -
C++:基类中的函数什么情况下声明为虚函数
如果你正在设计一个类层次结构,并希望它在未来是可扩展的,即使现在某些函数在基类中没有实际的实现或只提供了默认实现,也应该考虑将它们声明为虚函数。虚函数会带来一些开销,包括在对象中添加虚函数表指针,以及通过虚函数表进行动态分派的时间开销。另外,要注意的是,构造函数不能被声明为虚函数,因为虚函数机制依赖于对象已经存在并包含了虚函数表指针,而构造函数正是在对象创建过程中被调用的。:如果你预计派生类可能需要提供自己的实现,或者改变基类函数的行为,那么基类中的该函数应该被声明为虚函数。原创 2024-03-16 00:00:20 · 481 阅读 · 0 评论 -
C++: 析构函数应该被声明为虚析构函数的情况
这是因为如果基类的指针指向派生类的对象,并且该基类的析构函数不是虚析构函数,那么当删除这个基类指针时,只有基类的析构函数会被调用,而派生类的析构函数则不会被调用,这可能会导致资源泄露或未定义行为。通过声明虚析构函数,可以确保当基类指针被删除时,正确的析构函数(即派生类的析构函数)会被调用。然而,如果一个类不准备作为基类使用,或者确定不会有基类指针指向派生类对象的情况,那么将析构函数声明为虚析构函数可能并不是必要的。此时,将析构函数声明为虚析构函数可以确保正确的析构顺序。原创 2024-03-15 23:48:33 · 444 阅读 · 0 评论 -
C++接口的含义
看以下代码:```cpp#include <iostream>#include <stdlib.h>using namespace std;class Interface{public: Interface() {} virtual ~Interface() {} virtual void Test() = 0;};class TT :public Interface{public: TT() {} ~TT() {} virtual void T原创 2021-09-06 21:02:29 · 1140 阅读 · 3 评论 -
UML关系C++表示:依赖与关联(聚合与组合)
程序员过了三十岁后,心里都会有“三十五岁”危机,即很多公司招聘研发人员基本不考虑超过三十五岁的研发人员,过来三十岁后,心里就会有焦虑,就得开始考虑以后的出路。研发人员的职业发展一方面与自身能力相关,一方面也受在职的单位的影响。...原创 2021-07-03 16:10:37 · 1337 阅读 · 0 评论 -
设计模式:创建者模式
#include <iostream>using namespace std;class Builder{public: Builder() {}; virtual ~Builder() {}; virtual void BuilderPartA() = 0; virtual void BuilderPartB() = 0;};class Director{public: Director(Builder *pBuilder) :m_pBuilder(...原创 2021-07-03 13:43:17 · 127 阅读 · 1 评论 -
A类的成员对象B调用A类的成员函数方法(3)
方法:与方法2相同,但使用智能指针传递father的this指针client.hclass base:public std::enable_shared_from_this<base>{public: base() {} virtual ~base() { } virtual void doSomething() = 0;};class client{public: client(const std::shared_ptr<base> &p)原创 2021-06-29 10:19:59 · 404 阅读 · 0 评论 -
A类的成员对象B调用A类的成员函数方法(2)
1. 基于Boostshared_ptr<boost::thread> threadPtr;threadPtr = make_shared<boost::thread>(std::bind(&CClassName::ClassThread, this, this));原创 2021-06-28 23:45:45 · 475 阅读 · 0 评论 -
A类的成员对象B调用A类的成员函数方法(1)
father.h头文件#pragma once#include <memory>#include <iostream>#include "client.h"class father{public: father() { } ~father() { } void init() { m_clientPtr = std::make_shared<client>(this); m_clientPtr->test(); } void原创 2021-06-28 23:28:32 · 640 阅读 · 0 评论 -
利用虚函数实现成员对象对父对象的回调
利用虚函数实现成员对象对父对象的回调:#include <iostream>class NetListen{public: virtual void OnReceiver(int data) =0;};class NetClient{public: NetClient(){}; ~NetClient(){}; void Init(NetListen* listener){ m_listener = listener;.原创 2021-03-16 23:43:08 · 232 阅读 · 0 评论 -
fstream文件读写操作
fstream文件读写操作#include <fstream>using namespace std;int main(){ // 文件读写操作 ifstream file_in; ofstream file_out("./out.html"); string txt; file_in.open("./index.html", std::ios::in); if (file_in.is_open() &&原创 2021-01-17 21:59:06 · 550 阅读 · 0 评论 -
如何处理C++工程中的C风格代码
2. 避免使用printf(),sprintf(), gets()等1. printf()该函数需要一系列无类型参数,是类型不安全的3. 使用标准库的容器代替C风格的数组C的写法:int array[5] = {1,2,3,4,5};缺点:1. C数组在程序中只能作为指向首元素的指针被传递,由于是指针,存在不安全性问题2. C数组及其大小没法形成一个聚合的单元,传递数组时没法知道知道其大小C++的写法:std::array<int, 5> array{1,2.原创 2020-08-30 19:05:59 · 489 阅读 · 0 评论 -
关于fopen与fwrite的追加模式澄清
C函数fopen中可对打开的文件设置多种读写模式,需要说明下fwrite的追加模式是怎么回事,网上很多文章都说的不清不楚,只说a是追加,w不能追加,其实很多误解,这里需要澄清:w:表示fopen文件时会清空掉原文件(如果存在)的信息,并重新写入,在不fclose文件的情况下,多次fwrite也是追加写入到文件末尾的,不会覆盖之前fwrite的内容。a:表示fopen文件时会保留原文件(如果存在)的信息,并追加到末尾写入,每次fwrite写入到文件末尾。其他说明:w: 文本写入,只写w+:可读可写.原创 2020-08-03 23:03:14 · 13017 阅读 · 1 评论 -
VS2015源代码中文编码问题
VS2015中文版对文件的默认编码格式为 GB2312中文系统中控制台的的默认编码格式为GBK(包含及兼容GB2312)因此在VS2015中文版的cpp文件中输出printf("中文")在控制台输出中不会乱码,但如果cpp文件是以utf-8编码格式编辑并保存的,编译生成后,在控制台中输出会乱码,如下所示:...原创 2020-03-13 19:26:06 · 3289 阅读 · 0 评论 -
QT disconnect
disconnect() 等同于disconnect(this, 0, 0, 0), 删除作为信号的this与任何槽的关联disconnect(receiver) 等同于disconnect(this, 0, receiver, 0), 删除this与作为槽的receiver的关联object->disconnect() 即object->disconnect(object->...原创 2019-11-19 12:15:28 · 2331 阅读 · 1 评论 -
boost asio用法总结(自用)
参考文章https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html1. 头文件目录L:\boost_1_53_02.头文件#include <boost/asio.hpp>#include <boost/thread.hpp&g...原创 2019-10-13 21:01:38 · 1682 阅读 · 0 评论