利用 * 重载 ->
时间: 2023-07-06 08:11:39 浏览: 61
重载箭头运算符 -> 的目的是方便对类对象成员的访问。当一个类中包含指向其他对象的指针成员时,使用箭头运算符可以直接访问该指针所指向的对象的成员,避免了使用间接寻址操作符 * 的繁琐过程。
具体实现时,需要定义一个重载箭头运算符的成员函数,其返回类型必须是指针或类对象的引用,然后在该函数内部使用指针成员进行对象访问操作,并返回结果即可。
例如,假设我们有一个名为 MyClass 的类,其中包含一个成员变量 ptr,类型为指向另一个对象的指针。现在我们想要通过箭头运算符访问该指针所指向的对象的成员变量 x,可以这样实现:
```c++
class MyClass {
public:
// 重载箭头运算符
OtherClass* operator->() {
return ptr;
}
private:
OtherClass* ptr;
};
// 使用箭头运算符访问成员变量 x
MyClass obj;
int x = obj->x;
```
相关问题
c++如何利用* 重载->
在C++中,通过重载箭头运算符 ->,我们可以使指向一个类对象的指针像访问成员函数一样去访问类的成员变量或者成员函数,这种方式被称为“指向成员运算符重载”。
具体步骤如下:
1. 在类定义中声明一个返回指针的成员函数。
2. 重载箭头运算符 ->,使其返回上述成员函数的指针。
例如,假设我们有一个Person类,其中有一个成员函数getName(),我们希望使用指针访问该函数,代码如下:
```
class Person {
public:
string getName() {
return name;
}
private:
string name = "John Doe";
};
class PersonPtr {
public:
PersonPtr(Person* ptr) : m_ptr(ptr) {}
Person* operator->() {
return m_ptr;
}
private:
Person* m_ptr;
};
int main() {
Person p;
PersonPtr ptr(&p);
cout << ptr->getName() << endl; // 输出 John Doe
return 0;
}
```
在上述代码中,我们定义了一个名为PersonPtr的新类,它接受一个指向Person类对象的指针,并重载了箭头运算符 ->,使得它返回指向Person类中的成员函数getName()的指针。因此,我们可以通过PersonPtr对象访问Person类的成员函数getName()。
需要注意的是,重载箭头运算符 -> 的返回值必须是指针类型。在上述示例中,我们返回了一个指向Person类对象的指针。如果需要返回其他类型,需要根据实际情况进行修改。
先设置一个高电平时间的最大值1.9ms,因为频率为200hz,周期为5ms,此时对应占空比为duty = 0.38,TIM2->CCR1 = 7199*duty;然后通过按键使占空比为高电平时间0.7ms最小时对应的值,即duty = o.14;
### 回答1:
此时,TIM2->CCR1 = 2699*duty;
具体实现可以参考以下代码:
// 设置定时器2为PWM模式
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
// 设置定时器2的自动重载值
uint16_t TIM2_ARR = 7199; // 200Hz
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_SetAutoreload(TIM2, TIM2_ARR);
// 初始化按键
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 循环检测按键状态,并设置占空比
while (1) {
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) {
// 按键按下,设置占空比为0.14
TIM2->CCR1 = 2699;
} else {
// 按键未按下,设置占空比为0.38
TIM2->CCR1 = 7199;
}
}
### 回答2:
根据给定的条件,先设置一个高电平时间的最大值1.9ms,对应的频率为200Hz,周期为5ms,此时对应的占空比可以通过计算得到。
占空比(Duty Cycle)表示高电平时间与周期的比值,可以通过以下公式计算:
Duty = 高电平时间 / 周期
将高电平时间最大值1.9ms和周期5ms代入公式,可以得到:
Duty = 1.9ms / 5ms ≈ 0.38
然后通过将占空比乘以一个固定值7199,将其转化为TIM2的CCR1寄存器的值,即:
TIM2->CCR1 = 7199 * 0.38
这样就设置了一个占空比为0.38时对应的高电平时间的最大值。
接下来,通过按键使占空比为高电平时间0.7ms最小时对应的值,即duty = 0.14。
根据之前设置的公式,可以反推出对应的CCR1寄存器的值:
TIM2->CCR1 = 7199 * 0.14
这样就完成了通过按键将占空比调整为高电平时间0.7ms最小时对应的值。
总结:先根据频率和周期计算出占空比的最大值,然后利用按键将占空比调整为需要的值,通过TIM2的CCR1寄存器实现对高电平时间的控制。
### 回答3:
根据题目中给出的信息,我们需要分别计算两种情况下的占空比对应的TIM2->CCR1值。
首先,给定频率为200Hz,周期为5ms,求高电平时间最大值对应的占空比。根据占空比的定义,占空比等于高电平时间与周期的比值:duty = 高电平时间 / 周期。
由于高电平时间的最大值为1.9ms,将它除以周期5ms得到占空比为0.38。
接下来,给定占空比对应的高电平时间最小值为0.7ms,需要求出它对应的TIM2->CCR1值。
可根据之前计算得到的最大占空比和对应的TIM2->CCR1值来设立一个比例关系。
将最大占空比0.38与7500对应的TIM2->CCR1值相除,即(7199*0.38)/7500 ≈ 0.365。可以将此比例关系用于计算最小占空比的TIM2->CCR1值:(0.365 * 7500 * 0.14) ≈ 370.66。
综上所述,根据给定的条件,最大高电平时间1.9ms对应的占空比为0.38,对应的TIM2->CCR1值为7199*0.38。而最小高电平时间0.7ms对应的占空比为0.14,对应的TIM2->CCR1值为约370.66。