You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:01:41