2

菜鸟在这里。从书本上做练习时有疑问。

疑问如下:为什么如果我使用const std::string *作为方法的参数,编译器会向我发送以下错误:no matching function for call to 'BankAccount::define(const char [11], const char [11], int)'在客户端?

如果我交换方法的原型和定义以接受const std::string &作为参数(就像我在构造函数中所做的那样),编译器就没有问题。

客户:

// usebacnt.cpp --

#include "BankAccount.h"
#include <iostream>

int main()
{
    BankAccount john;
    BankAccount mary("Mary Wilkinson", "5000000000"); // balance set to 0 because of default argument
    john.display();
    mary.display();
    john.define("John Smith", "4000000000", 26); // error line
    mary.deposit(1000.50);
    john.withdraw(25);
    john.display();
    mary.display();
    std::cin.get();
    return 0;
}

类声明:

// BankAccount.h -- Header file for project Exercise 10.1

#ifndef BANKACCOUNT_H_
#define BANKACCOUNT_H_

#include <string>

class BankAccount
{
private:
    std::string fullName;
    std::string accountNumber;
    double balance;
public:
    BankAccount(); // default constructor
    BankAccount(const std::string &fN, const std::string &aN, double b = 0.0); // constructor with a default argument
    void display() const;
    void deposit(double amount);
    void withdraw(double amount);
    void define(const std::string *pfN, const std::string *paN, double b);
};

#endif

类实现:

// methods.cpp -- Compile alongside usebacnt.cpp

#include "BankAccount.h"
#include <iostream>

void BankAccount::display() const
{
    using std::cout;
    using std::ios_base;
    ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield); // formatting output and saving original
    cout.precision(2);
    cout << "Full Name: " << fullName << '\n';
    cout << "Account Number: " << accountNumber << '\n';
    cout << "Balance: " << balance << "\n\n";
    cout.setf(orig);
}

void BankAccount::deposit(double amount)
{
    if (amount < 0)
    {
        std::cout << "You can't deposit a negative number! Amount set to zero.";
        amount = 0;
    }
    balance += amount;
}

void BankAccount::withdraw(double amount)
{
    if (amount < 0)
    {
        std::cout << "You can't withdraw a negative number! Amount set to zero.";
        amount = 0;
    }
    if (balance < amount)
    {
        std::cout << "You can't withdraw more money than you have. Amount set to zero.";
        amount = 0;
    }
    balance -= amount;
}

void BankAccount::define(const std::string *pfN, const std::string *paN, double b)
{
    fullName = *fN;
    accountNumber = *aN;
    balance = b;
}

// constructors
BankAccount::BankAccount() // default constructor
{
    fullName = "empty";
    accountNumber = "empty";
    balance = 0.0;
}

BankAccount::BankAccount(const std::string &fN, const std::string &aN, double b) // constructor with default argument
{
    fullName = fN;
    accountNumber = aN;
    balance = b;
}

编译器不应该将文字解释为字符串对象(就像它对引用所做的那样)?所以如果我说它是一个指针,它应该传递字符串的地址(它的第一个元素)。

有什么帮助吗?

4

1 回答 1

4

编译器不应该将文字解释为字符串对象(就像它对引用所做的那样)?

不,指针不是引用;打击任何告诉你他们是的人。

这一切都归结为:std::string不是字符串文字。因此,当您将字符串文字传递给接受 a 的函数时,必须创建一个保存文字内容的std::string临时std::string文件。这是通过 的转换构造函数完成的std::string

Aconst&允许从临时初始化,这允许转换构造函数发挥它们的魔力。Aconst*必须是一个指针,并且您不应该获得指向临时对象的指针。因此,const*不能由转换构造函数创建的临时变量神奇地填充。

您应该使用 aconst std::string &而不是指针。或者,std::string如果您有可用的 C++11 移动构造函数,则为一个值。

于 2012-08-10T15:59:51.437 回答