вызывающие класс функции в переполнении стека

Я пытаюсь вызвать функцию в C ++, и я думал, что это будет так же, как в C, но при попытке преобразовать программу C в C ++ я столкнулся с ошибкой, в которой говорится, что функции не объявлены.

Вот мой класс:

class contacts
{
private:;
char *First_Name;
char *Last_Name;
char *home;
char *cell;
public:;
//constructor
contacts()
{
}
//Function declaration
void readfile (contacts*friends ,int* counter, int i,char buffer[],FILE*read,char user_entry3[]);

};

Вот фрагмент моей функции меню:

 if(user_entry1==1)
{
printf("Please enter a file name");
scanf("%s",user_entry3);
read=fopen(user_entry3,"r+");

//This is the "undeclared" function
readfile(friends ,counter,i,buffer,read,user_entry3);
}else;

Я, очевидно, делаю что-то не так, но каждый раз, когда я пытаюсь скомпилировать, я получаю readfile undeclared(first use this function) Что я здесь не так делаю?

1

Решение

Функция «Меню» изнутри класса contacts? Способ, которым вы его спроектировали, может быть вызван только для экземпляра класса. У вас есть варианты, основанные именно на какие readfile значит contacts

Я угадываю функция читает все контакты а не только 1 контакт, а это значит, что это может быть сделано статическая функция

static void readfile(... ;

И позвони как

contacts::readfile(...;

альтернативно если вам не нужен прямой доступ к внутренностям класса вы можете просто объявить это вне класса (как бесплатная функция, похожая на обычные функции C) и использовать точно так же, как вы делаете сейчас. На самом деле это то, что ищет компилятор, когда сталкивается с вашим кодом.

Также предлагаю переименовать class contacts -> class contact так как кажется, что каждый объект содержит контактную информацию только 1 человека.

0

Другие решения

Вам нужно создать объект contacts класс, а затем позвоните readfile на этом объекте. Как это:
contacts c; c.readfile();,

2

Я рекомендую рефакторинг для использования вектора STL.

#include <vector>
#include <ReaderUtil>

using namespace std;

vector< contact > myContactCollection;
myContactCollection.push_back( Contact("Bob",....) );
myContactCollection.push_back( Contact("Jack",....) );
myContactCollection.push_back( Contact("Jill",....) );

Или же…

myContactCollection = ReaderClass::csvparser(myFile);

где

ReaderClass::csvparser(std::string myFile) returns vector<Contact>
0

Так как ваша функция readfile находится внутри класса contacts, то приведенный выше ответ является технически правильным, так как вам нужно создать экземпляр объекта, а затем вызвать функцию. Однако, с точки зрения ОО, ваша функция класса должна, как правило, работать только с членами объектов класса, который ее содержит. То, что вы имеете здесь, больше похоже на функцию общего назначения, которая принимает параметры многих типов, и только один из них — указатель на класс, который сам содержит функцию, которую вы вызываете, что, если подумать, довольно странно. Таким образом, вы будете передавать указатель на класс функции-члену класса, для чего потребуется два его экземпляра. Вы не можете думать о классе как о простой замене указателя на структуру. Поскольку это класс, вы объявляете все переменные, которые вам нужны, в качестве членов класса, поэтому нет необходимости передавать их в качестве параметров (одна из основных целей класса — это изоляция общих данных от данных членов класса). Вот обновление, которое должно указать вам правильное направление.

   class contacts
{
private:

char *First_Name;
char *Last_Name;
char *home;
char *cell;
FILE *read;  // these all could also be declared as a stack variable in 'readfile'public:
//constructor

contacts()
{
}

//destruction
~contacts()
{
}

//Function declaration
int contacts::readfile (char * userEnteredFilename);

};contacts myContact = new contacts();

printf("Please enter a file name");
scanf("%s",user_entry3);

int iCount = myContact->readfile(user_entry3);

// the readfile function should contain all of the file i/O code
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector