未解决的外部符号

时间:2011-07-10 21:41:24

标签: c++ class

  

可能重复:
  What is an undefined reference/unresolved external symbol error and how do I fix it?

我对C ++比较陌生(正如你可以通过这个问题所说的那样)而且我遇到了问题。我有两个文件:Drives.h和Drives.cpp

Drives.h

#pragma once

enum MountMode
{
    User,
    System,
    Both,
    Auto
};

class Drive
{
public:
    Drive(void);
    ~Drive(void);

    BOOL Mount(MountMode mode);
    VOID Unmount(void);
    BOOL IsConnected(void);

    static char* DeviceName;
    static char* DrivePath;
};

class Drives
{
public:
    Drives(void);
    ~Drives(void);
};

和我的Drives.cpp:

#include "stdafx.h"
#include "Drives.h"

Drives::Drives(void)
{
    Drive USB0; //Error happening here
}

Drives::~Drives(void)
{
}

错误是说Drives类构造函数,析构函数和IsConnected()都是未解析的外部。我不确定自从我将这个课程设置为cplusplus.com

之后我缺少了什么

提前致谢

4 个答案:

答案 0 :(得分:4)

正如错误消息所示,您尚未实现Drive的构造函数和析构函数:

Drive::Drive(void) {
    ...
}

Drive::~Drive(void) {
    ...
}

创建类类型的局部变量(就像在Drive USB0;中一样)将调用该类的构造函数,析构函数将在变量范围的末尾调用;因此错误。

你也应该实现Drive的其他功能 - 在类声明中声明一个函数本质上是一个函数将在某个地方实现的承诺。

答案 1 :(得分:3)

是的,这些方法已在头文件的Drive类中声明,但您实际上并没有为这些方法创建一个主体。

您必须在头文件中创建一个内联体,在CPP文件中创建一个体,或者确保使用定义这些方法的现有文件进行链接。否则,错误是正确的,这些方法尚未定义。

答案 2 :(得分:2)

未解决的外部符号错误通常表示您已提供函数声明但未提供其定义。

在您的情况下,由于您声明了Drive(void)~Drive(void),编译器会删除其默认值并期望您的定义存在,但它们不存在,因此会引发错误。

作为旁注:使用void代替空括号表示“此函数不带参数”是C样式定义,不应使用。

此外,使用#pragma once替代包含警卫。它是Microsoft特定的构造,与其他编译器不兼容。请使用实际的包含警卫:

 
#ifndef CLASS_NAME_H
#define CLASS_NAME_H
//CODE HERE
#endif
 

答案 3 :(得分:1)

在以下代码中,您声明了两个类(DriveDrives),但是您只为一个类(Drives)提供了实现

#pragma once

enum MountMode
{
    User,
    System,
    Both,
    Auto
};

class Drive
{
public:
    Drive(void);
    ~Drive(void);

    BOOL Mount(MountMode mode);
    VOID Unmount(void);
    BOOL IsConnected(void);

    static char* DeviceName;
    static char* DrivePath;
};

class Drives
{
public:
    Drives(void);
    ~Drives(void);
};

要删除错误消息,您必须包含Drive的类方法的实现。在扩展您的Drives.cpp以便您的代码可以工作的方式如下所示:

#include "stdafx.h"
#include "Drives.h"

//Drive class constructor
Drive::Drive(void)
{
   //Add initialization code here. For example:
   DeviceName = "Name";
   DrivePath = "";
}

//Drive class destructor
Drive::~Drive(void)
{
}

//Also add the implementation for Mount
BOOL Drive::Mount(MountMode mode)
{
  //implementation for Mount. For example:
  return FALSE;
}

//Also add the implementation for Mount
VOID Drive::Unmount()
{
  //implementation for Unmount
}

//Also add the implementation for Mount
BOOL Drive::IsConnected()
{
  //implementation for IsConnected.For example:
  return FALSE;
}


//Drives class constructor
Drives::Drives(void)
{
    Drive USB0; //Error happening here
}

//Drives class destructor
Drives::~Drives(void)
{
}

也可以复制paste-d代码,你也可以使用Drive类的实现,但是将它保存在另一个.cpp文件中,如Drive.cpp。在这种情况下,您应该将所有实现方法从另一个Drive.cpp文件复制到Drives.cpp。或者您应该将Drive类的声明从Drives.h移至Drive.h。在这种情况下,您可以清楚地分隔不同文件中的类,这很好,但您必须在Drive.h文件中包含Drives.h