tmp должен быть членом класса, чтобы содержать строку, на которую указывают Word и Definition. В противном случае, как уже упоминалось в других ответах, tmp выйдет из области видимости, как только конструктор вернется.
Другое дело, что вы не должны добавлять этот символ к указателям. Я предполагаю, что вы хотели поместить терминатор в строку, но в C / C ++ все не так. Фактически вы добавляете значение ASCII (ноль) к указателю как смещение, которое ничего не делает. Если вы хотите использовать терминатор, вам нужно изменить символы, на которые указывает указатель, а не менять сам указатель. Но в любом случае strtok уже ставит терминаторы в конце каждого найденного токена - в этом нет необходимости.
Итак, мое предложение:
#include <iostream>
using namespace std;
class Entry
{
public:
Entry(const char *line);
char *Word;
char *Definition;
private:
char buffer[100];
};
Entry::Entry(const char *line)
{
strncpy(buffer, line, sizeof buffer);
buffer[sizeof buffer - 1] = '\0';
Word = strtok(buffer, ",");
Definition = strtok(0,",");
}
int main()
{
Entry *e = new Entry("drink,What you need after a long day's work");
cout << "Word: " << e->Word << endl;
cout << "Def: " << e->Definition << endl;
cout << endl;
delete e;
e = 0;
return 0;
}
Я изменил имя с tmp на buffer, так как это больше не временное значение. Я также использовал strncpy для предотвращения переполнения буфера. Буфер строки [sizeof buffer - 1] = '\ 0'; потому что, если строка больше буфера, после вызова у нее не будет терминатора.