C Строка присваивания значений в явном конструкторе в C ++? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть класс BankAccount с двумя строковыми членами - name и num.Я хочу назначить значения этим объектам при их создании (когда вызывается конструктор).Однако компилятор говорит No instance of constructor matches the argument list, когда я пытаюсь создать объект.Я хотел бы спросить, почему это?

// hwk-2.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include "pch.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
class BankAccout {
    char name[23];
    char num[15];
    double sum;
public:
    BankAccout(char *nm, char *nr, double s) {
        strcpy(name,nm);
        strcpy(num, nr);
        sum = s;
    }


};
int main()
{
    BankAccout k("Peter", "0403940940", 34.21);

}

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

как упражнение на кофе-брейк, здесь более идиоматическая версия

#include "pch.h"
#include <iostream>
#include <string>

class BankAccount {
    std::string name_;
    std::string num_;
    double sum_;
public:
    BankAccount(std::string name, std::string num, double sum) {
        name_ = name;
        num_ = num;
        sum_ = sum;
    }
};

int main()
{
    BankAccount k("Peter", "0403940940", 34.21);
}
0 голосов
/ 10 октября 2018

Еще более простая версия, если вам не нужны дополнительные функции в классе: просто используйте struct.

#include <string>

struct BankAccount {
  std::string name;
  std::string number;
  double balance;
};

int main() {
  BankAccount account{"Joy", "44", 43.};
}
0 голосов
/ 09 октября 2018

Подпись конструктора не совпадает.Это будет соответствовать:

BankAccount(const char *nm, const char *nr, double s);

РЕДАКТИРОВАТЬ:

Причина заключается в том, как вы вызываете конструктор в главной функции.Вы даете буквальные строки в качестве параметров.Эти литералы являются постоянными, вы не можете изменить их во время выполнения.Таким образом, вы будете передавать указатели на const char*.

Это очень очевидно, если вы посмотрите на этот противоположный пример.Это способ, который будет совместим со старой подписью BankAccout(char *nm, char *nr, double s);.

int main(int argc, char* argv[])
{
    char name[] = "hello";
    char number[] = "1234";

    std::cout << "name before: " << name << std::endl;

    BankAccount k(name, number, 8.5);

    // name and number are not const,
    // you can change them :
    name[2] = 'x';
    name[3] = 'x';

    std::cout << "name after: " << name << std::endl;

    return 0;
}
...