首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

无法访问另一个函数c++类中的成员

问题描述: 无法访问另一个函数c++类中的成员。

回答: 在C++中,要访问另一个类中的成员,需要注意以下几点:

  1. 类的成员有不同的访问权限,包括公有(public)、私有(private)和保护(protected)。公有成员可以在类的内部和外部访问,私有成员只能在类的内部访问,保护成员可以在类的内部和派生类中访问。
  2. 如果目标类中的成员是公有的,那么可以直接通过对象名或指针来访问该成员。

例如,假设我们有两个类A和B,B是A的友元类,我们可以通过以下方式访问B类中的成员:

代码语言:txt
复制
class A {
public:
    void somePublicFunction() {
        B b;
        b.someMemberFunction();
    }
    
    friend class B;
};

class B {
public:
    void someMemberFunction() {
        A a;
        // 可以访问A类中的私有成员
        a.somePrivateMember = 10;
    }
};

int main() {
    A a;
    a.somePublicFunction();
    return 0;
}
  1. 如果目标类中的成员是私有的或保护的,而当前类又不是目标类的友元类,那么无法直接访问该成员。可以考虑使用访问器函数(getter和setter函数)来间接访问目标类中的私有成员。这样可以通过调用访问器函数来获取或修改目标类中的私有成员。

以下是一个简单示例:

代码语言:txt
复制
class A {
private:
    int somePrivateMember;

public:
    int getSomePrivateMember() const {
        return somePrivateMember;
    }

    void setSomePrivateMember(int value) {
        somePrivateMember = value;
    }
};

class B {
public:
    void someMemberFunction() {
        A a;
        // 可以通过访问器函数间接访问A类中的私有成员
        a.setSomePrivateMember(10);
        int value = a.getSomePrivateMember();
    }
};

通过上述方式,可以在C++中访问另一个类中的成员。然而,具体的访问方式还取决于目标类成员的访问权限以及当前类与目标类之间的关系。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++成员函数 | 成员函数

C++成员函数性质 在C++成员函数函数一种,它有返回值和函数类型,它与一般函数区别只是:  属于一个成员,出现在。...C++在使用函数时,要注意调用它权限以及它作用域,私有的成员函数只能被本类其他成员函数所调用,而不能被外调用,成员函数可以访问本类任何成员,可以引用在本作用域中有效数据。 ...在C++,有的函数并不是准备为外界调用,而是为本类成员函数所调用,就应该将它们指定为 private。...这种函数作用是支持其他函数操作,是其他成员函数外用户不能调用这些私有的函数。  成员函数十分重要部分。...C++外定义成员函数 上述所讲成员函数是在定义,在C++也可以在只写成员函数声明,而在外面进行函数定义。

1.9K74

C++初阶(默认成员函数

呀哈喽,我是结衣 今天给大家带来里面的默认成员函数,一共有六个默认成员函数哦,包括构造函数,析构函数,拷贝构造函数,运算符重载函数,const成员函数,那么正篇开始。...6个默认成员函数 如果一个什么成员都没有,简称为空。 空真的什么都没有吗?并不是,任何在什么都不写时,编译器会自动生成以下6个默认成员函数。...先说概念吧 1.1概念 构造函数是一个特殊成员函数,名字与名相同,创建类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适初始值,并且在对象整个生命周期内只调用一次。...1.3C++11更新 在C++11标准里,针对内置类型成员不能初始化缺陷,打了个补丁,就是:内置类型成员变量在声明时可以给默认值 #include using namespace...注意:如果类没有申请资源时,析构函数可以不写,直接使用编译器生成默认析构函数,比如 Date;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack。 完

15110
  • C++:30 ---C++成员成员函数内存布局

    ,C++语法不允许获取构造函数和析构函数地址,要分析其地址,只能查看生产汇编代码了。...:" << std::hex << std::showbase << ut.addr << endl; ut.f = &Demo::F2; cout << "成员函数F2()地址是 :...这里要指出是大家可以看到静态成员函数和静态成员变量sx地址都是0x00007FF开头,实际上他们都在全局数据区域存储(全局变量,静态变量),如果你有耐心,可以断点查看下栈空间内局部变量i地址:...:F2; cout << "成员函数F2()地址是 :" << std::hex << std::showbase << ut.addr << endl; cout << "虚函数入口地址...我想你现在根据刚才打印成员变量,成员函数,虚函数表地址已经可以自己画出成员内存布局了。

    1.3K20

    C++和对象以及成员函数

    参考链接: 如何通过C++函数传递和返回对象? 一个实体拥有自己属性和行为,属性是私有的,行为是共有的,在C++实体对应就是对象,实体抽象数据类型就是,属性是成员变量,行为是成员函数。 ...在C++,结构体默认是全部都可见,而默认是私有的。 ...C++class和C语言结构体区别:  ①struct Node是一个类型,在C语言中这样定义struct Node a;定义了一个结构体类型a变量;在C++,结构体定义对象可以写成Node...②空结构体在C语言编译通不过,会报错;在C++中大小为1;不过在Linux环境里大小则为0;空C++)大小也为1。  这时就会有一个疑问??空大小为何是1而不是0呢?? ...那么定义和外定义有什么区别呢??  ①如果在定义,在函数调用时候编译器会当做内联函数处理,在调用点将代码展开;  ②如果在外定义,在函数调用时和普通函数一样,进行栈桢开辟和回退。

    1.4K20

    C++C++ this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

    一、常量成员函数 1、const 修饰成员函数分析 在 C++ , 普通非静态成员函数 , 可以使用 const 进行修饰 , 在 下面的 Student , 定义了 void fun(int...在 * 右边修饰是指针本身 ; 代码示例 : class Student { public: // 使用 const 修饰 成员函数 // const 关键字可以 // 在 void...使用 const 关键字 修饰成员函数 , 会将 成员函数 转化为 " 常量成员函数 " ; " 常量成员函数 " 操作限制 : 不能修改成员变量 : 不能修改 任何 成员变量 值 , 静态成员变量...; // 身高 如果 成员函数 被 const 关键字 声明为 常量成员函数 , 则在该函数 不能修改 对象 任何成员变量 ; class Student { public: void fun..." << endl; } ~Student() { cout << "执行 Student 析构函数" << endl; } // 使用 const 修饰 成员函数 // const

    22020

    C++初阶——(默认成员函数)下

    时隔多天默认成员函数,在上篇博客我们讲了,构造函数和析构函数。简单回顾下,构造函数就是类似于初始化函数,他函数名与名相同,且没有返回值。...4.作为成员函数重载时,其形参看起来比操作数数目少1,因为成员函数第一个参数为隐藏this 5. .* :: sizeof ?: .注意以上5个运算符不能重载。...那么此时用户还在外自己实现一个全局赋值运算符重载,就和编译器在中生成默认赋值运算符重载冲突了,所以赋值运算符重载只能是成员函数。...C++规定:后置++在重载时多增加一个int类型参数,但调用函数时不用传第,编译器会自动传递。...3.const成员 将const修饰成员函数”称为const成员函数,const修饰成员函数实际修饰该成员函数隐含this指针,表明在该成员函数不能对任何成员进行修改。

    8610

    C++静态数据成员和静态成员函数

    我们需要一个成员为所有对象所公有,而且在需要更新这个公有属性时候只需修改一次。 因此,C++提供了静态数据成员来描述对象相同属性。...在定义时候非静态数据成员是不分配内存,只有在创建对象时候才分配内存,但静态数据成员是要分配内存,因为它是属于,只有一块内存,所以要初始化它,而且不能在声明初始化,必须要在外初始化...静态成员函数 一般都是在静态成员函数修改静态数据成员,在刚刚手机声明成员函数: static void change(); 就是静态成员函数。...首先,可能你在做题时候,题目要求你使用静态成员函数完成任务…… 开个玩笑啦…… 静态成员函数没有this指针,因为它在创建时候就存在了,在没有创建对象时候就已经存在静态成员函数,而普通函数必须在对象被创建时候才能被使用...简而言之,静态成员函数是服务于,而不是某个对象,它方便在于不需要定义对象就能使用。

    18730

    C++const成员变量和成员函数

    ,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。...初始化 const 成员变量只有一种方法,就是通过构造函数初始化列表,这点在前面已经讲到了,请猛击《C++初始化列表》回顾。...const成员函数(常成员函数) const 成员函数可以使用所有成员变量,但是不能修改它们值,这种措施主要还是为了保护数据而设置。const 成员函数也称为常成员函数。...我们通常将 get 函数设置为常成员函数。读取成员变量函数名字通常以get开头,后跟成员变量名字,所以通常将它们称为 get 函数。...函数头部结尾加上 const 表示常成员函数,这种函数只能读取成员变量值,而不能修改成员变量值,例如char * getname() const。

    26930

    C++自动提供特殊成员函数

    ⽤于初始化过程(包括按值传递参数)。 原型: ```c++ Class_name(const Class_name&); ``` 它接受⼀个**指向对象常量引⽤**作为参数。...复制构造函数功能: 默认复制构造函数逐个复制⾮静态成员成员复制也称为浅复制),复制成员值。 静态函数(如num_strings)不受影响,因为它们属于整个,⽽不是各个对象。...- 解决设计这种问题⽅法是进⾏深度复制(deep copy)。 - 复制构造函数应当复制字符串并将副本地址赋给str成员,⽽不 仅仅是复制字符串地址。...- 如果类包含了**使⽤new初始化指针成员**,应当定义⼀个复制构造函数,**以复制指向数 据,⽽不是指针**,这被称为深度复制。复制另⼀种形式(成员复制或浅复制)只是复制指针 值。...当 然,编译器开发⼈员通常不会花时间添加这样⾏为。 如果成员本⾝就是对象,则程序将使⽤为这个定义赋值运算符来复制该成员,但静态数据成员不受影响。

    71910

    c++之类成员变量和成员函数是分开存储

    C++程序内存格局通常分为四个区: 全局数据区(data area),代码区(code area),栈区(stack area),堆区(heap area)(即自由存储区)。...全局数据区存放全局变量,静态数据和常量; 所有成员函数和非成员函数代码存放在代码区; 为运行函数而分配局部变量、函数参数、返回数据、返回地址等存放在栈区;余下空间都被称为堆区。...根据这个解释,我们可以得知在定义时,成员函数是被放在代码区,而静态成员变量在定义时就已经在全局数据区分配了内存,因而它是属于。...对于非静态成员变量,我们是在实例化过程(构造对象)才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象

    1.9K40

    外实现成员函数好处(C++

    ,JieGayvisit()无法访问MyHouse私有成员。...,总会有一个未定义报错,且JieGay始终无法访问到MyHouse私有成员 杰哥不要啦~ ---- 错因 对着教程又仔细看了一遍,发现自己跟教程唯一不同就是教程成员函数是在外实现,而我写是在内实现...::JieGay( { m = new MyHouse; } //外实现JieGay成员函数 void JieGay::visit() { cout << "杰哥正在访问:" << m...---- 反思 仔细想了一下,前后区别只是编译顺序不同,编译器是从上往下编译,如果在内就实现成员函数,编译时候必然会出现一方未定义情况,而如果改为外实现,则可以随意控制函数编译顺序,让前置类型先编译出来...虽然之前也学过外实现写法,但嫌麻烦一直没用,今天总算是明白外实现好处了。。。

    64620

    《挑战30天C++入门极限》C++静态数据成员静态成员函数

    C++静态数据成员静态成员函数   在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象程序是由对象构成,我们如何才能在范围内共享数据呢...这个问题便是本章重点:   声明为static成员或者成员函数便能在范围内共同享,我们把这样成员称做静态成员和静态成员函数。   ...以下程序我们来做一个模拟访问例子,在程序,每建立一个对象我们设置静态成员变自动加一,代码如下: #include using namespace std;...便运行加1操作,静态成员初始化应该在主函数调用之前,并且不能在声明中出现,通过运行过程观察我们发现,静态成员count状态并不会随着一个新对象新建而重新定义,尽而我们了解到静态成员函数由于与对象无关系...(静态成员完全可以替代全局变量),这个例子理解重点主要是要注意观察成员析构顺序,通过对析构顺序理解,使用析构函数来进行节点脱链操作。

    69930

    C++声明和成员函数定义 | 引用多个成员对象

    C++声明和成员函数定义分离 在C++,一般做法是将声明放在指定头文件,程序员如果想用该类,只要把有关头文件包含进来即可,不必在程序重复书写声明,以减少工 作量,提高编程效率。 ...由于在头文件包含了声明,因此在程序中就 可以用该类来定义对象,由于在包含了对成员函数声明,在程序中就可以调用这些对象公用成员函数。...在实际C++开发,并不是将一个声明做成一个头文件,而是将若干个常用功能相近声明集中在一起,形成库。...C++库包括两个组成部分: 声明头文件 已经过编译成员函数定义,它是目标文件。 案例:C++引用多个对象成员。...以上,如果你看了觉得对你有所帮助,就给小林点个赞叭,这样小林也有更新下去动力,跪谢各位父老乡亲啦~ C++声明和成员函数定义 | 引用多个成员对象 更多案例可以go公众号:C语言入门到精通

    1.9K83

    成员函数总结

    前言: 如果一个什么成员都没有,简称为空。 空真的什么都没有吗?并不是,任何在什么都不写时,编译器会自动生成以下6个默认成员函数。...无返回值 对象实例化时编译器自动调用对应构造函数 构造函数可以重载 如果类没有显示定义构造函数,则C++编译器会自动生成一个无参默认构造函数,一旦用户显示定义编译器将不再生成。...在创建对象时,编译器通过调用构造函数,给对象各个成员变量一个合适初始值。 虽然上述构造函数调用后,随想已经有一个初始值,但是不能将其称为对对象成员变量初始化。...成员变量在声明次序就是其在初始化列表初始化顺序,与其在初始化列表顺序无关~ 二、析构函数: 1、概念 与构造函数功能相反,析构函数不是完成对对象本身销毁,局部对象销毁工作是由编译器完成。...注意析构函数不能重载 对象生命周期结束时,C++编译系统自动调用析构函数

    6010
    领券