Okay so I\'m a bit of a noob at C++ and in my second assignment I am required to make classes with public and private arguments etc, etc. Basically the mutator functions won\'t
Ehm. I think you should use get
and set
in reverse way...
In CreateCustomer
you should use set
functions and when print Customer
to stream - you should use get
functions.
And set
functions should receives string
, not unsigned
.
And so, it will be better to use constructor
, instead of set
functions and then will be only get
functions.
You should use std::
in the class declaration. See Why is “using namespace std;” considered bad practice? on the question why.
Your set_
methods take unsigned
arguments. You cannot assign an unsigned to a string like PhoneNumber_ = x;
. The arguments need to be strings.
You'd need to change your members like
std::string get_PhoneNumber() const { return PhoneNumber_; } // Accessor
const void set_PhoneNumber(std::string const & x) { PhoneNumber_ = x; } // Mutator
When you write temp->get_PhoneNumber() = id;
your intention is clearly to set the value for PhoneNumber_
, so why do you use the get_ method? Just use the appropriate set_ method and write temp->set_PhoneNumber(id);
.
Generally avoid pointers in C++. If you're really in need of a pointer use a smart pointer like std::unique_ptr
or std::shared_ptr
(if and only if you are required to use a plain pointer: use one).
A 'blank' default value for a std::string
is an empty string like
std::string const & id = std::string{}
Appears clearer to me.
To create an object of type Customer
with blank/empty member strings you do not need to do more than Customer customer_object;
since there is an implicitly declared default constructor which uses the std::string
default constructor which results in an empty strign anyway.
Usually a constructor is used to create an object depending on some arguments values.
You could easily write one that takes all required values and can be used as a default constructo anyway by adding something along the lines of
Customer(const std::string& id = std::string{},
const std::string& name = std::string{},
const std::string& address = std::string{})
: PhoneNumber_(id), Name_(name), Address_(address)
{ }
to your class. See another C++ Class Initialization List example.
See another C++ Class Initialization List example.
You've declared PhoneNumber_
, Name_
and Address_
as string
.
But in the setter methods, you are passing unsigned (int)
Also, you have reversed the usage of getters and setters!
Also, the return types of setters can be just void
and not const void
.
If you want to set a value, use the set method. get Methods are only to obtain variables, not to set the inner variables of a class (If they are defined the way you did).
The correct usage is:
Customer* CreateCustomer(const string& id, const string& name, const string& address) {
Customer* temp = new Customer();
temp->set_PhoneNumber( id );
temp->set_Name( name );
temp->set_Address( address );
return temp;
}
Also, you have to alter the interface of your methods:
class Customer {
private:
string PhoneNumber_;
string Name_;
string Address_;
public:
string get_PhoneNumber() const {return PhoneNumber_;} // Accessor
void set_PhoneNumber(const string& x) {PhoneNumber_ = x;} // Mutator
string get_Name() const {return Name_;}
void set_Name(const string& x) {Name_ = x;}
string get_Address() const {return Address_;}
void set_Address(const string& x) {Address_ = x;}
};
Since you want to set strings and not numbers.
Using const string&
as function arguments is better than string to not copy the string when passing it as an argument. Since it is a const reference, you don't have to fear the function could manipulate the input.