Effective C++ 1.0 -- 概述

本文详细介绍了C++中的对象、函数及类型的声明与定义,包括外部变量声明、函数声明、类声明以及模板类的声明等内容。同时,文中还讨论了类的构造函数、拷贝构造函数和赋值运算符的重载,并解释了如何避免隐式类型转换等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明

对象声明,函数声明,类型声明,是告诉编译器某个东西的 名称和类型,但是略去了实现 细节,因为定义在其他的地方。

external int x;     //对象(object)声明
std:size_t numDigits(int  number)       //函数 声明
class Widget;       //类(class)声明
template<class T>
class GraphNode;        //模板类的声明
定义

是编译器为该对象拨发内存空间

类的三个默认成员函数

构造函数

default构造函数:是一个可被调用而不用传递任何参数的构造函数。
不用传递参数可能存在两个情况,第一种是函数没有参数,第二种是函数的参数都有缺省值。

我们建议把函数定义为explicit的,比如

class A
{
public:
    explicit A(int x = 0,bool b = true);
};

使用上面的关键字可以防止他们被执行隐式的类型转换,但是他们可以用来显示的类型转换。这样做可以防止编译器进行 隐式的类型转换。

拷贝构造函数和复制运算符的重载

注意拷贝构造函数和赋值运算符重载的时候的参数和返回值,尽量使用const和&

class Widget
{
public:
    Widget();       //default构造函数
    Widget(const Widget& rhs);
    Widget& operator=(const Widget& rhs);
}
不确定行为(未定义行为)

未定义行为的结果是不可预期的,一般的情况就是访问一个未定义的空间,可能 会出现以下的一些情况

  • 访问成功,虽然该空间是未定义的,比如访问越界了,但是这个空间可能被其他的语句定义出来了,而这个时候和我的类型匹配,这个时候虽然是不当的,但是可以访问
  • 访问失败,空间没有被 定义出来
  • 访问失败,空间虽然被定义出来了,但是被其他的资源占用了,并且权限不被我们使用,所以不可用
TR1和Boost

TR1

TR1(”Technical Report 1”),是一个规范,描述加入C++的诸多的新机能。

Boost

Boost是一个网站也是一个开放源码的C++程序库。TR1的很多机能是以Boost为基础的,很多C++11的标准实际是参考了Boost。

<think>我们正在处理一个Maven构建失败的问题,错误信息是“Non-resolvable parent POM for ... com.atguigu.cloud:mscloudV5:pom:1.0-SNAPSHOT not found”。根据引用[2]和引用[5],这个错误通常是因为Maven无法从仓库(本地或远程)中找到指定的父POM。 根据引用[5]: 1. Maven在解析父POM时,默认查找顺序是:relativePath指定的路径 > 本地仓库 > 远程仓库。 2. 如果没有指定relativePath,则默认值为../pom.xml(即上一级目录)。 3. 如果设置`<relativePath/>`(空标签),则跳过相对路径查找,直接从本地仓库和远程仓库查找。 因此,我们可以按照以下步骤来解决问题: 步骤1:检查父POM是否在本地仓库 首先,确认本地仓库中是否有该父POM。父POM的路径应该是: `~/.m2/repository/com/atguigu/cloud/mscloudV5/1.0-SNAPSHOT/mscloudV5-1.0-SNAPSHOT.pom` 如果没有,则需要从远程仓库下载。但错误提示找不到,可能是远程仓库中也没有,或者仓库配置不正确。 步骤2:检查远程仓库配置 确保在项目的pom.xml或settings.xml中配置了正确的远程仓库,并且该仓库中包含所需的父POM。 步骤3:检查relativePath设置 在子模块的pom.xml中,父POM的声明部分可能如下: ```xml <parent> <groupId>com.atguigu.cloud</groupId> <artifactId>mscloudV5</artifactId> <version>1.0-SNAPSHOT</version> <!-- 检查relativePath --> <relativePath>../pom.xml</relativePath> <!-- 或者没有,或者指定其他路径 --> </parent> ``` 如果父POM与子模块不在同一个项目的多模块结构中(即父POM在上一级目录),那么需要确保relativePath指向正确的位置。如果父POM在本地仓库或远程仓库中,并且不在当前项目的目录结构中,可以设置`<relativePath/>`(空标签)来跳过相对路径查找。 步骤4:检查网络和仓库地址 如果错误信息中提到无法访问Maven中央仓库(如引用[2]和[4]),可能是网络问题或仓库地址错误。确保你的网络可以访问配置的远程仓库(如https://repo.maven.apache.org/maven2)。可以尝试在浏览器中访问该URL,或者使用命令`mvn help:effective-settings`检查仓库配置。 步骤5:强制更新快照 如果父POM是快照版本,并且之前下载失败,Maven可能缓存了失败信息。根据引用[2]和[4],可以尝试强制更新: ``` mvn clean install -U ``` 选项`-U`表示强制更新快照。 步骤6:检查父POM是否在远程仓库中 如果父POM是由自己或团队开发的,确保它已经被正确部署到远程仓库(如Nexus或Artifactory)。如果没有,需要先构建并部署父项目。 步骤7:检查父POM的版本号 确保在子模块中指定的父POM版本号(1.0-SNAPSHOT)与父项目中的版本号一致。 步骤8:检查父项目的打包类型 父项目的打包类型应该是pom,即父项目的pom.xml中应该有: ```xml <packaging>pom</packaging> ``` 根据上述步骤,我们可以逐一排查。 由于引用中提到了几种类似的情况,我们可以总结出常见的解决方案: 1. 确保父项目已经被安装到本地仓库(在父项目目录下执行`mvn clean install`)。 2. 如果父项目在远程仓库,确保仓库配置正确且可访问,然后使用`-U`选项强制更新。 3. 检查relativePath的设置,如果父POM不在当前项目的目录结构中,设置`<relativePath/>`。 因此,针对当前问题,建议用户: 1. 首先,在父项目(mscloudV5)的根目录下执行`mvn clean install`,将父POM安装到本地仓库。 2. 如果父项目不在本地,则需要检查远程仓库配置,并确保父POM已经部署到远程仓库。 3. 在子模块的pom.xml中,检查relativePath设置,如果父POM不在相对路径,可以设置为空: ```xml <relativePath/> ``` 4. 运行`mvn clean install -U`来强制更新快照。 如果问题仍然存在,需要检查Maven的settings.xml文件中的仓库配置,以及网络连接。 注意:由于错误信息中提到了“not found”,所以最可能的原因是父POM不存在于本地仓库,且无法从远程仓库下载,或者relativePath指向了错误的本地路径。 生成相关问题: 1. 如何配置Maven的远程仓库? 2. 如何将本地项目安装到Maven本地仓库? 3. Maven的relativePath标签的作用是什么? 4. 如何解决Maven构建中的依赖解析失败问题? 5. 如何部署项目到Maven远程仓库?</think>### Maven构建失败:无法解析父POM问题解决指南 您在Maven构建时遇到的错误`Non-resolvable parent POM for com.atguigu.cloud:mscloudV5:pom:1.0-SNAPSHOT`表明Maven无法找到指定的父POM依赖。根据引用[2][5],这通常由以下原因引起: #### 解决步骤: 1. **检查relativePath设置** 在子模块的`pom.xml`中,确保`<parent>`标签内正确配置了`relativePath`: ```xml <parent> <groupId>com.atguigu.cloud</groupId> <artifactId>mscloudV5</artifactId> <version>1.0-SNAPSHOT</version> <!-- 关键设置 --> <relativePath>../pom.xml</relativePath> <!-- 指向父POM的物理路径 --> </parent> ``` - 如果父POM位于上级目录,使用`<relativePath>../pom.xml</relativePath>` - 若要从仓库加载(跳过本地路径),使用`<relativePath/>`(空标签)[^5] 2. **安装父POM到本地仓库** 在**父项目根目录**执行: ```bash mvn clean install ``` 这会将父POM(`mscloudV5:1.0-SNAPSHOT`)安装到本地仓库(`~/.m2/repository`) 3. **检查仓库配置** 确保`settings.xml`或项目POM中包含正确的仓库配置: ```xml <repositories> <repository> <id>your-repo</id> <url>http://your-artifactory-url</url> <!-- 启用SNAPSHOT下载 --> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> ``` 4. **强制更新依赖**(解决缓存问题) 添加`-U`参数强制更新SNAPSHOT依赖: ```bash mvn clean install -U ``` 5. **验证网络和仓库访问** 测试仓库URL是否可达(引用[2][4]): ```bash curl https://repo.maven.apache.org/maven2 ``` 如果返回超时,需检查网络设置或代理配置 6. **检查父POM版本一致性** 确认子模块中声明的父POM版本(`1.0-SNAPSHOT`)与父项目实际版本完全一致 #### 预防措施: - 在聚合项目中,始终先构建父模块(`mvn install`) - 定期清理旧快照:`mvn dependency:purge-local-repository` - 对于团队协作,建议使用Nexus/Artifactory搭建私有仓库托管SNAPSHOT > **关键机制**:Maven解析父POM的顺序为:`relativePath` → 本地仓库 → 远程仓库[^5]。当相对路径指向错误或本地仓库缺失时,会触发此错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值