C++之类的基本使用2(在类的内部定义结构和使用)

Posted 你是小KS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++之类的基本使用2(在类的内部定义结构和使用)相关的知识,希望对你有一定的参考价值。

1.声明

当前内容主要为学习和测试使用当前的C++中的类,并在类中定义匿名的结构,并访问和使用

包括

  1. 在类中定义struct
  2. 实现定义
  3. 使用和访问struct属性
  4. 命名空间的使用

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;
}

}

这里需要注意

  1. 本人原来想通过setGift并传递Gift的指针的方式传递对象的方式赋值,但是失败了,原因struct Gift是一个private的结构,所以外界无法创建实例以及无法设置属性
  2. 解决办法,只有开出一个方法来在内部设置属性

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(在类的内部定义结构和使用)的主要内容,如果未能解决你的问题,请参考以下文章

C++之类和对象的特性

C++学习笔记1:类的使用

C++要点总结

在类方法内部访问类的命名空间之外?

C++入门静态成员详解(定义实现原理使用注意事项)

C++之类的基本使用1