C++访问限定符public、project、private和继承

1、被private限定符修饰的成员,只能在类内进行访问(被类的成员函数进行访问)

2、被public限定符修饰的成员,可以在类内和内外都可以进行访问

3、被project限定符修饰的成员,可以在类内进行访问,在类外不能进行访问(和private相似)

5、类可以进行继承,就会产生父类(基类),子类(派生类)

下面看代码和注释

Person.h

#ifndef _PERSON_H_
#define _PERSON_H_
#include <string>
using namespace std;


class Person
{
public:
    Person();
    ~Person();
    void eat();
protected:
    string m_strName;
private:
    int m_iAge;
};

#endif

Worker.h

#include "Person.h"
#ifndef _WORKER_H_
#define _WORKER_H_

class Worker:public Person
{
public:
    Worker();
    ~Worker();
    void work(void);
private:
    int m_iSalary;    
};

#endif

Person.cpp

#include <iostream>
#include "Person.h"
using namespace std;

Person::Person()
{
    
}

Person::~Person()
{
    
}


void Person::eat()
{
    m_strName = "Jack";//被Protected修饰的成员在类内(成员函数)中访问
    m_iAge = 20;//被private修饰的成员在类内(成员函数)中访问
    cout << "eat()" << endl;
}

Worker.cpp

#include <iostream>
#include "Worker.h"
using namespace std;

Worker::Worker()
{

}

Worker::~Worker()
{

}

void Worker::work()
{
    m_strName = "Marry";//基类中的被Protected修饰的成员可以在派生类中访问
    eat();//基类中的被public修饰的成员可以在派生类中直接访问
    cout << "work()" << endl;
}

demo.cpp

#include <iostream>
#include "Worker.h"

int main()
{
    Worker worker1;
    Person person1;
    //work1.m_strName = "Marry";   //编译器报错,被protected修饰的成员在只\
                                    能在派生类中进行访问(被派生类的成员函数)
                                
    worker1.work();
    //person1.m_strName = "Jack";//编译器报错,被protected修饰的成员被不能类\
                                    外进行访问
    return 0;
}


 

 

<think>好的,我现在需要帮助用户解决他们在C++项目中遇到的编译错误:“D:\QT_project\wifishiyan\wifi.cpp:704: error: No member named 'datarate_20M' in 'wifi::datarate_MHz'”。用户之前询问过如何定义datarate_MHz结构,而我之前提供了四种方案。现在他们遇到了成员变量访问的问题,我需要仔细分析可能的原因。 首先,用户提到错误是在wifi.cpp文件的704行,指出在wifi::datarate_MHz中没有名为datarate_20M的成员。这说明用户在代码中试图访问datarate_20M,但编译器找不到这个成员。接下来,我需要回顾之前提供的方案,看看用户可能采用了哪种定义方式,以及可能导致这个错误的原因。 用户之前得到的四个方案包括结构体、封装、枚举静态常量。每种方案的定义方式不同,访问成员的方式也不同。例如,方案一的结构体是直接定义公有成员变量,而方案三的枚举则是通过枚举值访问,而不是结构体或的成员。 可能的原因之一是用户可能选择了枚举(方案三)或静态常量(方案四),这两种方式访问成员的方式不同。例如,如果用户使用了方案三的枚举,正确的访问方式应该是DataRate::DR_20M,而不是datarate_MHz结构体的成员变量。同样,方案四的静态常量需要以datarate_MHz::_20M的方式访问,而不是结构体实例的成员。 另一个可能性是用户在使用结构体或封装时,可能没有正确实例化对象,或者实例化的对象名称不符。例如,在方案一中,用户需要先创建结构体的实例,如datarate_MHz wifi6_spec;,然后通过wifi6_spec.datarate_20M来访问。如果用户直接使用结构体名而不是实例,比如写成了datarate_MHz::datarate_20M,这就会导致错误,因为结构体的成员变量属于实例,而不是静态成员。 还有一种情况是用户可能在使用封装(方案二)时,构造函数中是否正确初始化了成员变量。例如,方案二的有显式构造函数,需要传入参数,但如果用户没有正确初始化,或者在定义中成员变量被声明为私有而非公有,也会导致访问错误。 此外,命名空间的问题也需要考虑。用户错误信息中提到的是'wifi::datarate_MHz',说明datarate_MHz是在wifi命名空间内定义的。如果用户在定义结构体或时,没有正确放置在wifi命名空间下,或者在访问时没有正确使用命名空间限定符,也可能导致编译器找不到成员。 可能的解决方案包括: 1. 检查datarate_MHz的定义是否正确,确保成员变量存在且为公有。 2. 确认是否实例化了对象,并通过实例访问成员,而不是直接使用结构体或名。 3. 如果使用了枚举或静态常量,确保访问方式正确。 4. 检查命名空间是否正确,确保在使用时包含了wifi命名空间。 例如,如果用户采用了方案一的结构体定义,正确的代码应该是: ```cpp wifi::datarate_MHz rate; int speed = rate.datarate_20M; ``` 如果用户误用了方案三的枚举,应该改为: ```cpp wifi::DataRate rate = wifi::DataRate::DR_20M; int speed = static_cast<int>(rate); ``` 或者如果用户用了方案四的静态常量访问方式应为: ```cpp int speed = wifi::datarate_MHz::_20M; ``` 因此,用户需要根据自己实际采用的方案,调整访问成员的方式。同时,检查代码中是否存在拼写错误,比如变量名是否正确,是否有大小写不一致等问题。此外,确认在定义结构体或时,成员变量确实被正确声明,并且位于正确的命名空间内。如果用户将结构体定义在wifi命名空间内,但在使用时没有指定该命名空间,也可能导致错误。 总结来说,用户需要检查他们的datarate_MHz的具体实现方式,确保访问方式与定义方式一致,并且所有语法命名空间使用正确。通过逐步排查这些可能的原因,应该能够解决这个编译错误。</think>这个错误提示说明你在代码中试图访问 `wifi::datarate_MHz` 的 `datarate_20M` 成员,但编译器找不到该成员。以下是详细排查解决方案: --- ### **可能原因分析** 1. **成员未正确定义** 的定义中可能遗漏了 `datarate_20M` 成员变量。 2. **访问权限问题** 如果 `datarate_20M` 是私有(`private`)或保护(`protected`)成员,外部代码无法直接访问。 3. **命名空间或作用域错误** 定义在 `wifi` 命名空间中,但使用时未正确限定作用域。 4. **对象未实例化** 试图通过名直接访问成员(如 `datarate_MHz::datarate_20M`),而非通过对象实例访问。 --- ### **解决方案** 根据你之前提供的代码方案,以下是具体修复方法: --- #### **若采用方案一(结构体实现)** ```cpp // 确保结构体定义在 wifi 命名空间内 namespace wifi { struct datarate_MHz { int datarate_20M = 20; int datarate_40M = 40; int datarate_80M = 80; int datarate_160M = 160; int datarate_320M = 320; }; } // 正确用法:先实例化对象,再访问成员 wifi::datarate_MHz rate_config; // 实例化 int speed = rate_config.datarate_20M; // 通过对象访问 ``` --- #### **若采用方案二(封装实现)** ```cpp namespace wifi { class datarate_MHz { public: // 必须声明为 public explicit datarate_MHz(int base_rate = 20) : datarate_20M(base_rate), datarate_40M(base_rate * 2), datarate_80M(base_rate * 4), datarate_160M(base_rate * 8), datarate_320M(base_rate * 16) {} // 确保成员变量是 public int datarate_20M; int datarate_40M; int datarate_80M; int datarate_160M; int datarate_320M; }; } // 正确用法 wifi::datarate_MHz rate_config(20); // 实例化对象 int speed = rate_config.datarate_20M; // 通过对象访问 ``` --- #### **若采用方案四(静态常量)** ```cpp namespace wifi { class datarate_MHz { public: static const int _20M = 20; // 注意成员名是 _20M 而非 datarate_20M static const int _40M = 40; static const int _80M = 80; static const int _160M = 160; static const int _320M = 320; }; } // 正确用法:直接通过访问 int speed = wifi::datarate_MHz::_20M; // 注意成员名匹配 ``` --- #### **若采用方案三(枚举实现)** ```cpp namespace wifi { enum class DataRate : int { DR_20M = 20, // 枚举值名称为 DR_20M DR_40M = 40, DR_80M = 80, DR_160M = 160, DR_320M = 320 }; } // 正确用法:通过枚举访问 wifi::DataRate rate = wifi::DataRate::DR_20M; int speed = static_cast<int>(rate); // 转换为整型 ``` --- ### **关键检查点** 1. **核对成员名称** - 如果使用方案四,成员名是 `_20M`,而非 `datarate_20M`。 - 如果使用方案三,成员名是 `DR_20M`,而非 `datarate_20M`。 2. **检查作用域限定符** 确保在访问时添加命名空间 `wifi::`,例如: ```cpp wifi::datarate_MHz config; // 正确限定命名空间 ``` 3. **验证访问权限** 成员变量必须声明为 `public`(默认情况下,结构体成员是 `public`,成员是 `private`)。 --- ### **错误示例修正** 假设你误用了方案四的静态常量,但试图通过 `datarate_20M` 访问: ```cpp // 错误代码 int speed = wifi::datarate_MHz::datarate_20M; // 成员名实际是 _20M // 修正后 int speed = wifi::datarate_MHz::_20M; ``` --- 通过以上步骤逐步排查,即可解决 `No member named 'datarate_20M'` 的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值