我正在使用OpenCV,更具体地说是下面显示的类。
namespace cv_bridge {
class CvImage
{
public:
std_msgs::Header header;
std::string encoding;
cv::Mat image;
};
typedef boost::shared_ptr<CvImage> CvImagePtr;
typedef boost::shared_ptr<CvImage const> CvImageConstPtr;
}
创建CvImage对象后,如何访问公共值?它们也是类。例如,我想输出header.seq
的值,因此我尝试退出cv_bridge::CvImgPtr.header.seq
,但收到错误“在'之前的预期主表达式。 “
我如何访问此信息?
答案 0 :(得分:2)
报告的是类定义,在定义中作为逻辑,您需要在类内指定想要的对象的类型(在本例中为类)。 (编辑+其他typedef)
public:
std_msgs::Header header; //declare header of type std_msgs::Header
std::string encoding;
cv::Mat image;
要对cv_bridge::CvImage
类的对象进行贴花(使程序知道他需要为一个对象保留存储空间),您需要执行以下操作:
cv_bridge::CvImage this_is_an_object; //declaring an object of type CvImgage
编辑:在您的情况下,cv_bridge::CvImgPtr
是shared_ptr
,因此是指针(typedef boost::shared_ptr<CvImage> CvImgPtr;
),因此需要像指针一样使用它。
(简化:指针是包含另一个变量或对象的内存地址的变量,指针是指向另一个变量或对象的变量,例如,当将对象传递给函数时,用于减少内存复制)
so:要声明一个对象,请键入类的名称(在这种情况下,编辑类的指针的名称CvImgPtr
是CvImage
的指针)(该名称对于带有此声明的编译器知道如何构造保留的内存,并遵循类CvImage
的定义)cv_bridge::CvImgPtr
,后跟所需对象的名称(在这种情况下称为{{1 }}。
就像编写基本变量声明(this_is_an_object
)
执行int j , double a, char f
没有意义,因为您将变量声明与类的对象的名称甚至一半的指针的调用混合在一起。
要调用对象cv_bridge::CvImgPtr.header.seq
,需要输入seq
,就像它是结构一样。
this_is_an_object.header.seq
与您的情况类似的类:
struct foo{ //definition : teach the compiler how is made struct foo.
char bar;
};
foo aaa; //aaa is the name of the variable/object/instance of the struct
aaa.bar = "a"; //call the member bar of the struct and assign value "a"
std::cout<<aaa.bar; //print aaa.bar
或:
class CvImage //definition
{
public:
std_msgs::Header header;
std::string encoding;
cv::Mat image;
};
cv_bridge::CvImage this_is_an_object; //declare the variable / object this_is_an_object of class cv_bridge::CvImage
std::cout<< this_is_an_object.header.seq; //access the value of seq from object header of object this_is_an_object,
//this_is_an_object is an object of class cv_bridge::CvImage
等同于:
typedef boost::shared_ptr<CvImage> CvImgPtr;
cv_bridge::CvImgPtr this_is_a_pointer_to_object;
std::cout<< (*this_is_a_pointer_to_object).header.seq;
运算符std::cout<< this_is_a_pointer_to_object -> header.seq;
等于(*object).member