错误LNK2001在构造函数中实例化带有参数的类

Error LNK2001 when instantiating a class with parameters within a constructor

本文关键字:参数 实例化 LNK2001 构造函数 错误      更新时间:2023-10-16

下午好,

问题# 1

我有一个神秘的问题,我可以调用一个类,我已经定义没有任何问题,但是,如果我试图添加一个参数到构造函数,并实例化类与一个参数,它给出两个LNK2001错误,一个为构造函数和一个为析构函数。

error LNK2001: unresolved external symbol "public: __thiscall socket_h::~socket_h(void)" (??1socket_h@@$$FQAE@XZ)
error LNK2001: unresolved external symbol "public: __thiscall socket_h::socket_h(char const *)" (??0socket_h@@$$FQAE@PBD@Z)

代码如下:

类头文件:

class socket_h{
protected:
    ;//...
public:
    socket_h(const char*);
    int receive_data(char* szBuffer);
    int send_data(char* szMessage);
    ~socket_h(void);
};

类来源:

class socket_h{
protected: 
       ;//...
public:
socket_h()
{
    socket_h("192.168.5.100");
}
socket_h(const char* ip_address)
{
    ;//...;
}
//...
~socket_h(void)
{
    closesocket(sClient);
    WSACleanup();
}
};

调用函数:

private: System::Void read_socket_Click(System::Object^  sender, System::EventArgs^  e) {
         socket_h accelerometer("192.168.5.100");
}

问题# 2

我有一个后续错误。

我仍然在寻找上述问题的帮助,但为了节省时间,我在类中添加了一个额外的方法,并将调用函数更改为:

private: System::Void read_socket_Click(System::Object^  sender, System::EventArgs^  e) {
         socket_h accelerometer();
         accelerometer->setAddress("192.168.5.100", 80);
}

但是,我现在得到错误:

error C2227: left of '->setAddress' must point to class/struct/union/generic type   1664    1

我似乎做的一切都是正确的,我不明白为什么会发生这种情况。谢谢你。

你有一大堆错误和误解。从Hello World程序开始,阅读一些c++教程会对你有好处。现在说问题。

问题# 1

忘记在头文件中声明无参数构造函数:

class socket_h {
  ...
  socket_h();
  ...
};

你的源文件看起来也很可疑。你不应该再在源文件中使用class socket_h { ... };了。相反,使用范围解析操作符:

定义方法和构造函数
socket_h::socket_h()
{
}
socket_h::socket_h(const char* ip_address)
{
}
socket_h::~socket_h(void)
{
    closesocket(sClient);
    WSACleanup();
}

此外,构造函数链调用有语义错误:

socket_h::socket_h()
{
    socket_h("192.168.5.100"); // <--- this is illegal
}

在c++ 11中,您可以使用委托构造函数,如下所示:

socket_h::socket_h(): socket_h("192.168.5.100")
{
}

然而,vc++ 11似乎还没有实现这个特性。

问题# 2

更改为:

socket_h accelerometer;

。移除()。否则,编译器会将其与无参数函数声明混淆,后者的名称为accelerometer,返回类型为socket_h。这种歧义问题被称为最令人烦恼的问题

更改为:

accelerometer.setAddress("192.168.5.100", 80);

解释很简单:accelerometer不是指针,因此你不应该使用->来访问它的成员和方法。accelerometersocket_h的一个实例,所以要访问它的成员和方法,应该使用.操作符。

socket_h加速度计("192.168.5.100");//你没有一个以字符串作为参数的构造函数