C++中一个类成员函数调用另一个类成员的方法

365bet娱乐场客户端 ⌛ 2025-10-25 00:48:47 ✍️ admin 👁️ 8408 ❤️ 411
C++中一个类成员函数调用另一个类成员的方法

在继承之外,在C++中一个类成员函数调用另一个类成员的方法主要有:类的组合,友元类,类的前向声明,单例模式等,下面主要讲讲这4种方法的实现

方法1:利用类的组合

组合通俗来讲就是类B有类A的属性,如声明一个Person类,再声明一个Teacher类,Person类对象有年龄和姓名成员,而Teacher类对象成员也有年龄和姓名属性,所以我们可以将类Person的对象作为类Teacher的成员变量,那么就实现了Teacher类对象也有这两个属性。如下所示:

#include

#include

using namespace std;

class Person

{

public:

Person(int _age, string _name) :age(_age), name(_name) {}

~Person() {};

void print()

{

cout << name<<" " << age << endl;

}

private:

int age;

string name;

};

class Teacher

{

public:

Teacher(Person* _person) :person(_person) {}

~Teacher() {};

void print()

{

this->person->print();

}

private:

Person* person;

};

int main()

{

Person p(40, "lisan");

Teacher teacher(&p);

teacher.print();

system("pause");

return 0;

}

方法2:友元类

友元类就是在类A中声明一个类B,那么就称类B是类A的友元类,这时类B的对象可以访问类A的一切成员,包括私有成员。如下所示:

#include

#include

using namespace std;

class A

{

public:

friend class B;

A(int _age, string _name) :age(_age), name(_name) {}

~A() {};

void print_a()

{

cout << name << " " << age << endl;

}

private:

int age;

string name;

};

class B

{

public:

B() {};

~B() {};

void print_b(A& a)

{

a.print_a();

}

};

int main()

{

A a(20,"name");

B b;

b.print_b(a);

system("pause");

return 0;

}

注意:

友元类是单向的,即类B是类A的友元类,但类A不是类B的友元类友元类不能传递,即类B是类A的友元类,类C是类B的友元类,但类C不是类A的友元类

3.前项声明

使用前面两种方法,如果将两个类在不同的头文件中声明,则需要在第二个类中包含第一个类的头文件,但使用类的前向声明则不用使用#include"xxx",具体实现如下:

代码段1:在person.h头文件

#pragma once

#ifndef _PERSON_H

#define _PERSON_H

#include

#include

class Person

{

public:

Person(int _age, std::string _name) :age(_age), name(_name) {}

~Person() {};

void print() const

{

std::cout << name << " " << age << std::endl;

}

private:

int age;

std::string name;

};

#endif

代码段2:在teacher.h头文件中

#pragma once

#ifndef _TEACHER_H

#define _TEACHER_H

//#include "person.h" //前两种方法

class Person; //类的前向声明

class Teacher

{

public:

Teacher() {};

~Teacher() {};

void print(Person& person)

{

person.print();

}

};

#endif

代码段3:主文件main.cpp

#include

#include "person.h"

#include "teacher.h"

int main()

{

Person p(40, "lisan");

Teacher teacher;

teacher.print(p);

system("pause");

return 0;

}

注意:

类的前向声明只能用于定义指针、引用、以及用于函数形参的指针和引用前向声明的类是不完全的类型,因为只进行了声明而没有定义

前向声明的作用:

在预处理时,不需要包含#include"xxx",相对节约编译时间方便的解决两种类类型互相使用的问题。

4.单例模式

单例模式是程序设计模式中最常用的模式之一,其主要思想是将类的构造函数声明为私有的防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的实现由一个public的类方法代劳,该方法返回单例类唯一的实例。

注意:

采用单例模式的对象在进程结束才被释放。

关于单例模式的详细内容大家可以去看单例模式的知识。下面是一个典型的单例例子:

#include

#include

using namespace std;

class Singleton

{

public:

static Singleton* getInstance()

{

instance = new Singleton();

return instance;

}

~Singleton() {};

private:

Singleton() {};

static Singleton* instance;

};

下面看怎么在另一个类中使用单例模式实现成员函数的调用:

class Singleton

{

public:

static Singleton* getInstance()

{

if (instance == nullptr)

{

instance = new Singleton();

return instance;

}

else

return instance;

}

static void print_instance()

{

cout<

}

~Singleton() {};

private:

Singleton() {};

static Singleton* instance;

static int age;

static string name;

};

int Singleton::age = 20;

string Singleton::name = "lisan";

Singleton* Singleton::instance = nullptr;

class A

{

public:

void print_a()

{

Singleton::getInstance()->print_instance();

}

};

int main()

{

A a;

a.print_a();

system("pause");

return 0;

}

相关推荐

365be是啥 神武手游满级是多少级等级上限开放时间?(神武手游多少级有限制)
365be是啥 暖和的读音暖和的读音是什么
bt365官方网注册 自动锁屏推荐

自动锁屏推荐

⌛ 07-11 👁️ 3260
365bet娱乐场客户端 2025年最佳Telegram群组大全,优质免费电报群资源、技术、免费知识推荐!