首页 > 编程语言 >C++ 易踩坑总结以及小技巧

C++ 易踩坑总结以及小技巧

时间:2024-10-17 14:24:34浏览次数:7  
标签:总结 enable 技巧 C++ ClassName 编译 参数 模板 构造函数

1. for循环中在栈上创建的对象可能具有相同的地址,进行指针操作时需注意;所以循环中最好使用new来创建指针并操作地址;

for (int x : arr) {
	ClassName obj(); \\ it is like to have the same address in every loop
	ClassName obj2 = new ClassName();
	std::cout<<&obj<<std::endl;
}

2. 模板函数的声明与定义最好放到同一个头文件中,否则会出现编译时没有正确找到symbol的错误。

image

3. 对于&等运算符的类外重写最好添加inline,否则可能会出现duplicate symbol的编译错误;

3. 指向子类对象的父类指针无法直接访问子类新添加的成员,但是可以在原本就有的函数中重写此函数来达到间接访问;

#include <iostream>

class Base {
public:
    virtual void func() {
        std::cout << "Base function" << std::endl;
    }
};

class Derived : public Base {
public:
    void func() override {
        std::cout << "Derived function" << std::endl;
        newMember(); // 在重写函数中访问子类的新成员
    }

    void newMember() {
        std::cout << "New member function of Derived" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    basePtr->func(); // 输出 "Derived function" 和 "New member function of Derived"
    delete basePtr; // 清理内存
    return 0;
}

5 enable_if/enable_if_t

https://www.luozhiyun.com/archives/744

6.为模板参数提供多种构造函数返回方案,编译报错

image
因为在这里,我为模板参数EDGEIT根据成员变量的不同设置了多个构造方法,以期望我对于模板参数EDGEIT的不同实际类针对返回,比如对于类1,定义为有四个参数的构造函数,对于类2定义为有五个参数的构造函数,期望他们就会对应进行选择。
然而在编译过程中,对于每个构建的类都会尝试每个分支的可能性,比如对于类1会尝试三四五所有的分支构造,因为这里是模板参数,我们要使得所有传进来的类都能满足这个参数所做出的所有行为。所以这样的方式是错误的。正确的做法应该是根据参数的不同启用不同的模板函数,即使用std::enable_if这样的
SFINAE技术。

标签:总结,enable,技巧,C++,ClassName,编译,参数,模板,构造函数
From: https://www.cnblogs.com/fireinstone/p/18459055

相关文章

  • 终于整理完了,全网最全JAVA面试八股文总结!
    1、Java线程具有五中基本状态(1)新建状态(New):当线程对象对创建后,即进入了新建状态,如:Threadt=newMyThread();(2)就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是......
  • 为何选择 C++:深入剖析其优势与适用场景
    在众多编程语言的璀璨星空中,C++以其独特的魅力和强大的功能闪耀着独特的光芒。对于许多编程学习者和开发者来说,选择C++作为学习或应用的语言,往往有着诸多深刻的原因。一、强大的性能与效率C++是一种高效的编程语言,它直接操作硬件资源,能够生成高度优化的代码。这使得它在......
  • 凤凰架构总结
             重温了一遍周志明老师的《凤凰架构》,一方面是加深记忆一下里面的知识点,另外就是做个记录总结,方便后面忘记了在看。      全书一共有十六个章节,每个章节都相对独立又和后文有些关系。个人总结主要是围绕着微服务、架构演进以及容器编排等......
  • SQL语句——日期题目总结
    第一题:查询本周考试的学生成绩。 DATA_ADD()语法:date就是要操作的日期,INTERVAL就是要间隔的日期expr可以写数字,unit用来写单位,比如DATE_ADD(CURDATE(),INTERVAL7DAY)就是当前日期加上一星期。CURDATE()就是当前日期,格式:DATE_ADD(date,INTERVALexprunit)代码解释:就......
  • opencv yolo11 onnx c++代码
    1.exportonnx,opset我设置的是12,其它值或许也可以2.opencv使用的4.10【其他版本或许也可以,4.7.0版本是不行的】3.代码核心参考yolo之前版本的实现即可。 model.setInput(blob);model.forward(outputs,outnames);constintdimensions=84;constintrows=......
  • Selenium 进阶技巧:实现 Web 端的鼠标操作功能
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途一、前言大家在做selenium测试时,是否会遇到在网页上需要执行一些鼠标操作,如右键选择一些设置,或者双击点赞,双击放到屏幕等等,但是在日常使用中还是习惯使用selenium......
  • 近期计划总结 && 未来长久打算
    以下的话全是我写给自己看的,算是对自己的自省目前,经过了三个月的集中学习,unity还算是入门了,C#也堪堪达到入门水准//但是,作为一个大龄学生,现在脑子也没有以前那么好用了,所以记了很多博客//不过,我发现有点被所谓的任务裹挟了,记录时间甚至持平学习时间,这就倒反天罡了//所......
  • # 学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第4周学习总结
    学期(如2024-2025-1)学号(如:20241402)《计算机基础与程序设计》第4周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标<写上......
  • C++智能指针
    智能指针1、智能指针本身:智能指针是一个类模板的实例,通常作为局部变量存在于栈区(Stack)。当函数返回或者局部变量超出其作用域时,栈区的内存会被自动释放。2、智能指针管理的对象:智能指针通常用来管理在堆区(Heap)上分配的内存。这是通过调用如new操作符来完成的。堆区的内存会一直......
  • C++算法练习-day1——704.二分查找
    题目来源:.-力扣(LeetCode)题目思路分析二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从......