构造函数使指针类型的对象

时间:2016-10-10 11:33:33

标签: c++

我做了这个课

class Person {

public:

    Person(const std::string& name, const std::string& email, const std::string& city) 
    : name(name), email(email), city(city) {
    }

    bool hasCity() const {
        return city.compare("") == 0;
    }

    void print() const {
        std::cout << name + " <" + email + ">";
        if(hasCity()){
            std::cout << ", " + city;
        }
        std::cout << std::endl;
    }

    bool equalTo(const Person& comparedPerson) const {
        return email.compare(comparedPerson.email) != 0;
    }

    bool equalId(std::string comparedId){
        return email.compare(comparedId) != 0;
    }

    const std::string name;
    const std::string email;
    const std::string city;
};

对我来说有问题的是,当我尝试创建新人时:

const Person& newPerson = (const Person &) new Person(name, email, city);

我收到此错误

error: invalid cast of an rvalue expression of type 'Person*' to type 'const Person&'
     const Person& newPerson = (const Person &) new Person(name, email, city);

我想为什么新创建的Person是Person *而不仅仅是Person。

2 个答案:

答案 0 :(得分:9)

new返回指向对象的指针,而不是对象。 Person*代替Person。 实际上,既然你把它标记为C ++ 14,你就不应该使用带有动态分配的原始指针。

只需创建一个具有自动存储持续时间的变量:

Person newPerson(name, email, city);

或者,如果您需要指针,请使用std::unique_ptrstd::shared_ptr为您处理内存管理:

#include <memory>
auto ptr = std::make_unique<Person>(name, email, city);

答案 1 :(得分:2)

有两种市长方式可以创建一个&#34; Person&#34;在C ++中。 (或者更好地称之为:实例化对象)

只需使用自动存储持续时间的对象即可。你可以像这样创建它。

Person p(name, email, city);

您还可以创建对象的引用和指针:

Person* pP = &p;
Person& rP = p;

但请注意:当您离开当前范围时,此对象现在将已删除,并且所有引用和指针都将无效。

另一种方法是使用动态内存分配来分配动态存储持续时间的对象。

简单方式是使用new。

Person* p = new P(name, email, city); 

虽然当您手动创建原始指针时,您必须在某处手动删除

delete p;

动态内存分配对象的更好解决方案是智能指针。那些将是shared/unique指针。他们不需要手动删除这些对象。你可以创建这样的。

auto p = std::make_shared<Person>(name, email, city);

或使用make_unique获取唯一指针。

它们起初看起来像普通指针,但它们背后有一些机制,这使得使用它们更安全。有关这些内容的详细信息,请阅读共享和唯一指针及其区别。