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

时间:2018-03-17 16:23:07

标签: c++

我正在尝试创建Contact的对象。但我无法用初始化列表做到这一点。当我删除新的内部Contact类构造函数时,它工作正常但是当我添加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;
}

1 个答案:

答案 0 :(得分:0)

  

联系类构造函数,它工作正常,但是当我添加new时,编译器会抛出错误。

你很可能意味着&#34;在我添加了复制构造函数后,编译器会抛出错误&#34;。

使用

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

显然是错的。您无法使用对象初始化指针。

您可以使用:

Contact john{"John Doe", address};                                          

仅限于:

  1. 给出参数的适当构造函数,或
  2. 没有用户定义的构造函数。
  3. 由于在添加复制构造函数后这两者都不成立,编译器会正确地将其指出为错误。

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

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

    <强> N.B。

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

    <强> N.B。 2

    main中,您有

    return;
    

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

    return 0;