【问题标题】:Undefined reference to Class::Object对 Class::Object 的未定义引用
【发布时间】:2013-08-21 08:45:06
【问题描述】:

我有一个类为我的程序处理串行通信,称为“serial.h 和serial.cpp”。它有以下构造函数:

#include "serial.h"

serialib LS;

serial::serial(void)
{
    int Ret;
    Ret = LS.Open(DEVICE_PORT, BAUD_RATE);
    if (Ret != 1)
    {
        printf("Serial port open FAILED!\n");
    }
    else
    {
        printf("Serial port successfully opened...");
    }
}

我想在另一个类中调用这个类并使用它的方法,所以我在一个名为 dataHandler.cpp 的类中执行以下操作:

#include "dataHandler.h"
#include "serial.h"

using namespace opendnp3;

serial ser;

dataHandler::dataHandler(void)
{

}


dataHandler::~dataHandler(void)
{
}

int dataHandler::sendRestartCommand()
{
    int Ret;
    char buffer[128];
    RestartInfo ri;
    std::string strW = "GetRestartInfo\r\n";
    std::string strR;
    Ret = ser.Write(strW);
    int bytes;

    Ret = ser.Read(strR);
    if ((strR.compare("201-OK [GetRestartInfo]\r\n")) != 0)
    {
        printf ("Wrong response from device to restart message.\n");
        return 0;   
    }

    Ret = ser.Read(strR);
    std::string s_bytes = strR.substr(4,3);
    std::stringstream ss(s_bytes);

    if (!(ss >> bytes))
        bytes = 0;

    Ret = ser.Read(buffer);

    writeSettings(ri);

    return 1;
}

但是,当我这样做时,我收到以下错误:

dataHandler.o: In function `dataHandler::sendRestartCommand()':
dataHandler.cpp:(.text+0x31c): undefined reference to `dataHandler::ser'
collect2: error: ld returned 1 exit status

我最初的计划是在我的 .h 文件中创建一个串行对象,例如:

public:
    serial ser;

但这也没用…… 我对如何做到这一点有点困惑,我知道我可能遗漏了一些小东西。 有什么建议吗?

【问题讨论】:

  • 不,不...首先,如果您使用全局变量,则会违反封装规则。其次,串行类的声明在哪里 - 这可能是你的问题。最后,请重构您的代码并尝试使用 OOP 规则:stackoverflow.com/questions/399656/are-there-any-rules-for-oop
  • 您至少应该包含有问题的标题。或者更好地提供SSCCE
  • 谢谢,我会研究一下,需要在 OOP 上磨练

标签: c++ class object


【解决方案1】:

我最终做的是创建一个带参数的构造函数:

serial::serial(std::string devPort, int baud)
{
    int Ret;
    const char * devP = devPort.c_str();
    Ret = LS.Open(devP, baud);
    if (Ret != 1)
    {
        printf("Serial port open FAILED!\n");
    }
    else
    {
        printf("Serial port successfully opened...");
    }
}

然后我这样称呼它:

static serial ser(DEVICE_PORT, BAUD_RATE);

现在工作正常。因此,我将串行对象称为全局变量!

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 2013-01-19
    • 2012-07-29
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多