【发布时间】:2010-05-18 10:41:22
【问题描述】:
我正在尝试创建引用对象的构造函数。使用引用创建对象后,我需要打印两个对象的字段值。然后我必须删除第一个对象,并再次显示两个对象的字段值。我的班级 Person 看起来像这样:
class Person {
char* name;
int age;
public:
Person(){
int size=0;
cout << "Give length of char*" << endl;
cin >> size;
name = new char[size];
age = 0;
}
~Person(){
cout << "Destroying resources" << endl;
delete[] name;
delete age;
}
void init(char* n, int a) {
name = n;
age = a;
}
};
这是我的实现(使用函数 show() )。我的教授说,如果这个任务写得正确,它会返回一个错误。
#include <iostream>
using namespace std;
class Person {
char* name;
int age;
public:
Person(){
int size=0;
cout << "Give length of char*" << endl;
cin >> size;
name = new char[size];
age = 0;
}
Person(const Person& p){
name = p.name;
age = p.age;
}
~Person(){
cout << "Destroying resources" << endl;
delete[] name;
delete age;
}
void init(char* n, int a) {
name = n;
age = a;
}
void show(char* n, int a){
cout << "Name: " << name << "," << "age: " << age << "," << endl;
}
};
int main(void) {
Person *p = new Person;
p->init("Mary", 25);
p->show();
Person &p = pRef;
pRef->name = "Tom";
pRef->age = 18;
Person *p2 = new Person(pRef);
p->show();
p2->show();
system("PAUSE");
return 0;
}
【问题讨论】:
-
[C++ 对象的构造函数][1] [1] 的可能重复:stackoverflow.com/questions/2856156/constructors-for-c-objects
-
第一优先:删除
init函数并编写适当的构造函数。这是糟糕的 C++,不要走那条路。 -
@Konrad:我不完全确定我是否同意你的看法。有一个很好的论点是在构造函数中做的尽可能少,而在 Init 函数中做更多的工作。除其他外,它允许您返回错误而不诉诸异常处理。那就是说他在构造函数中进行分配,这样就会把我的观点从水中吹出来,因此说我不完全同意;)
-
@Goz:我认为这种模式是错误的。它看起来像
C,它可以(应该)是C++。这样做可能会导致未初始化的实例(又名“无效对象”)并且是违反直觉的。使用异常中止构造函数是干净的:如果初始化出错,则对象被正确销毁并且您在捕获的异常中拥有所需的所有信息。另一方面,您可以保证Person的任何实例都正确构建。 -
从析构函数中移除
delete age;:age没有被动态分配,所以你不能删除它。
标签: c++ reference constructor