指针从一个类到另一个类

时间:2017-12-04 08:11:04

标签: c++ class pointers

你好我想把“卖家”指向“名字” 但它给了我一个错误。请帮忙。 我收到错误“名称未定义” 如何制定将卖家分配给公寓的方法? 谢谢

class Person {
    public:
        friend class Apartment;
        Person() {
          cout << "~ ";
        }//constructor
        string name = "Mr.Smith\n";
        string TelNumber = "01";
        int age = 0;
};


class Apartment {
    public:


        string Address = "jyu";
        double Area = 74.0;
        double Price = 320.0;
        int numberOfRooms = 3;
        //string name = "d";
        string *Seller = &name;
        //Apartment(string *Seller = null) {

        //}
        // constructor for seller
         Apartment () {
            string *Seller=nullptr;
         }
       // Apartment::Apartment();
};

1 个答案:

答案 0 :(得分:1)

  

我添加错误。请按代码告诉我

那么,在我写这个答案的时候,仍然是一个承诺......无论如何,你提到的编译错误很可能是由这一行引起的错误:

string* Seller = &name;

说明:您尝试引用一个名为name的变量。编写代码的方式,这会初始化指向类appartment(this->name)的类成员变量的指针,但是,当你注释掉它时,它不存在。但即使它存在,它也不是你想要的字符串对象,因为你想要一个指向卖家名字的指针,而不是公寓的名字...

然后,有很多东西 - 嗯 - 让我们说“非常规”......

首先,你的Person课程中只有公共成员 - 所以为什么你需要任何朋友课?即使您将会员设为私人,也不应该让Appartment成为朋友。相反,提供适当的公共吸气剂。友谊提供对私人成员的访问,通常这两个朋友彼此密切相关。想象一下,你有一个班X管理另一个Y的几个实例。类Y只能提供对其成员的非常有限的访问权限,但包含类X所依赖的一些管理数据。然后,您将X设为Y的朋友,以便X,但没有其他人可以访问管理数据。如果YX的内部类,但仍然是X公共接口的一部分,则会经常(但并非总是如此)...

好的,回到你的班级:

我假设您希望能够拥有不同名称的不同人员,每个人都有自己的电话号码 - 或者可能有一些人没有。我进一步假设您不希望任何人更改这些内容。所以:在构造函数中设置它们并将它们设为私有:

class Person
{
    std::string name;
    std::string phoneNo;
public:
    Person(std::string name, std::string no = "")
        : name(name), phoneNo(no)
    {
          std::cout << "~ ";
    }
};

我遗漏了age - 实际上,更喜欢出生日:年龄不仅可以,而且 肯定会改变(除非你正在编程)某场比赛的比赛时间短于一年,或者人们根本不参加比赛......)。通过使用出生日,您无需定期更新您的人,并可以在需要时计算年龄。哦,不要像constructor那样添加注释 - 每个经验最少的C ++程序员都能够通过查看一个没有返回值的函数来识别构造函数 - 所以你只是破坏你的代码。

好的,很可能,你需要读取这个人的成员,所以我们还需要一些吸气剂到你班级的公共部分:

std::string getName() { return name; }
// or alternatively:
std::string name() { return m_name; }

我个人更喜欢第二种变体(只是品味问题!),但这需要重命名成员变量(我选择了m_name,也可能是_name或{{1或者(差不多!)你喜欢什么; name_,但是,它会被保留:任何以下划线开头,后面跟大写字母的标识符和任何一个有两个标识符的标识符一样随后的下划线。)

现在你可以像这样构建你的人:

_Name

公寓现在非常相似:

Person smith("Mr.Smith", "01");
Person me("Aconcagua"); // no phone number; did you notice the default parameter?
<啊>啊哈,不是你有我......这样,公寓 需要私人访问这个人(或另一个获取者返回指针的人......)。然而,在尝试修复之前,我问你:为什么你只想存储名称而不是整个人?通过存储指针,您总是通过此人的获取者获取名称,但您还可以在需要时访问该人员的所有其他信息...然后您应该问自己另一个问题:是否相关每个公寓都有卖家或没有公寓吗?在后一种情况下,可以将人员作为参数添加到构造函数中,如果它对您有用,在前一种情况下,您应该(并检查,如果参数是class Apartment { std::string _address; // all the other members std::string* _seller; public: Apartment(std::string address, /* and other ones as needed! */); // getters (and setters?) as needed std::string* seller() { return _seller; } void seller(Person* person) { _seller = &person->_name; } // big oops!!! }; ,如果是,例如抛出一些异常......)。

我现在假设你可以自己应用这个改变,所以没有进一步的代码示例......

但是仍然有一些关于组织数据的想法:人的姓名和地址由不同的子部分组成,例如forename(s!)和surename或street,门牌号,邮政编码,城市和可能的国家(代码+名称?)。现在想象一下,如果你想搜索所有的公寓,它会变得多么丑陋。 G。在新乌尔姆(德国的城市 - 猜,我住在那里......)。您现在必须解析应用程序中的所有地址 - 如果您将city作为单独的成员,则可以进行字符串比较。更进一步:如果您将城市作为单独的对象进行管理,则可以将搜索简化为简单的指针比较 - 一方面非常有效,另一方面,您可以避免出现问题,并伴随着您通过存储城市而引入的冗余问题。名字(大型数据库,在那里,你找到所有这些:&#34; Neu-Ulm&#34;,&#34; Neuulm&#34;,&#34; New Ulm&#34;,&#34; new乌尔姆&#34; - 只是因为不同的用户以不同的方式输入了名字......)。