本文链接 http://write.blog.csdn.net/postedit?ref=toolbar&ticket=ST-6262-v990WQgRcxAKyorqtsRF-passport.csdn.net
c++语法学习,先从类和对象开始吧。总结今天的学习内容,写最最简单的类。
第一个类的代码参考:http://jingyan.baidu.com/article/cd4c2979ec4106756e6e60be.html 自己做了修改。
Image.h 文件 , Image类的声明:
#ifndef Image_H #define Image_H #include <opencv2\opencv.hpp> using namespace std; using namespace cv; class Image { public: Mat imageRead(string s); void imageSave(string s, Mat m); void imageShow(string s, Mat m); Mat& operator=(Mat m); //Mat& 是什么数据结构? operator是什么值? void imageInfo(Mat m); Mat get(); protected: private: Mat m_srcImage; Mat m_saveImage; }; #endif.cpp 文件 Image类的定义
#include <opencv2\opencv.hpp> using namespace std; using namespace cv; #include "a.h" Mat Image::imageRead(string s) { m_srcImage = imread(s); return m_srcImage; } void Image::imageSave(string s, Mat m) { m_saveImage = m; imwrite(s, m_saveImage ); } void Image::imageShow(string s, Mat m) { m_srcImage = m; imshow(s, m_srcImage); } void Image::imageInfo(Mat m) { cout<<m.channels()<<endl; } Mat Image::get() { return m_srcImage; }
.cpp 文件,main函数入口
#include <opencv2\opencv.hpp> using namespace std; using namespace cv; #include "a.h" int main() { Image im; //im.m_srcImage = im.imageRead("1.jpg"); //不能直接调用类的私有成员变量 im.get() = im.imageRead("a.bmp"); im.imageShow("a",im.get()); Mat gray; cvtColor(im.get(), gray, CV_BGR2GRAY); im.imageSave("gray.bmp", gray); im.imageInfo(gray); while(true) { int c; c = waitKey( 20 ); if( (char)c == 27 ) { break; } } return 0; }原文目的是回答:c++中访问私有成员变量的方法有哪些?
最简单的类总是把成员变量写在private里面,在public里面写一些成员函数。私有成员变量只能在类内使用,对象不能直接调用,那怎么调用呢?
main()函数中
im.m_srcImage = im.imageRead("a.bmp");这一句会报错,m_srcImage不可访问。这一句本来的目的是调用imageRead()函数,将图片读进来装在m_srcImage中。
一种办法是给类定义一个公有的get()接口用来访问类的私有变量:
public: Mat get() { return m_srcImage};main()函数中调用:
im.get() = im.imageRead("a.bmp"); //im.get()函数返回的就是m_srcImage.这样入读的图片就可以装在m_srcImage变量中了,也就是im.get()这个Mat容器中有内容了。一开始我是这样写的:
Mat Image::imageRead(string s) { Mat src = imread(s); return src; }报错:
意思是im.get()里面根本没有数据。我以为只要公有函数返回了一个值就可以用了,但是不行,必须返回的是成员变量。
另外, main.cpp文件只包含了Image.h, 没有包含Image.cpp。尝试加上#Image.cpp就报错。找了网络上的一种回答:
http://zhidao.baidu.com/link?url=CkiUB8PlNi4R4w3QwuUR2LSkXy5bJtkhWIEDU58IvBfXEJsGRmXZXH9bCpURzLCIAi36jqxsYXI-ZFIP4qL-4q
在Image.cpp里面加入#include"Image.h",是为了把"Image.h"里面的声明引用进来,不然会出现很多警告说你这也没定义,那也没定义。如常用的程序要使用cout,cin来实现输出输入,就必须加#include<iostream>一样 编译器在编译期间会自动把需要的东西加到cpp里面来,没有这句或者你没有其他语句告诉编译器该去哪找 cout/cin ,编译时编译器就认为他们没定义。
.h对应的.cpp和名称无关。
.h里有类声明,然后连接器看哪个cpp里包含你的头文件,然后再去里面找类的实现。下面是第二个最最简单的类
Time.h: Time类的声明
class Time { public: Time(int aHour=0, int aMin=0, int aSec=0); //所有参数都带有默认值的构造函数,默认构造函数 //Time(int m_iHour=0, int m_iMin=0, int m_iSec=0); //类里面的任何成员变量在定义时是不能初始化的。 void setHour(int aHour); //重新设置时 void setMin(int aMin); //重新设置分 void setSec(int aSec); //重新设置秒 int getHour(); //获取时,该函数返回当前m_iHour的值 int getMin(); int getSec(); void display(); private: int m_iHour; int m_iMin; int m_iSec; };
Time.cpp:Time类的定义
//用初始化列表初始化类中数据成员, Time::Time(int aHour, int aMin, int aSec):m_iHour(aHour),m_iMin(aMin),m_iSec(aSec) { } //aHour, aMin,aSec是什么?是常量?是变量?----是常量,.h已经定义了int aHour=0, int aMin=0, int aSec=0 //也不对,是变量,在对象初始化的时候可以自定义值,然后它们就成为常量了。 //初始化列表:Time::Time():m_iHour(0),m_iMin(1),m_iSec(2); //类外初始化:int Time::m_iHour=0; //成员函数定义 void Time::setHour(int aHour) { m_iHour = aHour; } void Time::setMin(int aMin) { m_iMin = aMin; } void Time::setSec(int aSec) { m_iSec = aSec; } int Time::getHour() { return m_iHour; } int Time::getMin() { return m_iMin; } int Time::getSec() { return m_iSec; } void Time::display() { cout<<m_iHour<<":"<<m_iMin<<":"<<m_iSec<<endl; }main.cpp
int main() { Time t1; t1.setHour(3); t1.setMin(40); t1.setSec(30); t1.display(); Time t2(7,30,20); t2.display(); cout<<t2.getHour()<<"."<<t2.getMin()<<"."<<t2.getSec()<<endl; }公有的类成员函数主要有两种,分别是修改和获取私有成员变量。
另外多了一个构造函数:
public: Time(int aHour=0, int aMin=0, int aSec=0); //所有参数都带有默认值的构造函数,默认构造函数在.cpp里面还有构造函数的初始化:
//用初始化列表初始化类中数据成员, Time::Time(int aHour, int aMin, int aSec):m_iHour(aHour),m_iMin(aMin),m_iSec(aSec) { }关于构造函数的概念参考了: http://blog.csdn.net/tiantang46800/article/details/6938762
构造函数的作用:初始化对象的数据成员。
新建一个对象之后,就要对成员函数初始化。