gpt4 book ai didi

c++ - 为什么我不能在下面的 C++ 示例中使用对象的初始化列表构造

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:25 24 4
gpt4 key购买 nike

我正在尝试创建联系人对象。但是我无法使用初始化列表来做到这一点。当我在 Contact 类构造函数中删除 new 时,它工作正常,但是当我添加 new 时,编译器会抛出错误。我想了解为什么我无法使用初始化列表。哪些地方可以使用初始化列表,哪些地方不可以?

#include"stdafx.h"
#include<string>
using namespace std;

struct Address
{
string street;
string city;
};

struct Contact
{
string name;
Address* address;
Contact(const Contact& other)
: name{other.name},
address( new Address(*other.address) ) {}
~Contact()
{
//delete work_address;
}
};

int main()
{
auto address = new Address{ "123 East Dr", "London" };
//Issue while creating john and jane below
//Compiler error: Cannot initialize john with initializer list
Contact john{ "John Doe", address };
Contact jane{ "Jane Doe", address };
delete address;
getchar();
return;
}

最佳答案

Contact class constructor, it works fine but when I add new, compiler throws an error.

您的意思很可能是“在我添加复制构造函数后,编译器抛出错误”。

使用

Contact(const Contact& other)
: name{other.name},
address( Address(*other.address) ) {} // Without the new

显然是错误的。您不能使用对象初始化指针。

您可以使用:

Contact john{"John Doe", address};                                          

仅当:

  1. 在给定参数的情况下有一个合适的构造函数,或者
  2. 没有用户定义的构造函数。

由于在添加复制构造函数后这些都不成立,编译器正确地将其指出为错误。

您可以通过添加另一个用户定义的构造函数来解决这个问题:

Contact(string const& n, Address* a) : name(n), address(a) {}

注意

请注意,您需要关注The Rule of Three给你上课。否则,您将在运行时遇到问题。


注意2

main 中,你有

return;

这是不正确的。您应该删除该行或将其更改为

return 0;

关于c++ - 为什么我不能在下面的 C++ 示例中使用对象的初始化列表构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49339146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com