嵌入式linux基础:c++(三)程序结构

简介: 嵌入式linux基础:c++(三)程序结构

1.程序结构


上一文说到了函数写在了类里面,那么可不可以写在类外面。

#include <stdio.h>
class Person {
private:
  char *name;
  int age;
  char *work;
public:
  void setName(char *name);//在class里面只是申明
  int setAge(int age);
  void printInfo(void);
};
//void setName(char *name); persom::
void Person::setName(char *name)
{
  this->name = name;
}
int Person::setAge(int age)//将这个写到类的外面去,写成person::表示,person这个类里面的这个函数。
{
  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;
}


一个团队,由A实现person类,由B实现main函数。B只关心怎么用person内。那么A就要提供person.h以及person.cpp

1671002725655.jpg

代码如下:

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;
}
person.h
#include <stdio.h>
class Person {
private:
  char *name;
  int age;
  char *work;
public:
  void setName(char *name);
  int setAge(int age);
  void printInfo(void);
};
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); 
}


继续修改代码,让程序更加复杂 假设进入一个新人要实现Dog类。

1671002770471.jpg


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.h

#include <stdio.h>
namespace A {//由于打印了两个完全一样的printVersion,需要区分开来。
class Person {
private:
  char *name;
  int age;
  char *work;
public:
  void setName(char *name);
  int setAge(int age);
  void printInfo(void);
};
void printVersion(void);
}


person.cpp

#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 weidongshan\n");
}
}


dog.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);
}


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 weidongshan\n");
}
}


Makefile

person: main.o person.o dog.o
  g++ -o $@ $^
%.o : %.cpp
  g++ -c -o $@ $<
clean:
  rm -f *.o person


你看到的A:: C:: 这些会不会太麻烦了。做一些小修改:

main.c

#include <stdio.h>
#include "person.h"
#include "dog.h"
/* global namespace */
/* 把A::person 放入global namespace ,以后可以使用Person来表示A ::Person */
using A::Person;
/* 把C::Dog 放入global namespace ,以后可以使用Dog来表示C::Dog */
using C::Dog;
int main(int argc, char **argv)
{
  /* local namespace */
  //using A::Person;
  //using C::Dog;
  Person per;
  per.setName("zhangsan");
  per.setAge(16);
  per.printInfo();
  Dog dog;
  dog.setName("wangcai");
  dog.setAge(1);
  dog.printInfo();
  A::printVersion();
  C::printVersion();
  return 0;
}


再来改进一下:

#include <stdio.h>
#include "person.h"
#include "dog.h"
using namespace A;//他把A空间的东西都导出来
using namespace C;//他把C空间的东西都导出来
int main(int argc, char **argv)
{
  /* local namespace */
  //using A::Person;
  //using C::Dog;
  Person per;
  per.setName("zhangsan");
  per.setAge(16);
  per.printInfo();
  Dog dog;
  dog.setName("wangcai");
  dog.setAge(1);
  dog.printInfo();
  A::printVersion();//导出来以后会冲突啊,所以这一句加上A::printVersion();
  C::printVersion();//导出来以后会冲突啊,所以这一句加上C::printVersion();
  return 0;
}

1671002869583.jpg


最后的修改如下:

main.cpp
#include <stdio.h>
#include "person.h"
#include "dog.h"
using namespace A;
using namespace C;
int main(int argc, char **argv)
{
  /* local namespace */
  //using A::Person;
  //using C::Dog;
  Person per;
  per.setName("zhangsan");
  per.setAge(16);
  per.printInfo();
  Dog dog;
  dog.setName("wangcai");
  dog.setAge(1);
  dog.printInfo();
  A::printVersion();
  C::printVersion();
  return 0;
}


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);
}


person.cpp
#include <iostream>
#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)
{
  std::cout<<"name = "<<name<<" age = "<<age<<" work = "<<work<<std::endl; 
  //cout<< "name = "<<name<<     " age = " <<age<<   " work = "<<work<<     std::endl; 
}
void printVersion(void)
{
  std::cout<<"Person v1, by weidongshan"<<std::endl;
}
}
dog.cpp
#include <iostream>
#include "dog.h"
namespace C {
using namespace std;
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)
{
  cout<<"name = "<<name<<" age = "<<age<<endl; 
}
void printVersion(void)
{
  cout<<"Dog v1, by weidongshan"<<endl;
}
}


dog.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);
}
相关文章
|
2月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
98 0
|
2月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
106 1
Linux C/C++之IO多路复用(aio)
|
2月前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
48 0
|
1月前
|
Linux 调度
Linux系统结构
内核是操作系统的核心组件,负责管理系统资源和硬件设备。它提供了硬件抽象层,使得应用程序不必直接操作硬件。内核的主要功能包括: 进程管理:创建、调度和终止进程。 内存管理:分配和回收内存,提供虚拟内存功能。 设备管理:控制硬件设备的访问。 文件系统管理:管理文件和目录结构。 系统调用接口:提供系统调用,使应用程序能够与操作系统交互。
41 8
|
2月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
503 3
|
2月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
66 1
|
2月前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
33 0
Linux C/C++之线程基础
|
2月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
36 0
Linux C/C++之IO多路复用(poll,epoll)
|
2月前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
47 0
Linux C/C++之TCP / UDP通信
|
2月前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
41 0
Linux c/c++之IPC进程间通信
下一篇
DataWorks