Eu tenho uma classe "Funcionário" e quero criar uma série de ponteiros para isso.
Isso vai funcionar?
Employee *employeeArr[size];
No meu "for loop" algo assim
employeeArr[i] = new Employee(surname , firstname , gender); // constructor implemented Employee( para1, para2, para3)
OU devo escrever
Employee *employeeArr = new Employee[size];
E preencha tudo com "pontos" como
employeeArr[i].setSurname(surname);
Você pode explicar o motivo também, eu sou realmente novo em dicas. O segundo me foi contado por outra pessoa, mas não consegui obter uma resposta sobre por que não posso usar o primeiro. Além disso, se possível, não mencione std :: array ou std :: vector, ainda sou muito novo
Desculpe por surpreendê-lo:
Nenhum dos exemplos que você deu deve ser considerado como a "maneira correta" de lidar com coleções de classes em c ++.
Além disso, se possível, não mencione std :: array ou std :: vector, ainda sou muito novo
Não, esse é o caminho errado puxando a égua. O uso apropriado de ponteiros brutos e matrizes brutas certamente está além de suas capacidades, se você não souber como lidar com eles std::array
ou std::vector
principalmente.
Suponha que sua Employee
classe se pareça com
struct Employee {
std::string surname_;
std::string firstname_;
enum Gender {
Female = 'F' ,
Male = 'M' ,
Unxpecified = 'X'
} gender_;
};
e você tem uma sobrecarga para o std::operator>>()
std::istream& operator>>(std::istream& is, Employee& employee) {
char genderSymbol;
is >> employee.surname_ >> employee.firstname_ >> genderSymbol;
switch(genderSymbol) {
case 'F':
case 'M':
case 'X':
employee.gender_ = (Employee::Gender)genderSymbol;
break;
default:
is.setstate(std::ios_base::failbit);
break;
}
}
Uma maneira boa e idiomática de representar essa Employee
matriz seria usar um
std::vector<Employee> employeeArr;
e preencha em um loop:
Employee employee;
while(std::cin >> employee) {
employeeArr.emplace_back(employee);
}
Se você realmente precisa de ponteiros (referências), pode considerar o uso de ponteiros inteligentes, conforme fornecido com as classes do utilitário Dynamic Memory Management .
Por exemplo, você pode decidir ter um
std::vector<std::unique_ptr<Employee>> employeeArr;
e inicializá-lo como
while(std::cin >> surname >> firstname >> gender) {
employeeArr.emplace_back(std::make_unique<Employee>(surname , firstname , gender));
}
Isso é levado em consideração se você deseja gerenciar pools de instâncias de classe organizadas hierarquicamente, como:
struct Employee {
virtual ~Employee() {}
std::string surname_;
std::string firstname_;
enum Gender {
Female = 'F' ,
Male = 'M' ,
Unxpecified = 'X'
} gender_;
};
struct IForeman : Employee {
virtual std::vector<const Employee const*> TeamMembers() const = 0;
virtual void AddTeamMember(const Employee const* member) = 0;
};
class Foreman : public IForeman {
str::vector<const Employee const*> teamMembers_;
public:
std::vector<const Employee const*> TeamMembers() const {
return teamMembers_;
}
void AddTeamMember(const Employee const* member) {
teamMembers_.push_back(member);
}
};
Considere distribuir ponteiros próprios ou compartilhados para conexões relacionadas usando const
ponteiros simples .
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras