Работа над программой, где мы должны построить класс для стека и использовать его, чтобы проверить, являются ли строки палиндромами. Компилятор жалуется на неопределенную ссылку на функции-члены в классе Stack. Я не уверен, что я делаю неправильно, так как я считаю, что использую тот же синтаксис, что и в прошлом. Файлы для класса - Stack02.h, Stack02.cpp и p02.cpp - основной файл для программы.
От Stack02.h
class Stack
{
int size;
int tos;
char* S;
public:
Stack(int sz=100); //Constructor
~Stack(); //Deconstructor
bool isFull(void);
bool isEmpty(void);
void Push(char v);
char Pop(void);
};
Из Stack02.cpp:
#include "Stack02.h"
using namespace std;
//Exception handling for stacks
struct StackException
{
StackException{char* m}
{
cout << endl << "I am the Stack and I am " << m << "." << endl;
}
};
Stack::Stack(int sz):size(sz),tos(-1){S= new char[size]}; //Constructor
Stack::~Stack(){if(S) delete[] S;} //Deconstructor
bool Stack::isFull(void)
{
return tos >= size - 1;
} //Is the stack full?
bool Stack::isEmpty(void)
{
return tos < 0;
}
void Stack::Push(char v)
{
if(isFull) throw StackException("full");
S[++tos] = c;
}
char Stack::Pop(void)
{
if(isEmpty) throw StackException("empty");
return S[tos--];
}
Функция, с которой компилятор жалуется на p02.cpp:
bool IsPalindrome(string& c)
{
Stack s;
for (int a = 0; a < c.length(); a++) s.Push(c[a]);
for (int a = 0; !s.isEmpty() ;a < c.length())
{
if (c[a] !=s.Pop()) return false;
}
//can use default return value to check how output looks.
}
Файл makefile:
#------------------------------------------------
#Object files
#------------------------------------------------
obj = p02.o Stack02.o
#------------------------------------------------
#Link object files into executable file p02
#------------------------------------------------
p02: ${obj}
g++ -o p02 ${obj} -lm
#------------------------------------------------
#Compile p02.cpp that exercises class Stack
#------------------------------------------------
p02.o p02.cpp Stack02.h
g++ -g -c p02.cpp
#------------------------------------------------
#Compile Stack02.cpp that implements class Stack
#------------------------------------------------
Stack02.o Stack02.cpp Stack02.h
g++ -g -c Stack02.cpp
Жалобы компилятора:
tt054@cs:~$ make p02
g++ p02.cpp -o p02
/tmp/ccYDuT0W.o: In function 'IsPalindrome(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)':
p02.cpp:(.text+0x1c): undefined reference to 'Stack::Stack(int)'
p02.cpp:(.text+0x4e): undefined reference to 'Stack::Push(char)'
p02.cpp:(.text+0x9b): undefined reference to 'Stack::Pop()'
p02.cpp:(.text+0xc9): undefined reference to 'Stack::isEmpty()'
p02.cpp:(.text+0xe1): undefined reference to 'Stack::~Stack()'
p02.cpp:(.text+0xfc): undefined reference to 'Stack::~Stack()'
collect2: ld returned 1 exit status
make: *** [p02] Error 1
Вы включаете заголовочный файл, но не создаете и не связываете реализацию стека. Пытаться
g++ Stack02.cpp p02.cpp
Или замените g++
на любой компилятор, который вы используете.
p02
зависит отp02.cpp
иStack02.cpp
. Вам нужно добавить один или собрать его самостоятельно с помощьюg++ p02.cpp Stack02.cpp -o p02
.