我需要创建一个代表密码的类,我还需要一个接口,它有一个创建密码对象的方法和另一个实现接口的类(Generator)....
在main中,我需要使用普通构造函数创建一个对象,使用所述生成器创建另一个对象。
def upload_image(request):
body = json.loads(request.body)
photo = body['photo']
img_format, img_str = photo.split(';base64,')
ext = img_format.split('/')[-1]
data = ContentFile(base64.b64decode(img_str), name='temp.' + ext) # You can save this as file instance.
try:
n_file = Files()
n_file.file = data
n_file.save()
return JsonResponse({'status': 'success'})
except Exception as err:
return JsonResponse({'status': 'failed'})
这是接口和生成器
class Password
{
private:
Password& operator=(const Password&);
friend ostream& operator<<(ostream&, const Password&);
friend bool operator==(const Password&, const Password&);
string password;
public:
Password(string);
string Encrypt() const;
};
Password::Password(string pass) :password(pass) {}
string Password::Encrypt() const
{
string encryptedPass = password;
for (int i = 0; i < password.length(); i++)
encryptedPass[i] = '*';
return encryptedPass;
}
bool operator==(const Password& pass1, const Password& pass2)
{
return pass1.password == pass2.password;
}
ostream& operator<<(ostream& output, const Password& pass)
{
output << "Password: " << pass.password;
return output;
}
Password& Password::operator=(const Password& pass)
{
this->password = pass.password;
return *this;
}
我正在比较和打印所述密码作为检查它是否有效的一种方式... 这是主要功能
class IPassword
{
public:
virtual Password GenerateSaltedPass(string pass, int salt) = 0;
virtual Password GenerateNewPass(string pass) = 0;
};
class PassGenerator:public IPassword
{
public:
virtual Password GenerateSaltedPass(string, int);
virtual Password GenerateNewPass(string);
};
Password PassGenerator::GenerateSaltedPass(string pass, int salt)
{
string aux = pass;
for (int i = 0; i < salt; i++)
aux += (rand() / (float)RAND_MAX * 90 + 65);
return Password(aux);
}
Password PassGenerator::GenerateNewPass(string pass)
{
return Password(pass);
}
我遇到的问题是,对于pass1,它会打印&#34; 12345&#34; 但对于pass2和pass3,它什么都没打印......我不知道为什么。
我的英语不好。
答案 0 :(得分:1)
Password PassGenerator::GenerateNewPass(string pass)
GenerateNewPass()
会返回Password
个对象。
Password* pass2 = &Generator->GenerateNewPass("12345");
返回对象的地址保存在pass2
中。但是,返回的值始终是临时对象,它们会立即被销毁。这导致在此处留下指向被破坏对象的悬空指针。当从函数返回一个对象时,它是一个临时对象,一旦被使用就会被销毁。您可以将返回的值保存在离散对象中,例如:
Password pass2 = Generator->GenerateNewPass("12345");
但保存临时对象的地址会导致指向已销毁的临时对象的指针,并且尝试取消引用此指针将导致未定义的行为。
答案 1 :(得分:1)
第一个问题是,您在任何地方都使用new
,而您不必这样做。这不是Java!然后你去掉了那些动态分配的对象中的每一个。生成函数使其正确:只需创建值。
第二个问题是,这样做会让您相信无论您在何处使用对象,都必须以指针形式声明对象。事实并非如此。
由于这两件事,你必须&#34;必须&#34;获取临时变量的地址,甚至可以获得您的样式中的程序进行编译。这很讽刺,因为只有Visual Studio才会接受这个代码;标准认为它是非法的,使用这些指针有不确定的行为。
最后,你的==
操作在逻辑上是不正确的,因为你在比较指针而不是指向的东西。
相反,只需:
int main()
{
Password pass1("12345");
PassGenerator Generator;
Password pass2 = Generator.GenerateNewPass("12345");
Password saltedPass = Generator.GenerateSaltedPass("1234", 4);
cout << "Passwords are same? " << (pass1 == pass2) << endl;
cout << pass1 << endl;
cout << pass2 << endl;
cout << saltedPass << endl;
}
答案 2 :(得分:0)
您的错误非常简单。您正在获取临时Password
的地址,这些地址在每个generate
函数返回时被销毁。要修复,停止使用指针,或更改generate
函数以便它们返回指针。