0

下午好,

问题 #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

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

4

2 回答 2

3

你有一大堆错误和误解。从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否则,编译器会将其与具有 name和 return type的无参数函数声明混淆socket_h。这种模棱两可的问题被称为最令人头疼的问题

改成:

accelerometer.setAddress("192.168.5.100", 80);

解释很简单:accelerometer不是指针,因此您不应该使用->它来访问它的成员和方法。accelerometer是 的一个实例socket_h,因此要访问其成员和方法,您应该使用.运算符。

于 2013-04-18T19:40:54.577 回答
0

socket_h 加速度计(“192.168.5.100”);// 您没有将字符串作为参数的构造函数。

于 2013-04-18T19:57:01.750 回答