Почему я получаю следующую ошибку с XCode?
Undefined symbols for architecture x86_64:
"displayFile()", referenced from:
_main in main.o
"quitProgram(bool&)", referenced from:
_main in main.o
"editFile()", referenced from:
_main in main.o
"openFile()", referenced from:
_main in main.o
"saveFile()", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
Вот это number_enforcer.hpp:
#ifndef number_enforcer_hpp
#define number_enforcer_hpp
class Enforcer {
private:
int int_n;
double n;
public:
int natural_number_enforcer(int min, int max);
};
#endif /* number_enforcer_hpp */
Number_enforcer.cpp:
#include "number_enforcer.hpp"#include <iostream>
using namespace std;
//***********************************************************************
// Definition of function natural_number_enforcer *
// *
// forces input for a variable to be a natural number. *
// WARNING: Does not work for numbers too large for type int (32 bits) *
//***********************************************************************
int Enforcer::natural_number_enforcer(int min, int max)
{
do
{
if (cin >> n) // input n and see if input is a number
{ // If n is a number, then:
cin.ignore(1000000000000000000, '\n'); // if first characters form a number,...
// ...this ignores any extra junk typed after that number.
int_n = n; // assigns input of type double to int_n of type int
// int_n is the truncated version of n (if n is a decimal not too large for type int)
if (n != int_n || n < min || n > max) // Test if n is a natural number (it should equal the truncated version int_n and be greater than 1).
{ // Otherwise, n is not a natural number (or else n is too large for type int).
cout << "\nError: Input needs to be a whole number between " << min << " and " << max << "." << endl;
}
else // if inputed n is actually a natural number, then:
{
break; // quit the do-while loop and keep the acceptable input for n
}
}
else // If n is not a number, then:
{
cout << "\nA letter/punctuation is not a number.\n"; // tell the user that their input was not a number
cin.clear(); // clear the input (or else the program will go crazy and repeat a part forever)
cin.ignore(1000000000000000000, '\n'); // ignore potential extra inputed junk as well
}
cout << "Enter a new number:\t"; // tell the user to input a natural number
} while (true); // loop until user inputs a natural number
return n;
}
И main.cpp:
#include <iostream>
#include <fstream>
#include <string>
#include "number_enforcer.hpp"using namespace std;
Enforcer enf; //calls to class Enforcer for managing input
//=======FUNCTIONS=======
void createFile(int (&x)[100]);
void saveFile();
void openFile();
void displayFile();
void editFile();
void quitProgram(bool &);
//=======================
int main() {
int menuOption; //user-defined choice for Main Menu
bool quit; //true --> quit program
int scores[100]; //declare array for storing scores with a limit of 100 items
do {
//=======MAIN MENU=======
cout << "What would you like to do?\n" <<
"1. Create New File\n" <<
"2. Save Current Information\n" <<
"3. Open Another File\n" <<
"4. Display Current Scores\n" <<
"5. Modify Certain Scores\n" <<
"6. Quit" << endl;
menuOption = enf.natural_number_enforcer(1, 6);
switch (menuOption) {
case 1:
createFile(scores);
break;
case 2:
saveFile();
break;
case 3:
openFile();
break;
case 4:
displayFile();
break;
case 5:
editFile();
break;
case 6:
quitProgram(quit);
break;
default:
break;
}
} while (!quit);
return 0;
}
void createFile(int (&x)[100]) {
int subMenuOption; //user-defined choice for Sub Menu
int numberOfScores; //user-defined amount of scores to store
cout << "Are you sure you want to create a new file?\n" <<
"(This will overwrite any unsaved progress)\n\n" <<
"1. Yes\n" <<
"2. No" << endl;
subMenuOption = enf.natural_number_enforcer(1, 2);
if (subMenuOption == 1) {
cout << "How many scores do you wish to enter (up to 100)?: \t";
numberOfScores = enf.natural_number_enforcer(1, 100);
for (int i = 0; i < numberOfScores - 1; i++) {
cout << "Enter Score #" << i + 1 << ": \t";
x[i] = enf.natural_number_enforcer(0, 100000);
}
for (int i = 0; i < numberOfScores - 1; i++) {
cout << x[i] << endl;
}
}
}
Я только начал свой проект, прежде чем заметил эту странную ошибку. Как это исправить?
Я предполагаю, что это связано с моими заголовочными файлами, которые я добавил, но я помню, как проверял это раньше, и он работал. Единственное, что я добавил после этого, — это прототипы и функцию createFile (), и вдруг он не будет собран. Я попытался удалить функцию createFile (), но безрезультатно.
Вы объявили, но не определили эти функции:
void saveFile();
void openFile();
void displayFile();
void editFile();
void quitProgram(bool &);
Вы вызываете функции в своем коде, поэтому компоновщик пытается найти их реализацию и терпит неудачу.
Просто добавьте определения для функций, которые вы сделали для createFile
,
Других решений пока нет …