如何在头文件C++中实现类对象

Posted

技术标签:

【中文标题】如何在头文件C++中实现类对象【英文标题】:How to implement class objects in header file C++ 【发布时间】:2019-07-24 06:12:47 【问题描述】:

如何在头文件中实现类对象,以便每次包含头文件时,都可以访问 cpp 文件中的对象?这是我现在的代码:

//motor-config.cpp
#include "core.hpp"
#define create_motor_group(x,y...) Motor_Group x (y)
create_motor_group(fullDrive, frontLeft,rearLeft,frontRight,rearRight);
create_motor_group(leftDrive,frontLeft,rearLeft);
create_motor_group(rightDrive,frontRight,rearRight);
create_motor_group(lift,leftLift,rightLift);
create_motor_group(roller,leftRoller,rightRoller);
//motor-config.h
#include "core.hpp"
extern Motor_Group fullDrive;
extern Motor_Group leftDrive;
extern Motor_Group rightDrive;
extern Motor_Group lift;
extern Motor_Group roller;

但是,当我使用成员函数时,它没有给我任何响应:

//init.cpp
#include "motor-config.h"
void initialize()
  llemu::init();
  initMove();
  leftDrive.move(127);

另一方面,这是可行的。

//init.cpp
void initialize()
  Motor_Group test(frontLeft,rearLeft)
  llemu::init();
  initMove();
  test.move(127);

有谁知道我该如何解决这个问题?

【问题讨论】:

“它没有给我回应:”是什么意思。编译、链接时出现硬错误(如果有,那是什么错误)或在运行时执行特定操作? 没有错误。它只是.move() 没有按预期工作。我认为它创建了 Motor_Group 类的空对象。 您确定在您的对象初始化完成后调用了initialize(),即它是从main() 调用还是从其他对象初始化序列调用? 它是从一个api调用的。 需要查看更多代码。特别是Motor_Group 类及其方法。而对 sklott 问题的正确回答,它是从 api 调用的,并不能回答问题。 【参考方案1】:

这不是完整的答案,因为在您的代码中发生的事情有太多未知数,而是解释了错误的对象创建顺序如何发生。

示例如下:

#include <iostream>

int init();

struct A 
    A() std::cout << "A constructor" << std::endl;
    int a = 5;
;

struct B 
    B() std::cout << "B constructor" << std::endl;
    int b = init();
;

B b;
A a;
B other_b;

int init() 
    return a.a;


int main()

    std::cout << b.b << std::endl << other_b.b << std::endl;

您可能认为输出中的 2 个数字都是 5,但实际上第一个数字可能是任何东西(根据未定义的行为),只有第二个数字是 5,因为在这种特殊情况下创建对象的顺序是:

B constructor of b
A constructor of a
B constructor of other_b

但是不同模块之间的对象初始化顺序是不确定的,即你的代码中可以有一个模块在模块motor-config.cpp中的对象被初始化之前按照一些对象初始化的顺序调用initialize()

【讨论】:

以上是关于如何在头文件C++中实现类对象的主要内容,如果未能解决你的问题,请参考以下文章

即使在 XCTest 文件中实现类扩展中的方法后,仍会调用协议的默认实现

我是不是在头文件中正确创建了一个对象?

在python中实现类接口的正确方法是啥

在 Scala Slick 中实现类实例成员修改的最佳方法?

解口的定义与实现

如何从文本文件 C++ 创建对象?