下午好,
我有一个神秘的问题,我可以调用我已定义的类而没有任何问题,但是如果我尝试向构造函数添加一个参数,并使用参数实例化该类,则它会给出两个{{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");
}
但是,我现在收到错误:
private: System::Void read_socket_Click(System::Object^ sender, System::EventArgs^ e) {
socket_h accelerometer();
accelerometer->setAddress("192.168.5.100", 80);
}
我似乎已经完成了所有事情,我不明白为什么会这样。谢谢。
答案 0 :(得分:3)
你有一大堆错误和误解。从Hello World program开始阅读一些C ++教程对你有好处。现在问题。
您忘记在头文件中声明无参数构造函数:
class socket_h {
...
socket_h();
...
};
你的源文件看起来也很可疑。你不应该再在源文件中使用class socket_h { ... };
了。而是使用 scope resolution operator :
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中,您可以使用 Delegating constructors ,如下所示:
socket_h::socket_h(): socket_h("192.168.5.100")
{
}
但是,VC ++ 11中的这个功能seems to be not implemented还没有。
更改为:
socket_h accelerometer;
即。删除()
。否则,编译器会将其与无参数函数声明混淆,后者将具有名称accelerometer
并返回类型socket_h
。这种歧义问题称为 the most vexing problem 。
更改为:
accelerometer.setAddress("192.168.5.100", 80);
解释很简单:accelerometer
不是指针,因此您不应该使用->
来访问其成员和方法。 accelerometer
是socket_h
的一个实例,因此要访问其成员和方法,您应该使用.
运算符。
答案 1 :(得分:0)
socket_h加速度计(“192.168.5.100”); //你没有一个将字符串作为参数的构造函数。