在构造函数中使用参数实例化类时出错LNK2001

时间:2013-04-18 19:37:24

标签: c++

下午好,

问题#1

我有一个神秘的问题,我可以调用我已定义的类而没有任何问题,但是如果我尝试向构造函数添加一个参数,并使用参数实例化该类,则它会给出两个{{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();
}
};

问题#2

我有一个跟进错误。

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

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);
}

我似乎已经完成了所有事情,我不明白为什么会这样。谢谢。

2 个答案:

答案 0 :(得分:3)

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

问题#1

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

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还没有。

问题#2

更改为:

socket_h accelerometer;

即。删除()。否则,编译器会将其与无参数函数声明混淆,后者将具有名称accelerometer并返回类型socket_h。这种歧义问题称为 the most vexing problem

更改为:

accelerometer.setAddress("192.168.5.100", 80);

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

答案 1 :(得分:0)

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

相关问题