为什么在代码中使用指向指针的指针?
Why pointer to pointer was used in the code?
为什么代码中使用了指向指针的指针而不是单个指针?另外你认为析构函数写错了,如果是我怎么才能把它改正?
指向指针的指针:employee** _arr;
您可以看到下面的代码:
#include<iostream>
class employee {
private:
std::string _name;
std::string _surname;
int _year;
double _salary;
static int numberOfEmployees;
public:
employee() {
_name = "not-set";
_surname = "not-set";
_year = 0;
_salary = 0;
numberOfEmployees++;
}
employee(int year, std::string name, std::string surname) {
_name = name;
_surname = surname;
_year = year;
numberOfEmployees++;
calculateSalary();
}
void calculateSalary() {
//salary = 2310 + 2310 * year * 12/100.0
_salary = 2310 + (2310 * (double)_year) * (12 / 100.0);
}
void printInfo() {
std::cout << _name << " " << _surname << " " << _year << " " << " " << _salary << " TL/month" << std::endl;
}
static int getEmployeeCount() {
return numberOfEmployees;
}
};
class employeeList {
private:
int _size;
int _lenght;
employee** _arr;
public:
employeeList() :_size(1), _lenght(0), _arr(NULL) {}
employeeList(int size) :_size(size) {
_arr = new employee * [_size];
_lenght = 0;
}
int listLength() {
return _lenght;
}
employee retrieve_employeeFromIndex(int index) {
if (index >= 0 && index < _size) {
return *_arr[index];
}
}
void addToList(employee* item) {
_lenght++;
if (_lenght <= _size) {
_arr[_lenght - 1] = item;
}
else {
std::cout << "you cannot add another employee!";
}
}
static void printEmployees(employeeList el) {
for (int i = 0; i < el._lenght; i++) {
el._arr[i]->printInfo();
}
}
~employeeList() {
delete[] _arr;
}
};
int employee::numberOfEmployees = 0;
int main() {
employee a;
employee b(5, "John", " Doe");
employee c(3, "Sue", "Doe");
employeeList empList(employee::getEmployeeCount());
empList.addToList(&a);
empList.addToList(&b);
empList.addToList(&c);
employeeList::printEmployees(empList);
std::cout << empList.listLength() << std::endl;
return 0;
}
可以看到输出:
为什么代码中使用了指向指针的指针而不是单个指针?另外你认为析构函数写错了,如果是我怎么才能把它改正?
我不是专家,但你会破坏你的话题:P
我认为这个问题并不精确。你的意思是指向指针的指针:?
员工** _arr;
因为指向一个指针:
_arr = 新员工 * [_size];
我认为它有意义,因为数组是一个指针?当然我可能是错的因为我刚开始做教育。
你为什么认为 destruktor 是错误的?它正在删除一个指针。
Why pointer to pointer was used in the code?
这只有编写代码的作者知道。我们可以合理猜测他们的意图可能是:
- 分配一个动态对象数组,使用指向该数组第一个元素的裸指针。
- 间接指向存储在别处的对象,因此他们想使用指针数组,因此指向数组第一个元素的指针是指向指针的指针。
他们的选择 1. 没有必要使用自有裸指针,还有更好的选择,不需要自有裸指针。最常见的是,std::vector
将用于创建动态数组。
他们的选择 2. 间接指向不属于 class 实例的对象不如让 class 实例拥有这些对象那么安全,但无论如何可能有根据他们选择这种设计的原因,这是一个合理的选择。如果没有程序应该做什么的文档,就不可能判断这个选择是否正确。根据 class 的通用名称,我怀疑这不是一个好的选择。
do you think the destructor was written wrong
也算是正确了。 class 还有其他问题。
整个 employeeList
class 似乎 毫无意义 ,可以很容易地用 std::vector
代替。 printEmployees
是唯一不会由向量直接提供的成员函数。您可以为此使用非成员函数。
为什么代码中使用了指向指针的指针而不是单个指针?另外你认为析构函数写错了,如果是我怎么才能把它改正?
指向指针的指针:employee** _arr;
您可以看到下面的代码:
#include<iostream>
class employee {
private:
std::string _name;
std::string _surname;
int _year;
double _salary;
static int numberOfEmployees;
public:
employee() {
_name = "not-set";
_surname = "not-set";
_year = 0;
_salary = 0;
numberOfEmployees++;
}
employee(int year, std::string name, std::string surname) {
_name = name;
_surname = surname;
_year = year;
numberOfEmployees++;
calculateSalary();
}
void calculateSalary() {
//salary = 2310 + 2310 * year * 12/100.0
_salary = 2310 + (2310 * (double)_year) * (12 / 100.0);
}
void printInfo() {
std::cout << _name << " " << _surname << " " << _year << " " << " " << _salary << " TL/month" << std::endl;
}
static int getEmployeeCount() {
return numberOfEmployees;
}
};
class employeeList {
private:
int _size;
int _lenght;
employee** _arr;
public:
employeeList() :_size(1), _lenght(0), _arr(NULL) {}
employeeList(int size) :_size(size) {
_arr = new employee * [_size];
_lenght = 0;
}
int listLength() {
return _lenght;
}
employee retrieve_employeeFromIndex(int index) {
if (index >= 0 && index < _size) {
return *_arr[index];
}
}
void addToList(employee* item) {
_lenght++;
if (_lenght <= _size) {
_arr[_lenght - 1] = item;
}
else {
std::cout << "you cannot add another employee!";
}
}
static void printEmployees(employeeList el) {
for (int i = 0; i < el._lenght; i++) {
el._arr[i]->printInfo();
}
}
~employeeList() {
delete[] _arr;
}
};
int employee::numberOfEmployees = 0;
int main() {
employee a;
employee b(5, "John", " Doe");
employee c(3, "Sue", "Doe");
employeeList empList(employee::getEmployeeCount());
empList.addToList(&a);
empList.addToList(&b);
empList.addToList(&c);
employeeList::printEmployees(empList);
std::cout << empList.listLength() << std::endl;
return 0;
}
可以看到输出:
为什么代码中使用了指向指针的指针而不是单个指针?另外你认为析构函数写错了,如果是我怎么才能把它改正?
我不是专家,但你会破坏你的话题:P 我认为这个问题并不精确。你的意思是指向指针的指针:? 员工** _arr; 因为指向一个指针: _arr = 新员工 * [_size]; 我认为它有意义,因为数组是一个指针?当然我可能是错的因为我刚开始做教育。 你为什么认为 destruktor 是错误的?它正在删除一个指针。
Why pointer to pointer was used in the code?
这只有编写代码的作者知道。我们可以合理猜测他们的意图可能是:
- 分配一个动态对象数组,使用指向该数组第一个元素的裸指针。
- 间接指向存储在别处的对象,因此他们想使用指针数组,因此指向数组第一个元素的指针是指向指针的指针。
他们的选择 1. 没有必要使用自有裸指针,还有更好的选择,不需要自有裸指针。最常见的是,std::vector
将用于创建动态数组。
他们的选择 2. 间接指向不属于 class 实例的对象不如让 class 实例拥有这些对象那么安全,但无论如何可能有根据他们选择这种设计的原因,这是一个合理的选择。如果没有程序应该做什么的文档,就不可能判断这个选择是否正确。根据 class 的通用名称,我怀疑这不是一个好的选择。
do you think the destructor was written wrong
也算是正确了。 class 还有其他问题。
整个 employeeList
class 似乎 毫无意义 ,可以很容易地用 std::vector
代替。 printEmployees
是唯一不会由向量直接提供的成员函数。您可以为此使用非成员函数。