Как получить доступ к объектам классов внутри классов? - PullRequest
0 голосов
/ 29 июня 2018

Я работаю с 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, но получаю сообщение об ошибке «ожидаемое первичное выражение перед». «

Как мне получить доступ к этой информации?

1 Ответ

0 голосов
/ 29 июня 2018

что вы сообщаете, это определение класса, в определении как логика вам нужно указать тип (в данном случае класс) объекта, который вы хотите внутри класса. (EDIT + другой 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;), поэтому его необходимо использовать как указатель.

(упрощенно: указатель - это переменная, содержащая адрес в памяти другой переменной или объекта, указатель - это переменная, указывающая на другую, используемая для уменьшения копирования памяти, например, при передаче объекта в функцию)

так: чтобы объявить объект, вы набираете имя класса (в этом случае EDIT имя указателя класса CvImgPtr - это указатель для CvImage) (имя полезно для компилятора, который с эта декларация знает, как зарезервирована память, в соответствии с определением класса CvImage) cv_bridge::CvImgPtr, за которым следует имя нужного вам объекта (который вызывается в данном случае 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 равен object->member

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...