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 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式