【问题标题】:Constructor making object of pointer type构造指针类型的对象
【发布时间】:2016-10-10 11:33:32
【问题描述】:

我做了这门课

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;
};

对我来说有问题的是,当我尝试使用以下方式创建新 Person 时:

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。

【问题讨论】:

  • 看看智能指针:std::unique_ptrstd::shared_ptr。操作分配的内存是一种更好的做法
  • 只需做const Person&amp; newPerson = Person(name, email, city);
  • 另外,我认为hasCity 的逻辑不正确。现在你正在使用手写检查city == ""(或city.empty()),这意味着没有没有城市。
  • 从 C++ 开始时,您可能会发现阅读 good book 很有用。
  • const Person&amp; newPerson = (const Person &amp;) new Person(name, email, city);你从哪里听说这是如何创建对象的?

标签: c++


【解决方案1】:

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);

【讨论】:

  • 哇。太感谢了。正如您在 c++ 新手中可能意识到的那样 :),这就是诀窍!
【解决方案2】:

有两种方法可以在 C++ 中创建“Person”。 (或者这更好地称为:实例化一个对象)

一种方法是简单地使用具有自动存储持续时间的对象。你可以像这样创建它。

Person p(name, email, city);

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

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

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

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

简单的方式是使用new。

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

虽然当您手动创建带有 new 的原始指针时,您必须在某处手动删除它们

delete p;

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

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

或使用make_unique 作为唯一指针。

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

【讨论】:

  • 请尽量不要传播陈旧不准确的“stack vs heap”!
  • @LightnessRacesinOrbit 你想详细说明一下吗?我的意思是我在这里没有讨论优点/缺点的“vs”。只是提到这两种类型,因为我经常看到来自例如的人。 java过来并默认为“new”只是不知道您可以声明局部变量。所以我想我只是提到还有另一种方法。我想给他们命名堆栈/堆在这里似乎准确。
  • @LightnessRacesinOrbit 哦。谢谢你。所以我似乎在这里使用“旧”词汇来描述这些事情。我将其更改为适当的名称。 :)
猜你喜欢
  • 2023-02-09
  • 2015-11-05
  • 2011-02-09
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多