I have tried to create a simple class where the program passes a name and telephone number to my class type and then prints it to the screen. It tells me I have undeclared identifiers, but I am constructing my program just like an example we did in class. Can someone tell me what I am doing wrong?!

// Specification file (Time.h)
// This file gives the specification
//of a phone abstract data type

#include <iostream>
#include <string>

class Phone
{
public:
	void Set(string firstName, string lastName, int number);

	void Write() const;

	Phone(string initfName, string initlName, int initNum);

	Phone();

private:
	string fName;
	string lName;
	int Num;

};

//Implementation file (phone.cpp)

#include "Phone.h"
#include <iostream>
#include <string>

using namespace std;

void Phone::Set(string firstName, string lastName, int number)
{
	fName = firstName;
	lName = lastName;
	Num = number;
}

void Phone::Write() const
{
	cout << fName;
	cout << lName << endl;
	cout << Num;
}

Phone::Phone(string initfName, string initlName, int initNum)
{
	fName = initfName;
	lName = initlName;
	Num = initNum;
}

Phone::Phone()
{
	fName = "";
	lName = "";
	Num = 0;
}


#include "Phone.h"
#include <iostream>
#include <cctype>
#include <string>

using namespace std;

int main()
{
	Phone thePhone(Andrew, Daniel, 4906996);
	thePhone.write();
	cout << endl << endl;
	system("pause");
	return 0;
}

Dani AI

Generated

Good troubleshooting so far by and — the three problems that appeared here are very common and explain the compiler messages.

First, a missing semicolon after a class declaration will make the compiler treat subsequent tokens (including standard headers) as part of the class and produce baffling errors like the C2143 you saw. The C++ grammar requires that class/struct/union declarations end with a semicolon; fixing that single typo usually clears the cascade of errors. See the language rules for classes here: class (cppreference).

Second, never rely on putting using namespace std; into a header. That can silently change name lookup for every translation unit that includes the header and is considered bad practice; prefer fully qualified names in headers (or minimal using-declarations scoped in source files). The namespace page explains the risks and mechanics: namespaces (cppreference). Related: the enum you added is fine, but prefer declaring it straightforwardly (no need to prepend :: inside the same header) — see enum (cppreference).

Third, when calling constructors or functions, string literals must be quoted; otherwise the compiler treats them as identifiers. After those fixes, also match declarations and definitions exactly (case-sensitive names and parameter types).

A few further tips not shown in the thread: prefer const std::string& parameters to avoid unnecessary copies; use constructor initializer lists for member initialization; add include guards or #pragma once to headers; store phone numbers as strings (to preserve leading zeroes, formatting and non-numeric characters); avoid non-portable calls like system("pause") in production code. For std::string details, refer to basic_string (cppreference).

Turning on all compiler warnings and building after each small change makes these kinds of mistakes obvious fast.

Recommended Answers

All 9 Replies

Inside the header file you have to tell the compiler that string is in std namespace. Putting using namespace std; in the *.cpp files is not sufficient because that line is located after the header file that contains the Phone class.

class Phone
{
public:
	void Set(std::string firstName, std::string lastName, int number);

	void Write() const;

	Phone(std::string initfName, std::string initlName, int initNum);

	Phone();

private:
	std::string fName;
	std::string lName;
	int Num;

};

Thanks so much for your help! Doing that I can almost get it to work!
Now when I try to pass arguments to the functions in my class it tells me my arguments are undeclared identifiers. I assume this means I have an error somewhere in my declarations but I cant seem to figure it out. This is my first program using classes so any help would be great!

I feel like Im making this harder than it is or should be....

// Specification file (Phone.h)
// This file gives the specification
//of a phone abstract data type


#include <string>

class Phone
{
public:
	void Set(std::string firstName, std::string lastName, int number);

	void Write() const;

	Phone(std::string initfName, std::string initlName, int initNum);

	Phone();

private:
	std::string fName;
	std::string lName;
	int Num;
};

//Implementation file (phone.cpp)

#include "Phone.h"
#include <iostream>
#include <string>

using namespace std;

void Phone::Set(string firstName, string lastName, int number)
{
	fName = firstName;
	lName = lastName;
	Num = number;
}

void Phone::Write()
{
	cout << fName;
	cout << lName << endl;
	cout << Num;
}

Phone::Phone(string initfName, string initlName, int initNum)
{
	fName = initfName;
	lName = initlName;
	Num = initNum;
}

Phone::Phone()
{
	fName = "";
	lName = "";
	Num = 0;
}

// Program file

#include "Phone.h"
#include <iostream>
#include <cctype>
#include <string>

using namespace std;

int main()
{
	Phone thePhone(Andrew, Daniel, 4906996);
	thePhone.Write();
	cout << endl << endl;
	system("pause");
	return 0;
}

line 72: Andrew and Daniel are assumed to be variable names because they are not enclosed in double quotes.

Generally, I wouldn't be this blatant, but I think it warranted this time.

Look at Line 72, the first line of your main().

Phone thePhone(Andrew, Daniel, 4906996);

You are trying to send Andrew and Daniel to the function. The problem is that C++ sees them as undeclared variable names. It appears that what you actually want are string literals. To create a string literal, place the information in "double-quotes".

Phone thePhone("Andrew", "Daniel", 4906996);

In this example, "Andrew" and "Daniel" are now string literals, not variable names.

EDIT:
Oops, where'd AD's reply come from???? I reloaded before I posted to be sure...

>>Oops, where'd AD's reply come from???? I reloaded before I posted to be sure...
That happens to us all -- no problem.

Well I fell like a moron. I got so wrapped up in thinking it had to be something hard I never even realized I was not passing my arguments properly. Thank you both so much

One more quick question. Im getting syntax errors now that Ive created an enum data type in my header file. Any thoughts?

1>c:\program files\microsoft visual studio 9.0\vc\include\cctype(19) : error C2143: syntax error : missing ';' before 'namespace'


1>c:\users\andrew\documents\visual studio 2008\projects\phonebook\phonebook\phone.cpp(6) : error C2143: syntax error : missing ';' before 'using'

Appears to be in my .cpp file.

// Specification file (Phone.h)
// This file gives the specification
// of a phone abstract data type
// pg 551

#include <string>

enum phoneType {Home, Office, Fax, Cell, Pager};

class Phone
{
public:
	void Set(std::string firstName, std::string lastName, int number, ::phoneType newType);

	void Write() const;

	Phone(std::string initfName, std::string initlName, int initNum, ::phoneType initType);

	Phone();

private:
	std::string fName;
	std::string lName;
	int Num;
	::phoneType type;
}

//Implementation file (phone.cpp)

#include "Phone.h"
#include <string>

using namespace std;

void Phone::Set(string firstName, string lastName, int number, phoneType newType)
{
	fName = firstName;
	lName = lastName;
	Num = number;
	type = newType;
}

void Phone::Write() const
{
	cout << fName << " ";
	cout << lName << endl;
	cout << Num;
}

Phone::Phone(string initfName, string initlName, int initNum, phoneType initType)
{
	fName = initfName;
	lName = initlName;
	Num = initNum;
	type = initType;
}

Phone::Phone()
{
	fName = "";
	lName = "";
	Num = 0;
	type = Home;
}

This is your problem:

class Phone
{
public:
	void Set(std::string firstName, std::string lastName, int number, ::phoneType newType);
 
	void Write() const;
 
	Phone(std::string initfName, std::string initlName, int initNum, ::phoneType initType);
 
	Phone();
 
private:
	std::string fName;
	std::string lName;
	int Num;
	::phoneType type;
} //<----there is something missing here.....

Thankfully I figured that out without too much trial and tribulation last night. I get so frustrated I miss the little things. Thank you Fbody

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.