我做了这个课
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。
答案 0 :(得分:9)
new
返回指向对象的指针,而不是对象。 Person*
代替Person
。
实际上,既然你把它标记为C ++ 14,你就不应该使用带有动态分配的原始指针。
只需创建一个具有自动存储持续时间的变量:
Person newPerson(name, email, city);
或者,如果您需要指针,请使用std::unique_ptr
或std::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
获取唯一指针。
它们起初看起来像普通指针,但它们背后有一些机制,这使得使用它们更安全。有关这些内容的详细信息,请阅读共享和唯一指针及其区别。