C ++ Cant将对象设置为方法的返回对象

时间:2018-02-06 13:25:50

标签: c++ object interface

我需要创建一个代表密码的类,我还需要一个接口,它有一个创建密码对象的方法和另一个实现接口的类(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,它什么都没打印......我不知道为什么。

我的英语不好。

3 个答案:

答案 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函数以便它们返回指针。