
- #include
-
- class MyClass {
- public:
- int regularVar; // 普通成员变量
- static int staticVar; // 静态成员变量
-
- // 构造函数
- MyClass() {
- regularVar = 0;
- }
-
- // 静态成员函数,可以访问静态成员变量和其他静态成员函数
- static void staticFunction() {
- staticVar++;
- }
- };
-
- // 初始化静态成员变量
- int MyClass::staticVar = 0;
-
- int main() {
- MyClass obj1, obj2;
-
- obj1.regularVar = 10;
- obj2.regularVar = 20;
-
- // 访问普通成员变量,实例化后,通过对象访问
- std::cout << "Regular Variable of obj1: " << obj1.regularVar << std::endl;
- std::cout << "Regular Variable of obj2: " << obj2.regularVar << std::endl;
-
- // 访问静态成员变量,不需要实例化类的对象
- std::cout << "Static Variable: " << MyClass::staticVar << std::endl;
-
- // 调用静态成员函数
- MyClass::staticFunction();
- std::cout << "Static Variable after calling staticFunction: " << MyClass::staticVar << std::endl;
-
- return 0;
- }
MyClass 类,其中包含了一个普通成员变量 regularVar 和一个静态成员变量 staticVar。`regularVar`是普通成员变量,每个对象都有自己的副本。`staticVar` 是静态成员变量,所有对象共享同一个副本。main 函数中,创建了两个对象 obj1 和 obj2,分别设置了它们的 regularVar 值。然后,分别通过类名和对象访问了静态成员变量和普通成员变量,并调用了静态成员函数来改变staticVar的值。- Regular Variable of obj1: 10
- Regular Variable of obj2: 20
- Static Variable: 0
- Static Variable after calling staticFunction: 1

- #include
-
- class Example {
- private:
- int privateVar; // 私有成员变量
-
- public:
- int publicVar; // 公有成员变量
-
- // 构造函数
- Example() {
- privateVar = 0;
- publicVar = 0;
- }
-
- // 成员函数访问私有成员
- void setPrivateVar(int value) {
- privateVar = value;
- }
-
- int getPrivateVar() const {
- return privateVar;
- }
- };
-
- int main() {
- Example obj;
-
- // 外部无法直接访问私有成员
- // obj.privateVar; // 编译错误
-
- // 外部可以直接访问公有成员
- obj.publicVar = 42;
-
- // 调用成员函数访问私有成员
- obj.setPrivateVar(10);
- int privateValue = obj.getPrivateVar();
-
- // 输出结果
- std::cout << "Public Variable: " << obj.publicVar << std::endl;
- std::cout << "Private Variable: " << privateValue << std::endl;
-
- return 0;
- }
-
- Public Variable: 42
- Private Variable: 10

/home/gly/catkin_ws/src/navigation-noetic-devel/rrt_star_global_planner-main/src/traj_optimizer.cpp:1066:9: error: invalid use of member ‘Trajectory_optimization::BsplineOptimizer::Opt_Storage’ in static member function
1066 | Opt_Storage.save_vector_T(opt_base_path,FN_2,time_consuming);
| ^~~~~~~~~~~
In file included from /home/gly/catkin_ws/src/navigation-noetic-devel/rrt_star_global_planner-main/src/traj_optimizer.cpp:1:
/home/gly/catkin_ws/src/navigation-noetic-devel/rrt_star_global_planner-main/include/rrt_star_global_planner/traj_optimizer.h:66:37: note: declared here
66 | Data_Storage::FileDataStorage Opt_Storage; //创建FileDataStorage类的实例,取名为Mpc_Storage

costFunctionCallback 中直接调用类的该普通成员Opt_Storage,导致报错costFunctionCallback 设计成非静态成员函数,这样它就可以访问实例的成员变量。此时,在该函数中直接使用以下语句就不会产生报错了Opt_Storage.save_vector_T(opt_base_path,FN_2,time_consuming);
costFunctionCallback函数为静态成员函数,则可以采用第二种方案,使用实例化的类的对象来调用该成员,此时,上述语句需要改写成以下的形式- //由于costFunctionCallback是静态成员函数,而静态函数无法直接访问非静态成员
- //需要借助类的实例来访问
- Trajectory_optimization::BsplineOptimizer temporary_object;
-
- temporary_object.Opt_Storage.save_vector_T(temporary_object.opt_base_path,temporary_object.FN_2,time_consuming);
costFunctionCallback函数为静态成员函数,除了上面的第二种方案,还有第三种解决方案,即将想要在costFunctionCallback函数中直接调用的相关成员,由普通成员更改为静态成员,并在类中声明,在类外对其进行初始化。 最终,因为我需要保留costFunctionCallback函数为静态成员函数,且为了方便的通过修改类所在的h文件来对相关参数进行设定,不想采用类内声明,类外初始化的形式,所以放弃了第一种和第三种方案,采用了第二种方案,编译成功
