如何让C++的Meny类访问Kund类中定义的Name和LastName成员?
解决Meny类访问Kund类成员的几种方法
当然有办法解决!你的问题核心是不同类之间的成员访问权限问题,Name和LastName属于Kund类的实例,Meny类默认没有访问权限。下面给你几种实用的解决方案,都是C++里常用的做法:
先把你的原代码贴出来方便对照:
#include <iostream> #include <cstdlib> #include <iomanip> #include <string> using namespace std; class Meny { public: void Meny2() { cout << "Welcome " << Name << LastName; // 报错:Name和LastName未在Meny中定义 } }; class Kund { public: string Name, LastName, personnummer; void LoggaIn() { cout << "Please enter your full name: " << endl; cin >> Name >> LastName; cout << "Please enter your social security number: " << endl; cin >> personnummer; } };
方案1:让Meny持有Kund对象的引用/指针(最推荐)
这是最符合面向对象设计的方式——让Meny类关联一个Kund对象,通过引用或指针来访问它的成员。这样两个类的职责清晰,耦合度也低。
修改后的代码示例:
#include <iostream> #include <cstdlib> #include <iomanip> #include <string> using namespace std; // 前向声明Kund类,告诉编译器这个类存在 class Kund; class Meny { private: Kund* m_kund; // 用指针持有Kund对象 public: // 构造函数:初始化时传入Kund对象的地址 Meny(Kund* kund) : m_kund(kund) {} void Meny2() { // 先检查指针是否有效,避免空指针错误 if (m_kund != nullptr) { cout << "Welcome " << m_kund->Name << " " << m_kund->LastName << endl; } } }; class Kund { public: string Name, LastName, personnummer; void LoggaIn() { cout << "Please enter your full name: " << endl; cin >> Name >> LastName; cout << "Please enter your social security number: " << endl; cin >> personnummer; } }; // 测试主函数 int main() { Kund myKund; myKund.LoggaIn(); // 先让用户输入信息 Meny myMeny(&myKund); // 把Kund对象的地址传给Meny myMeny.Meny2(); // 现在就能正常输出欢迎语了 return 0; }
方案2:直接把需要的成员作为参数传给Meny2()
如果Meny只需要Name和LastName这两个值,不需要和Kund对象有其他交互,直接传参数是最简单的方式:
修改后的Meny类和调用逻辑:
class Meny { public: // 直接接收名字和姓氏作为参数 void Meny2(const string& firstName, const string& lastName) { cout << "Welcome " << firstName << " " << lastName << endl; } }; // 主函数里这样调用 int main() { Kund myKund; myKund.LoggaIn(); Meny myMeny; myMeny.Meny2(myKund.Name, myKund.LastName); // 把Kund的成员传进去 return 0; }
方案3:把Meny设为Kund的友元类(不推荐,除非必要)
你可以在Kund类里声明Meny是它的友元,这样Meny就能直接访问Kund的所有成员(包括私有成员)。但这种方式会破坏类的封装性,让两个类耦合度变高,除非你有特殊需求,否则不建议用:
修改后的Kund类和Meny类:
class Meny; // 前向声明 class Kund { friend class Meny; // 声明Meny为友元,允许它访问所有成员 public: string Name, LastName, personnummer; void LoggaIn() { cout << "Please enter your full name: " << endl; cin >> Name >> LastName; cout << "Please enter your social security number: " << endl; cin >> personnummer; } }; class Meny { public: // 传入Kund对象的引用,直接访问它的成员 void Meny2(Kund& kund) { cout << "Welcome " << kund.Name << " " << kund.LastName << endl; } };
方案4:继承(完全不适合你的场景)
如果Meny是Kund的一种特殊类型,才考虑用继承,但显然这里Meny(菜单)和Kund(客户)是完全不同的概念,用继承会导致逻辑混乱,所以绝对不推荐这种方式。
内容的提问来源于stack exchange,提问作者filipanton1
相关产品推荐
相关产品推荐

