Так что в основном у меня ошибка, что для меня нет смысла. Я пробовал все, но ничего не работает, поэтому я решил, что вы, ребята, сможете мне помочь. Кстати, это мой первый пост на этом сайте.
Я работаю над программой, которая включает класс под названием "hous.cc, h" и тестовую программу.
это Hous.h (код, о котором идет речь)
class Household{
public:
// Default constructor
Household(std::string nme, std::string adrs, int peeps, int ncome);
Household();
Household(std::string& nme, std::string& adrs, int& peeps, int& ncome);
Это мой файл Hous.cc
// constructors
Household::Household(std::string nme, std::string adrs, int peeps, int ncome){
name = nme;
address = adrs;
numpeople = peeps;
income = ncome;
}
Household::Household(std::string& nme, std::string& adrs, int& peeps, int& ncome){
name =nme;
address = adrs;
numpeople=peeps;
income=ncome;
}
Household::Household(){
name = "";
address = "";
numpeople = 0;
income =0;
}
и соответствующий код класса тестов:
Household temp;
string n;
int i;
cout<< "Please enter the name, press enter, then the income of the house\n";
getline(cin, n);
cin >> i;
myWard.removeHouse(temp(n, n, i, i));
break;
сообщение об ошибке
Error: no match for call to '(Household) (std:string&, std::string&, int&, int&)'
Я действительно не понимаю, почему это происходит, потому что у моего домостроителя есть все эти параметры. Возможно, мне не хватает чего-то очевидного, но это не так очевидно для меня. Это первый раз, когда я работал с c++.
edit: removeHouse и myWard не имеют значения в этом вопросе, но я добавил временный код. Проблема заключается в коде
temp(n,n,i,i)
вот где ошибка.
Заранее спасибо!
Вы инициализировали конструктором по умолчанию временный объект, а затем вы попытались повторно инициализировать его другим конструктором.. что проблема.
Household temp; <-- initialized with DEFAULT constructor
string n;
int i;
cout<< "Please enter the name, press enter, then the income of the house\n";
getline(cin, n);
cin >> i;
myWard.removeHouse(temp(n, n, i, i)); <-- RE-initialize?? Bad idea..
break;
Выполните инициализацию объекта с помощью конструктора, который вы хотите (4 аргумента, я полагаю), а затем используйте объект.
Также: gcc, вероятно, используется, и он предупреждает вас, что с этим набором аргументов разрешение не доступно.
Что-то вроде этого может работать:
string n;
int i;
// do initialize n and i to something meaningful here
Household temp(n, n, i, i);
cout<< "Please enter the name, press enter, then the income of the house\n";
getline(cin, n);
cin >> i;
myWard.removeHouse(temp);
break;
Однако я ничего не знаю о других функциях и о поведении программы.
Выражение temp(n, n, i, i)
не "повторно вызывает" конструктор, и это то, что вы пытаетесь сделать. Скорее, это выражение пытается вызвать оператор функции-оператора operator()
на temp
объекте. Вы не предоставляли такого оператора для своего класса, поэтому компилятор правильно жалуется.
Вы не можете повторно вызвать конструктор объекта. Однако вы можете ждать объявления объекта до тех пор, пока он вам не понадобится, а затем вызовите конструктор:
{
cout<< "Please enter the name, press enter, then the income of the house\n";
getline(cin, n);
cin >> i;
Household temp(n, n, i, i);
myWard.removeHouse(temp);
}
break;
Я добавил фигурные скобки, потому что этот код выглядит как часть оператора switch
. Объявление переменных в середине блока switch
, так как этот код теперь будет работать с temp
, может привести к проблемам; скобки ограничивают область действия новой переменной.
Я считаю, что это может быть потому, что у вас есть два конструктора, которые отличаются только тем, что он принимает ссылки.
Компилятор чувствует, что он неоднозначен и не знает, какой конструктор вызывает; следовательно, "нет соответствия".
temp
?