本文链接 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就报错。找了网络上的一种回答:
在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
构造函数的作用:初始化对象的数据成员。
新建一个对象之后,就要对成员函数初始化。