greenapl1985 2020-01-16 10:34 采纳率: 50%
浏览 267
已采纳

类的定义和它的成员函数的实现分开放会报错

为什么将类的定义和它的成员函数的实现分别放在.h和.cpp中就会报错:
LNK2019: 无法解析的外部符号 "public: void __cdecl YtPlc_Mitsubishi_Mc::InitParam(void)" (?InitParam@YtPlc_Mitsubishi_Mc@@QEAAXXZ),该符号在函数 main 中被引用 PLC_test D:\zhoujy\prj\PLC_test\PLC_test\PLC_test.obj

.h中的代码如下:

class YtPlc_Mitsubishi_Mc  // : public YtPlc
{
public:
    YtPlc_Mitsubishi_Mc();

    //初始化参数
    void InitParam();
};

.cpp中的实现如下:

#include "ytplc_mitsubishi_mc.h"

YtPlc_Mitsubishi_Mc::YtPlc_Mitsubishi_Mc()
{

}

void YtPlc_Mitsubishi_Mc::InitParam()
{
    //发送命令
    write_buff_[0] = 0x50; // 副头部
    write_buff_[1] = 0x00; // 副头部
    write_buff_[2] = 0x00; // 网络编号
    write_buff_[3] = (char)0xff; // 可编程控制器编号
    write_buff_[4] = (char)0xff; // 请求目标模块I/O编号L
    write_buff_[5] = 0x03; // 请求目标模块I/O编号H
    write_buff_[6] = 0x00; // 请求目标模块站号

    // 长度从CPU监视定时器L到指令结束
    write_buff_[7] = 0x00; //请求数据长度L
    write_buff_[8] = 0x00; //请求数据长度H

    //CPU 监视定时器 0:无限等待 0001~FFFF H (1~65535): 等待时间(单位 250ms) @《三菱Q_L系列通信协议参考》3.1.3 P73
    write_buff_[9] = 0x01;  // CPU监视定时器L
    write_buff_[10] = 0x00; // CPU监视定时器H

    // 指令1401 @《三菱Q_L系列通信协议参考》3.3.7 P154
    write_buff_[11] = 0x01; // 指令L
    write_buff_[12] = 0x14; // 指令H
    write_buff_[13] = 0x00; // 子指令L
    write_buff_[14] = 0x00; // 子指令H

    // 字单位的批量写入
    write_buff_[15] = 0x00; // 起始软元件
    write_buff_[16] = 0x00; // 起始软元件
    write_buff_[17] = 0x00; // 起始软元件
    write_buff_[18] = 0x00; // 软元件代码
    write_buff_[19] = 0x00; // 软元件点数
    write_buff_[20] = 0x00; // 软元件点数

    // 软元件点数的范围
    // e.g 1995H 1202H 1130H -> {95H 19H 02H 12H 30H 12H}
    for (int i = 0; i < 20; i++)
    {
        write_buff_[21 + i * 2] = 0x00;
        write_buff_[21 + i * 2 + 1] = 0x00;
    }

    //读取命令
    read_buff_[0] = 0x50; // 副头部
    read_buff_[1] = 0x00; // 副头部
    read_buff_[2] = 0x00; // 网络编号
    read_buff_[3] = (char)0xff; // 可编程控制器编号
    read_buff_[4] = (char)0xff; // 请求目标模块I/O编号L
    read_buff_[5] = 0x03; // 请求目标模块I/O编号H
    read_buff_[6] = 0x00; // 请求目标模块站号

    read_buff_[7] = 0x0c; //请求数据长度L
    read_buff_[8] = 0x00; //请求数据长度H

    //CPU 监视定时器 0:无限等待 0001~FFFF H (1~65535): 等待时间(单位 250ms) @《三菱Q_L系列通信协议参考》3.1.3 P73
    read_buff_[9] = 0x01;  // CPU监视定时器L
    read_buff_[10] = 0x00; // CPU监视定时器H

    // 0401  T寄存器读取 @《三菱Q_L系列通信协议参考》3.3.6 P150
    // WARNING: M寄存器读取 send_buff_[18] = 0x90 待确认
    read_buff_[11] = 0x01; // 指令L
    read_buff_[12] = 0x04; // 指令H
    read_buff_[13] = 0x00; // 子指令L
    read_buff_[14] = 0x00; // 子指令H

    // 字单位的批量写入
    read_buff_[15] = 0x00; // 起始软元件
    read_buff_[16] = 0x00; // 起始软元件
    read_buff_[17] = 0x00; // 起始软元件
    read_buff_[18] = 0x00; // 软元件代码
    read_buff_[19] = 0x00; // 软元件点数
    read_buff_[20] = 0x00; // 软元件点数
}

但如果把它们都放到头文件中,即把成员函数和构造函数的实现和类的定义放到一起,就不会有这个问题了

  • 写回答

1条回答 默认 最新

  • 白色一大坨 2020-01-16 10:42
    关注

    我用vs的向导建了这个类,调用完全没问题,你参考一下:
    头文件:

    #pragma once
    class YtPlc_Mitsubishi_Mc
    {
    public:
        YtPlc_Mitsubishi_Mc();
        ~YtPlc_Mitsubishi_Mc();
        void InitParam();
    };
    
    

    cpp

    #include "YtPlc_Mitsubishi_Mc.h"
    
    
    YtPlc_Mitsubishi_Mc::YtPlc_Mitsubishi_Mc()
    {
    }
    
    
    YtPlc_Mitsubishi_Mc::~YtPlc_Mitsubishi_Mc()
    {
    }
    
    
    void YtPlc_Mitsubishi_Mc::InitParam()
    {
    }
    
    

    主函数:

    #include<iostream>
    #include "YtPlc_Mitsubishi_Mc.h"
    using namespace std;
    
    
    //主函数
    int main()
    {
        YtPlc_Mitsubishi_Mc test;
        test.InitParam();
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办