C ++: доступ к закрытым полям и функциям из основного

В своей карьере я программировал только на Java и начал использовать C ++ с 10 дней, поэтому многим из вас этот вопрос может показаться странным.
Я определил структуру класса в заголовочном файле:


#include "ros / ros.h" #include "nav_msgs / Odometry.h" #include "geometry_msgs / Pose.h" #include "geometry_msgs / Point.h" #include "stdio.h" #include "sensor_msgs / LaserScan. h "#include" list "#include" vector "#include" scan_node.h "#include" odom_node.h "#include "ordin.h"
class stage_listener {
общественности:
stage_listener ();

частный:
std :: list odom_list;
std :: list scan_list;
std :: list corners_list;

std :: list polar2cart (std :: vector, float, float, float, float);
void addOdomNode (const nav_msgs :: Odometry);
void addScanNode (const sensor_msgs :: LaserScan);
void extractCorners (std :: vector, float, float, float, float);
int distance (плавать, плавать, плавать, плавать, плавать);
void node2text (std :: vector, std :: vector);
int numOdom ();
int numScan ();
};

В связанном файле .cpp я написал главное:


int main (int argc, char ** argv) {
буфер символов [1024];
в то время как (1) {
int i = fscanf (stdin, "% s", буфер);

if (strcmp ("выход", буфер) == 0)
Выход (0);

else if (strcmp ("num_nodes", buffer) == 0) {
ROS_INFO («Узлы одометрии:% i \ nСканированные узлы:% i», numOdom (), numScan ());
}

еще {}
}

}

Функция ROS_INFO является частью ROS Willow Garage, и вы можете задавать ее как обычный printf, принимая точно аргументы в той же форме.
При компиляции кода я получаю следующее:

/home/ubisum/fuerte_workspace/beginner/src/stage_listener.cpp: В функции int int (int, char **):
/home/ubisum/fuerte_workspace/beginner/src/stage_listener.cpp:223:5: ошибка: «numOdom» не было объявлено в этой области
/home/ubisum/fuerte_workspace/beginner/src/stage_listener.cpp:223:5: ошибка: «numScan» не был объявлен в этой области

Вы знаете причину ошибок? В Java вы можете получить доступ к закрытым полям / функциям, поэтому я не могу понять причину, почему в C ++ это невозможно.

4

Решение

В Java вы можете получить доступ к приватным полям / функциям

Нет, вы не можете, если вы не используете отражение. Вот и весь смысл делать что-то личное. Я думаю, что вы смешиваете здесь публичное и частное. (Вы Можно доступ к закрытым статическим полям и методам в java из собственного метода main классов). Основная функция в C ++ не связана с классом (и даже если бы это было так, ваш код все равно не работал бы, потому что вы пытались получить статический доступ к членам экземпляра).

5

Другие решения

Здесь есть несколько вещей.

Во-первых, вам нужно сделать объект stage_listener для вызова его методов или сделать методы статическими, а затем использовать оператор разрешения области для вызова функций, если вы хотите, чтобы объекты совместно использовали один и тот же метод.
Во-вторых, вы не можете получить доступ к закрытым переменным (то есть точка скрытия данных в ОО-языках.)

Итак, вам нужно сделать функции общедоступными в классе и либо создать объект класса, либо сделать функции статичными и вызывать их с помощью оператора разрешения области видимости. Полностью зависит от того, что вы пытаетесь достичь. Надеюсь, это поможет.

2

Обычно в C ++ мы используем эти функции как общедоступные.

Вы сделали это как личное, так что только в рамках собственного класса вы можете получить к ним доступ. Итак, если вы пытаетесь использовать их в основном, мы можем подумать, что эти функции должны быть общедоступными.

И вам нужно объявить объект класса. Таким образом, вы можете получить доступ к функции с помощью object.function (); команда.

2

1) Вы не можете вызывать методы без создания экземпляра класса или просто указать, что сначала нужно создать объект.

2) Даже если вы создаете объект своего класса, ваш объект не может вызывать закрытые методы. Так что сделайте numOdom и numScan общедоступными методами.

2

Вы не можете получить доступ к любому частному методу вне одного из методов этого класса (даже в Java).

Установите методы, которые вы хотите использовать снаружи, как общедоступные

1

В C ++ функция main не является частью определенного вами класса (даже если она находится «в связанном файле .cpp»), поэтому она не может получить доступ к закрытым полям. В C ++, как и в Java, только функции, которые объявлены в классе, являются частью класса, и поэтому могут получить доступ к закрытым полям.

0

1) Публичные методы в публичном разделе

2) Чтобы вызвать нестатические публичные методы класса, сначала создайте экземпляр класса

    class stage_listener{
public:
stage_listener()
{
}

//all methods are not implemented
void addOdomNode (const nav_msgs::Odometry) {}
void addScanNode (const sensor_msgs::LaserScan) {}

int numOdom() { return 0; }
int numScan() { return 0; }

private:

std::list<float> odom_list;
........

std::list<float> polar2cart(std::vector<float>, float, float, float, float)
{
//empty list
return std::list<float>();
}

........
};

int main(int argc, char **argv){

char buffer [1024];
while(1){
int i = fscanf(stdin,"%s",buffer);

if(strcmp("exit",buffer) == 0)
exit(0);

else if(strcmp("num_nodes",buffer) == 0){

//create object on the stack
stage_listener sl;

ROS_INFO("Odometry nodes: %i\n
Scan nodes: %i\n",
sl.numOdom(),
sl.numScan());
}
else{
return 1;
}
}
return 0;
}
0
По вопросам рекламы [email protected]