vector.push_back 无法处理模板 class C++
vector.push_back not working on template class C++
所以我写了那个代码,它得到一个 in 文件供读取,将它读入一个对象的临时变量,然后 push_back 它到一个向量作为容器。
但是...它不起作用,在最后一个之后,所有变量都获取文件中读取的最后一个对象的信息!
设置对象class:
template <typename Objeto, typename Container>
void setObjetos(const string& nome, Container& objetos){
ifstream in (nome.c_str());
Objeto temporario;
while(in >> temporario){
cout << "temporario: " << temporario << endl;
objetos.push_back(temporario);
cout << "Objetos.front():" << objetos.front() << endl;
cout << "Objetos.back():" << objetos.back() << endl;
}
in.close();
for (auto it : objetos) {
cout << "Objeto it em set apos while: "<< endl << it;
}
}
然后,我得到了调用它的 class,例如:
class 收到要验证的对象,然后,我从“SetObjectos”获取对象容器并进行一些比较:
template <typename Objeto>
template <typename Objeto, typename Container>
int verifica(Objeto objeto, const string& nome){
existe(nome);
Container objetos;
setObjetos<Objeto, Container>(nome, objetos);
for (auto it : objetos) {
cout << "Objeto it: "<< endl << it;
if (strcmp(it.getChave(), objeto.getChave()) == 0){
return 1;
}
}
return 0;
}
这就是我调用 verifica 函数的方式,例如,在登录情况下:
void Clinica::login(const string& arquivo)
{
char* usuario = new char[12];
char* senha = new char[12];
cout << endl << "INSIRA O USUARIO: ";
cin >> usuario;
cout << endl << "INSIRA A SENHA: ";
cin >> senha;
Usuario user(usuario, senha, '0');
user.setChave();
if (!verifica<Usuario, vector<Usuario>>(user, arquivo)){
cout << endl << "USUARIO OU SENHA INVALIDOS!" << endl;
}else{
Usuario temp = getObjeto<Usuario>(user, arquivo);
if (strcmp(temp.getSenha(), user.getSenha()) == 0){
user = temp;
temp.~Usuario();
switch (user.getTipo()) {
case 'A':
this->menuAdministrador(user);
break;
case 'B':
this->menuAssistenteAdministrativo(user);
break;
case 'G':
this->menuUsuarioGeral(user);
break;
}
}else{
cout << endl << "USUARIO OU SENHA INVALIDOS!" << endl;
}
}
}
然后,就是我的用户对象:
#include "usuario.hpp"
Usuario::Usuario(){}
Usuario::Usuario(const char usuario[12], const char senha[12], const char& tipo):
usuario((char*)usuario), senha((char*)senha), tipo(tipo){}
Usuario::~Usuario(){}
void Usuario::setUsuario(const char usuario[12]){
this->usuario = (char*)usuario;
}
void Usuario::setSenha(const char senha[12]){
this->senha = (char*)senha;
}
void Usuario::setTipo(const char tipo){
this->tipo = tipo;
}
char* Usuario::getUsuario(){
return this->usuario;
}
char* Usuario::getSenha(){
return this->senha;
}
char Usuario::getTipo(){
return this->tipo;
}
void Usuario::setChave(char* chave){
this->chave.setChave( chave );
}
void Usuario::setChave(){
this->chave.setChave( usuario );
}
char* Usuario::getChave(){
return this->chave.getChave();
}
ostream& operator <<(ostream& out, const Usuario& user){
out << user.chave << "\n" << user.usuario << "\n" << user.senha << "\n" << user.tipo << endl;
return out;
}
istream& operator >>(istream& in, Usuario& user){
in >> user.chave;
in >> user.usuario;
in >> user.senha;
in >> user.tipo;
return in;
}
它得到一个 public 呃我真的不知道它的英文名字,我们在葡萄牙语中称它为 herança,java 它就像延伸......但我想你们知道我的意思是......好吧,用户从 Chave 扩展,这是每个 class 都有的唯一键,所以当我想在我的模板 class:
中进行一些比较和填充时
#include "chave.hpp"
Chave::Chave(){}
Chave::~Chave(){}
void Chave::setChave(char* chave){
this->chave = chave;
}
char* Chave::getChave(){
return this->chave;
}
ostream& operator<<(ostream& out, const Chave& chave){
out << chave.chave;
return out;
}
istream& operator>>(istream& in, Chave& chave){
in >> chave.chave;
return in;
}
代码示例输出:
temporario: admin
admin
admin
A
Objetos.front():admin
admin
admin
A
Objetos.back():admin
admin
admin
A
temporario: teste
teste
testando
G
Objetos.front():teste
teste
testando
A
Objetos.back():teste
teste
testando
G
temporario: 1'244
1'244
134223
G
Objetos.front():1'244
1'244
134223
A
Objetos.back():1'244
1'244
134223
G
temporario: 43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objetos.front():43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
A
Objetos.back():43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it em set apos while:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
A
Objeto it em set apos while:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it em set apos while:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it em set apos while:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
A
Objeto it:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
最后出现的是用户提示的字符,第一个是密钥,然后是用户名,然后是密码。
好像后退功能没用了!开始时的对象应始终为 admin,但它会被后面的对象替换,然后,过了一会儿,向量中的每个变量都被重写为在 char 类型 val 旁边输入的最后一个对象。
那个方法很管用……比如,今天!
然后那开始发生了!
有人能帮我吗?
感谢大家的阅读和帮助
如果你们想要更好的视图,这里是代码的回购:
https://github.com/bruno-augusto-pinto/TP01-CPLUSPLUS
Container objetos;
这是本地的,被丢弃了。
您的 Usuario
需要使用标准字符串,而不是原始 C 缓冲区。它可能使用了悬挂指针。
所以我写了那个代码,它得到一个 in 文件供读取,将它读入一个对象的临时变量,然后 push_back 它到一个向量作为容器。 但是...它不起作用,在最后一个之后,所有变量都获取文件中读取的最后一个对象的信息!
设置对象class:
template <typename Objeto, typename Container>
void setObjetos(const string& nome, Container& objetos){
ifstream in (nome.c_str());
Objeto temporario;
while(in >> temporario){
cout << "temporario: " << temporario << endl;
objetos.push_back(temporario);
cout << "Objetos.front():" << objetos.front() << endl;
cout << "Objetos.back():" << objetos.back() << endl;
}
in.close();
for (auto it : objetos) {
cout << "Objeto it em set apos while: "<< endl << it;
}
}
然后,我得到了调用它的 class,例如: class 收到要验证的对象,然后,我从“SetObjectos”获取对象容器并进行一些比较:
template <typename Objeto>
template <typename Objeto, typename Container>
int verifica(Objeto objeto, const string& nome){
existe(nome);
Container objetos;
setObjetos<Objeto, Container>(nome, objetos);
for (auto it : objetos) {
cout << "Objeto it: "<< endl << it;
if (strcmp(it.getChave(), objeto.getChave()) == 0){
return 1;
}
}
return 0;
}
这就是我调用 verifica 函数的方式,例如,在登录情况下:
void Clinica::login(const string& arquivo)
{
char* usuario = new char[12];
char* senha = new char[12];
cout << endl << "INSIRA O USUARIO: ";
cin >> usuario;
cout << endl << "INSIRA A SENHA: ";
cin >> senha;
Usuario user(usuario, senha, '0');
user.setChave();
if (!verifica<Usuario, vector<Usuario>>(user, arquivo)){
cout << endl << "USUARIO OU SENHA INVALIDOS!" << endl;
}else{
Usuario temp = getObjeto<Usuario>(user, arquivo);
if (strcmp(temp.getSenha(), user.getSenha()) == 0){
user = temp;
temp.~Usuario();
switch (user.getTipo()) {
case 'A':
this->menuAdministrador(user);
break;
case 'B':
this->menuAssistenteAdministrativo(user);
break;
case 'G':
this->menuUsuarioGeral(user);
break;
}
}else{
cout << endl << "USUARIO OU SENHA INVALIDOS!" << endl;
}
}
}
然后,就是我的用户对象:
#include "usuario.hpp"
Usuario::Usuario(){}
Usuario::Usuario(const char usuario[12], const char senha[12], const char& tipo):
usuario((char*)usuario), senha((char*)senha), tipo(tipo){}
Usuario::~Usuario(){}
void Usuario::setUsuario(const char usuario[12]){
this->usuario = (char*)usuario;
}
void Usuario::setSenha(const char senha[12]){
this->senha = (char*)senha;
}
void Usuario::setTipo(const char tipo){
this->tipo = tipo;
}
char* Usuario::getUsuario(){
return this->usuario;
}
char* Usuario::getSenha(){
return this->senha;
}
char Usuario::getTipo(){
return this->tipo;
}
void Usuario::setChave(char* chave){
this->chave.setChave( chave );
}
void Usuario::setChave(){
this->chave.setChave( usuario );
}
char* Usuario::getChave(){
return this->chave.getChave();
}
ostream& operator <<(ostream& out, const Usuario& user){
out << user.chave << "\n" << user.usuario << "\n" << user.senha << "\n" << user.tipo << endl;
return out;
}
istream& operator >>(istream& in, Usuario& user){
in >> user.chave;
in >> user.usuario;
in >> user.senha;
in >> user.tipo;
return in;
}
它得到一个 public 呃我真的不知道它的英文名字,我们在葡萄牙语中称它为 herança,java 它就像延伸......但我想你们知道我的意思是......好吧,用户从 Chave 扩展,这是每个 class 都有的唯一键,所以当我想在我的模板 class:
中进行一些比较和填充时#include "chave.hpp"
Chave::Chave(){}
Chave::~Chave(){}
void Chave::setChave(char* chave){
this->chave = chave;
}
char* Chave::getChave(){
return this->chave;
}
ostream& operator<<(ostream& out, const Chave& chave){
out << chave.chave;
return out;
}
istream& operator>>(istream& in, Chave& chave){
in >> chave.chave;
return in;
}
代码示例输出:
temporario: admin
admin
admin
A
Objetos.front():admin
admin
admin
A
Objetos.back():admin
admin
admin
A
temporario: teste
teste
testando
G
Objetos.front():teste
teste
testando
A
Objetos.back():teste
teste
testando
G
temporario: 1'244
1'244
134223
G
Objetos.front():1'244
1'244
134223
A
Objetos.back():1'244
1'244
134223
G
temporario: 43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objetos.front():43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
A
Objetos.back():43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it em set apos while:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
A
Objeto it em set apos while:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it em set apos while:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it em set apos while:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
A
Objeto it:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
Objeto it:
43987523987dhgdfhjfd
43987523987dhgdfhjfd
fsdjikughfkfhdg
G
最后出现的是用户提示的字符,第一个是密钥,然后是用户名,然后是密码。
好像后退功能没用了!开始时的对象应始终为 admin,但它会被后面的对象替换,然后,过了一会儿,向量中的每个变量都被重写为在 char 类型 val 旁边输入的最后一个对象。
那个方法很管用……比如,今天! 然后那开始发生了! 有人能帮我吗? 感谢大家的阅读和帮助
如果你们想要更好的视图,这里是代码的回购: https://github.com/bruno-augusto-pinto/TP01-CPLUSPLUS
Container objetos;
这是本地的,被丢弃了。
您的 Usuario
需要使用标准字符串,而不是原始 C 缓冲区。它可能使用了悬挂指针。