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
字段初始化移到构造函数中,并在那里提供一个指针。另外请注意,现在在构造函数中,你正在为它声明一个同名的局部变量没有理由。你可能希望公寓有一个指向人的指针,而不仅仅是它的名字。