1.在类里面只是声明,在类外面实现函数
void Person::setName(char *name)
#include <stdio.h>
class Person {
private:
char *name;
int age;
char *work;
public:
void setName(char *name);
int setAge(int age);
void printInfo(void);
};
void Person::setName(char *name) //在类外面实现函数,实现的是Person类里面的函数
{
this->name = name;
}
int Person::setAge(int age)
{
if (age < 0 || age > 150)
{
this->age = 0;
return -1;
}
this->age = age;
return 0;
}
void Person::printInfo(void)
{
printf("name = %s, age = %d, work = %s\n", name, age, work);
}
int main(int argc, char **argv)
{
Person per;
//per.name = "zhangsan";
per.setName("zhangsan");
per.setAge(200);
per.printInfo();
return 0;
}
2.团队分工
-----员工A实现 main.cpp,不关心函数的内部实现,只关心怎么去调用它,所以包含person.h即可
-----员工B实现Person类,person.h 供员工A使用, 在person.cpp中实现Person类
a. main.cpp
#include <stdio.h>
#include "person.h"
int main(int argc, char **argv)
{
Person per;
//per.name = "zhangsan";
per.setName("zhangsan");
per.setAge(200);
per.printInfo();
return 0;
}
b. person.h 提供给main函数用,写main函数的人看这个头文件即可
#include <stdio.h>
class Person {
private:
char *name;
int age;
char *work;
public:
void setName(char *name);
int setAge(int age);
void printInfo(void);
};
c. person.cpp 实现函数
#include <stdio.h>
#include "person.h"
void Person::setName(char *name)
{
this->name = name;
}
int Person::setAge(int age)
{
if (age < 0 || age > 150)
{
this->age = 0;
return -1;
}
this->age = age;
return 0;
}
void Person::printInfo(void)
{
printf("name = %s, age = %d, work = %s\n", name, age, work);
}
d. makefile编译
person: main.o person.o //想编译出person,它依赖于main.o 和person.o
g++ -o $@ $^ //$@ 表示 person,$^表示两个依赖main.o person.o
%.o : %.cpp
g++ -c -o $@ $<
clean:
rm -f *.o person
3. 假设员工C还要实现一个dog 类,在person.cpp和dog.cpp中分别实现一个打印版本的函数
a. dog.h
#include <stdio.h>
namespace C {
class Dog {
private:
char *name;
int age;
public:
void setName(char *name);
int setAge(int age);
void printInfo(void);
};
void printVersion(void);
}
b. dog.cpp
#include <stdio.h>
#include "dog.h"
namespace C {
void Dog::setName(char *name)
{
this->name = name;
}
int Dog::setAge(int age)
{
if (age < 0 || age > 20)
{
this->age = 0;
return -1;
}
this->age = age;
return 0;
}
void Dog::printInfo(void)
{
printf("name = %s, age = %d\n", name, age);
}
void printVersion(void)
{
printf("Dog v1, by XXX\n");
}
}
c. person.cpp
两个cpp都实现了void printVersion(void),
函数名称一样,返回值一样,参数一样,但内部实现不一样
#include <stdio.h>
#include "person.h"
namespace A {
void Person::setName(char *name)
{
this->name = name;
}
int Person::setAge(int age)
{
if (age < 0 || age > 150)
{
this->age = 0;
return -1;
}
this->age = age;
return 0;
}
void Person::printInfo(void)
{
printf("name = %s, age = %d, work = %s\n", name, age, work);
}
void printVersion(void)
{
printf("Person v1, by XXX\n");
}
}
d. person.h
#include <stdio.h>
namespace A {
class Person {
private:
char *name;
int age;
char *work;
public:
void setName(char *name);
int setAge(int age);
void printInfo(void);
};
void printVersion(void);
}
e. main.cpp
#include <stdio.h>
#include "person.h"
#include "dog.h"
int main(int argc, char **argv)
{
A::Person per;
per.setName("zhangsan");
per.setAge(16);
per.printInfo();
C::Dog dog;
dog.setName("wangcai");
dog.setAge(1);
dog.printInfo();
A::printVersion();
C::printVersion();
return 0;
}
可能有同名的Person类,不能直接使用Person per; 否则报错
f. makefile
person: main.o person.o dog.o
g++ -o $@ $^
%.o : %.cpp
g++ -c -o $@ $<
clean:
rm -f *.o person
工程太大,出现函数名称一样,返回值一样,参数一样,这种是不可避免的
A::printVersion();
C::printVersion();
解决办法:1.区分函数printVersion-dog、printVersion-person
2.引入命名空间 namespace,调用时指定这个函数属于哪个命名空间