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

By simon at 2018-02-07 • 0人收藏 • 43人看过

我需要创建一个代表密码的类,我也需要一个接口 用有一个方法创建一个密码对象and另一个类(发电机 ),实现接口.... 主要我需要用正常的构造函数创建一个对象和另一个 使用所述发生器的对象。

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);
}
我正在比较和printing所说的密码作为检查它是否工作的方式... 这是主要功能
int main(void)
{
    Password* pass1 = new Password("12345");
    IPassword* Generator = new PassGenerator();
    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;
    return 0;
}
我有的问题是对于pass1它打印“12345”,但为pass2和pass3 它没有打印任何东西...我不知道为什么。 Sry为我的坏英语。

4 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

Password PassGenerator::GenerateNewPass(string pass)
GenerateNewPass()返回一个Password对象。
Password* pass2 = &Generator->GenerateNewPass("12345");
返回的对象的地址保存在pass2。但是,返回 值总是临时对象,并立即被销毁。这个 导致留下一个悬挂指向一个被破坏的对象,在这里。当一个 对象是从一个函数返回的,它是一个获取的临时对象 毁坏为一旦它被使用。您可以将返回值保存为离散值 对象,例如:
Password pass2 = Generator->GenerateNewPass("12345");
但是保存一个地址临时对象导致指向一个 销毁临时对象,并尝试解除引用这个指针 结果n未定义的行为。

2018-02-07   #2

Password PassGenerator::GenerateNewPass(string pass)
GenerateNewPass()返回一个Password对象。
Password* pass2 = &Generator->GenerateNewPass("12345");
返回的对象的地址保存在pass2。但是,返回 值总是临时对象,并立即被销毁。这个 导致留下一个悬挂指向一个被破坏的对象,在这里。当一个 对象是从一个函数返回的,它是一个获取的临时对象 毁坏为一旦它被使用。您可以将返回值保存为离散值 对象,例如:
Password pass2 = Generator->GenerateNewPass("12345");
但是保存一个地址临时对象导致指向一个 销毁临时对象,并尝试解除引用这个指针 结果n未定义的行为。

2018-02-07   #3

你的错误很简单。你正在接受临时地址 Passwords,它们在每个t的返回时被破坏他generate 功能。要修复,使用指针_停止,或更改generate 函数,以便它们返回一个指针。

2018-02-07   #4

第一个问题是,你在哪里使用new 不必。这不是Java!你然后去了感谢每一个 那些动态分配的对象。生成函数是正确的: 只需创建values。 s第二个问题是,这样做导致你相信对象必须 无论你在哪里使用它们,都要用指针形式声明。这个是不正确的。 作为这两件事的结果,你必须“接受”这个地址 临时变量甚至得到一个p程序在你的风格进行编译。它的 相当具有讽刺意味,因为只有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;
}

登录后方可回帖

Loading...