C++之类的基本使用2(在类的内部定义结构和使用)
Posted 你是小KS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++之类的基本使用2(在类的内部定义结构和使用)相关的知识,希望对你有一定的参考价值。
1.声明
当前内容主要为学习和测试使用当前的C++中的类,并在类中定义匿名的结构,并访问和使用
包括
- 在类中定义struct
- 实现定义
- 使用和访问struct属性
- 命名空间的使用
2.基本的demo
1.头文件(存在于命名空间my_struct中)
/*
* Handler.h
*
* Created on: 2021年5月5日
* Author: hy
* 当前内容主要为测试和使用C++中如何使用不完全的结构声明
* 1. 测试在不明确结构的定义的情况下编写代码
*/
#ifndef BASIC_GIFTBOX_H_
#define BASIC_GIFTBOX_H_
#include<string>
using namespace std;
namespace my_struct {
// 在类未使用访问修饰符的默认为private
class GiftBox {
private:
// 这里定义一个类,并且使用一个未知的结构Cheshine,所以当前的C++并不能确定这个结构中有什么属性和方法以及各种特征,但是唯一的就是可以访问这个smile属性
struct Gift;
Gift* gift; // 就算是改变这个变量的访问权限,但是注意还是在编译中出现问题,无法访问id属性,由于id是动态生成的并封闭在一个未知的类型中,所以编译器并不知道有id属性
public:
GiftBox();
virtual ~GiftBox();
// 提供get和set方法
Gift* getGift(void);
void setGift(int id,string name,double price);
int getGiftId(void); // 只有通过这个方式实现访问匿名结构中的属性和方法,原因只有实现的时候才会知道属性和方法
void printGift(void); // 打印礼物信息
};
}
#endif /* BASIC_GIFTBOX_H_ */
通过C++中对class中默认访问修饰符为private可以得到这个gift是无法在外界访问的
1.本人尝试在头文件中访问gift中的属性(通过修改或者移动访问权限还是失败了),但是都失败了,原因这个struct Gift是一个匿名的结构,C++编译器并不知道其中有什么属性和方法可以调用
2.C++中的struct与原始C中的struct不同,C++中可以定义属性访问修饰符,以及方法,但是C中的属性默认就是相当于C++中的public,没有方法
2.具体实现的文件GiftBox.cpp
/*
* Handler.cpp
*
* Created on: 2021年5月5日
* Author: hy
* 具体的GiftBox的实现
*/
#include "GiftBox.h"
#include<iostream>
namespace my_struct {
// 这个结构类型对于Handler来说是匿名的结构,所以外部无法直接访问该结构中的属性,只要实现的时候才可以访问
struct GiftBox::Gift {
/*public :*/ // 无用的访问修饰符,原因Gift是一个private的结构,除了实现,否则没有任何访问
int id;
string name;
double price;
};
GiftBox::GiftBox() { // @suppress("Class members should be properly initialized")
this->gift = new Gift;
this->gift->id = 0; // 默认初始化为0
this->gift->name = "unknown";
this->gift->price = 0.0;
}
GiftBox::~GiftBox() {
delete this->gift;
}
// 实现具体的getGift方法,注意返回值类型为GiftBox::Gift如果有命名空间也需要加上,但是在相同的命名空间则不需要
GiftBox::Gift* GiftBox::getGift(void) {
return this->gift;
}
void GiftBox::setGift(int id,string name,double price){
this->gift->id =id;
this->gift->name=name;
this->gift->price=price;
}
int GiftBox::getGiftId(void) {
return this->gift->id;
}
void GiftBox::printGift(void) {
cout << "当前礼物信息如下:" << endl;
cout << "id=" << this->gift->id << endl;
cout << "name=" << this->gift->name << endl;
cout << "price=" << this->gift->price << endl;
}
}
这里需要注意
- 本人原来想通过setGift并传递Gift的指针的方式传递对象的方式赋值,但是失败了,原因struct Gift是一个private的结构,所以外界无法创建实例以及无法设置属性
- 解决办法,只有开出一个方法来在内部设置属性
3.基本测试类
/*
* HandlerTest.cpp
*
* Created on: 2021年5月5日
* Author: hy
* 当前内容主要为测试和使用当前的GiftBox这个特殊类
*/
#include "GiftBox.h"
#include<iostream>
using namespace std;
using namespace my_struct;
int main(int argc, char **argv) {
GiftBox giftBox;
/* GiftBox::Gift gift1;
gift1.id=1;
gift1.name="玫瑰花";
gift1.price=18.8;*/ // 无法访问一个private的struct
giftBox.setGift(1,"玫瑰花",18.8);
// 可以正常的获取
/*GiftBox::Gift* gift1 = giftBox.getGift(); */// 无法访问private的结构
// 但是无法解析其中属性和方法
/*gift1->id;*/ // 无法访问
cout <<"当前的smile的id属性为:"<< giftBox.getGiftId()<< endl; // id是无法访问的,无论是否添加public,这个访问的属性随着当前的struct的访问属性而改变
giftBox.printGift(); // 打印当前的礼物清单
return 0;
}
3.测试
4.总结
1.C++中在一个class中定义struct的时候需要小心,因为这是一个匿名的结构,无法在定义的类中直接访问struct的属性和方法,小心private访问修饰符的权限
2.在一个class中的struct如果是private那么,在外界使用的时候小心,无法创建该结构的实例,无法调用该结构的属性,只有提供外部访问方法,在实现中进行实现
以上是关于C++之类的基本使用2(在类的内部定义结构和使用)的主要内容,如果未能解决你的问题,请参考以下文章