Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从一个类到另一个类的指针_C++_Class_Pointers - Fatal编程技术网

C++ 从一个类到另一个类的指针

C++ 从一个类到另一个类的指针,c++,class,pointers,C++,Class,Pointers,你好,我想把“卖方”指向“名称” 但这给了我一个错误。请帮忙。 我收到错误“未定义名称” 我怎样才能找到一种方法将卖家分配到公寓? 多谢各位 class Person { public: friend class Apartment; Person() { cout << "~ "; }//constructor string name = "Mr.Smith\n"; stri

你好,我想把“卖方”指向“名称” 但这给了我一个错误。请帮忙。 我收到错误“未定义名称” 我怎样才能找到一种方法将卖家分配到公寓? 多谢各位

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();
};
班级人员{
公众:
朋友级公寓;
人(){
库特
我添加了错误。请按代码显示

好吧,在我写这个答案的时候,仍然是一个承诺……不管怎样,你提到的编译错误很可能是由这句话引起的:

string* Seller = &name;
说明:您试图引用一个名为
name
的变量。按照编写代码的方式,这将初始化指向类appartment(
this->name
)的类成员变量的指针,但它并不存在,正如你所评论的。但即使它存在,它也不会是你想要的字符串对象,因为你想要的是指向卖家名称的指针,而不是公寓的名称

然后,有相当多的事情是-嗯-让我们说“非传统”

首先,你的
Person
类中只有公共成员-那么你为什么需要任何朋友类呢???即使你将成员设置为私人,你也不应该将
公寓
设置为朋友。相反,提供适当的公共获取者。友谊提供私人成员的访问权限,通常是这两个朋友彼此之间的关系非常密切。假设您有一个类
X
管理另一个类
Y
的多个实例。类
Y
只能为其成员提供非常有限的访问权限,但包含类
X
所依赖的一些管理数据。然后您将
X
成为
Y
的朋友因此,
X
,但没有其他人可以访问管理数据。如果
Y
X
的一个内部类,但仍然是
X
的公共接口的一部分,通常(但并不总是)会出现这种情况

好的,回到你的课堂:

std::string getName() { return name; }
// or alternatively:
std::string name() { return m_name; }
我假设您希望能够有不同姓名的人,每个人都有自己的电话号码,或者可能有的人没有电话号码。我进一步假设您不希望任何人更改这些内容。因此:在构造函数中设置这些内容,并将其设为私有:

class Person
{
    std::string name;
    std::string phoneNo;
public:
    Person(std::string name, std::string no = "")
        : name(name), phoneNo(no)
    {
          std::cout << "~ ";
    }
};
我个人更喜欢第二个变量(尽管只是口味问题!),但这需要重命名成员变量(我选择了
m_name
,也可以是
\u name
name
或(几乎!)不管您喜欢什么;
\u 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!!!
};
啊哈,不是你让我…这样,公寓将需要私人访问的人(或其他人返回指针…).在试图解决这个问题之前,我问你:为什么你只想存储姓名而不是整个人?通过存储指针,你总是可以通过人的getter获取姓名,但你还可以在需要时访问该人的所有其他信息……然后你应该问自己另一个问题:我是吗在后一种情况下,你可以将此人作为参数添加到构造函数中,如果它对你有用,在前一种情况下,你应该(检查参数是否为
nullptr
,如果是,例如抛出一些异常…)

我现在假设您可以自己应用此更改,因此没有进一步的代码示例


但还是有一些关于整理数据的想法:人的姓名和地址由不同的子部分组成,比如名字(s!)和surename或街道、门牌号、邮政编码、城市和潜在的国家(代码+名称?)。现在想象一下,如果你想搜索所有的公寓,比如在Neu Ulm,它会变得多么丑陋(德国城市-猜,我住在那里…)。您现在必须解析应用程序中的所有地址-如果您将city作为单独的成员,则只需进行字符串比较。更进一步,如果您将城市作为单独的对象进行管理,则可以将搜索简化为简单的指针比较-一方面,非常高效,另一方面,您可以避免伴随红色的问题通过存储城市名称(大型数据库,在其中,您可以找到所有这些名称:“Neu Ulm”、“NEULM”、“New Ulm”、“New Ulm”-只是因为不同的用户输入的名称不同…。

“但它给了我一个错误。”我们不是读心术的人。@tkausl:我就知道你会这么说。哪个
名称
?每个
Person
类型的对象都会有另一个名称。你应该将
Seller
字段初始化移到构造函数中,并在那里提供一个指针。另外请注意,现在在构造函数中,你正在为它声明一个同名的局部变量没有理由。你可能希望公寓有一个指向
人的指针,而不仅仅是它的名字。