-2

Issue:

I am trying to instantiate a class (say class A) inside another class (say class B) and then call all the member functions of class A inside the class B for the instantiated object. I get the following error message for every call of class A methods inside class B:

error: invalid use of non-static member function

I am aware of the following thread about the same problem. Invalid use of non-static member function c++. But I don't find that solution relevant to my problem. I am elaborating the problem below. Can you please enlighten me what is going wrong ?

Code:

The following are my classes:

Navigation.h

class Navigation {
public:
    Navigation() {
    laserData = n.subscribe("/scan", 200, &Navigation::laserCallback, this);
    velPub = n.advertise<geometry_msgs::Twist> ("/mobile_base/commands/velocity", 100, this);
}
    ~Navigation() {}
    geometry_msgs::Twist moveCommand();
    geometry_msgs::Twist turnCommand();
    geometry_msgs::Twist stopCommand();
    void laserCallback(const sensor_msgs::LaserScan::ConstPtr& data);
    float getObstacleRange();
    void broadcastVelocity(geometry_msgs::Twist velocity);

private:
    ros::NodeHandle n;
    ros::Publisher velPub;
    ros::Subscriber laserData;
    float obstacleRange;
    ros::Timer normalTurnTimer;
    ros::Timer driveTimer;
    ros::Timer periodicTurnTimer;
    geometry_msgs::Twist drivePower;
};

Navigation.cpp

geometry_msgs::Twist Navigation::moveCommand() {
    return drivePower;
}

geometry_msgs::Twist Navigation::turnCommand() {
    return drivePower;
}

geometry_msgs::Twist Navigation::stopCommand() {
    return drivePower;
}

void Navigation::laserCallback(const sensor_msgs::LaserScan::ConstPtr& data) {
    obstacleRange = 0.8;

}

float Navigation::getObstacleRange() {
    return obstacleRange;
}

void Navigation::broadcastVelocity(geometry_msgs::Twist velocity) {
    velPub.publish(velocity);
}

Turtlebot.h

class Turtlebot {
public:
    Turtlebot() {
        Navigation nomad;
    }
    ~Turtlebot() {}
    void drive();

private:
    Navigation nomad;
};

Turtlebot.cpp

void Turtlebot::drive() {
    if (nomad.getObstacleRange() < 0.7) {
        nomad.broadcastVelocity(nomad.stopCommand);
        int i;
        while (i < 5) {
            nomad.broadcastVelocity(nomad.turnCommand);
            i++;
        }
    } else nomad.broadcastVelocity(nomad.moveCommand);
}

Errors:

I get the following errors during cmake .. && make

/home/arun/Documents/catkin_ws/src/TinyNomad/src/Turtlebot.cpp: In member function ‘void Turtlebot::drive()’:
/home/arun/Documents/catkin_ws/src/TinyNomad/src/Turtlebot.cpp:37:50: error: invalid use of non-static member function
     nomad.broadcastVelocity(nomad.stopCommand);
                                              ^
/home/arun/Documents/catkin_ws/src/TinyNomad/src/Turtlebot.cpp:40:54: error: invalid use of non-static member function
         nomad.broadcastVelocity(nomad.turnCommand);
                                                  ^
/home/arun/Documents/catkin_ws/src/TinyNomad/src/Turtlebot.cpp:43:53: error: invalid use of non-static member function
 } else nomad.broadcastVelocity(nomad.moveCommand);
                                                 ^
TinyNomad/CMakeFiles/tinynomad.dir/build.make:110: recipe for target 'TinyNomad/CMakeFiles/tinynomad.dir/src/Turtlebot.cpp.o' failed
make[2]: *** [TinyNomad/CMakeFiles/tinynomad.dir/src/Turtlebot.cpp.o] Error 1
CMakeFiles/Makefile2:1191: recipe for target 'TinyNomad/CMakeFiles/tinynomad.dir/all' failed
make[1]: *** [TinyNomad/CMakeFiles/tinynomad.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j12 -l12" failed
Micha Wiedenmann
  • 19,979
  • 21
  • 92
  • 137
Arun Kumar
  • 634
  • 2
  • 12
  • 26
  • Could you please remove as much code as possible to minimize the problem? – Micha Wiedenmann Dec 12 '18 at 07:42
  • Ok. I removed some parts of code which are not necessary. – Arun Kumar Dec 12 '18 at 07:45
  • 1
    Method `broadcastVelocity` accepts a parameter of (non-function) type `geometry_msgs::Twist`. You are trying to call this method with `nomad.stopCommand` which is a **function** returning the value of required type. The compiler complains exactly about that incompatibility. Probably, you want to **call** that function: `nomad.stopCommand()`. – Tsyvarev Dec 12 '18 at 07:55
  • Thanks. This solution works. This was the exact issue. – Arun Kumar Dec 12 '18 at 07:57

1 Answers1

0

start with fixing your constructor:

Turtlebot() {
        nomad = Navigation() ;
    }
Atheel Massalha
  • 424
  • 1
  • 6
  • 18