【问题标题】:Error LNK2001 when instantiating a class with parameters within a constructor在构造函数中使用参数实例化类时出现错误 LNK2001
【发布时间】:2013-04-18 19:37:23
【问题描述】:

下午好,

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

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

【问题讨论】:

  • 你为什么要加分号?!
  • 抱歉,这是针对问题 #1 还是 #2?构造函数中的分号在那里,而不是我在其中的代码。

标签: c++


【解决方案1】:

你有一大堆错误和误解。从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")
{

}

但是,这个功能 seems to be not implemented 在 VC++ 11 中还没有。

问题 #2

改为:

socket_h accelerometer;

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

改为:

accelerometer.setAddress("192.168.5.100", 80);

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

【讨论】:

  • 感谢您的帮助,我将类函数、构造函数和析构函数更改为使用范围解析运算符。然而,同样的问题也会发生。我也将 ->setAddress(...) 更改为 .setAddress(...) ,但我仍然收到错误:错误错误 C2228: left of '.setAddress' must have class/struct/union
  • 我使用了与本例相同的格式:cplusplus.com/forum/beginner/11123
  • 谢谢,我试过了,现在我收到“LNK2022:重复类型中的布局信息不一致”错误。该类是从 Windows 窗体 C++ CLR 代码中实例化的。我在这里阅读:stackoverflow.com/questions/11990095/… 这不适用于 CLR?用 CLR 使用类是不可能的吗?我尝试按照此处的建议在最顶部包含 idigitalhouse.com/Blog/?p=163,但没有任何成功
  • 只需按照您链接的问题中的答案进行操作即可。您在原始问题中寻求帮助的错误现在已解决,因此已回答此问题。如果您遇到更多麻烦,则必须创建一个单独的问题并清楚说明它们是什么,因为这篇文章太样板了。
  • 感谢所有帮助,很遗憾,我无法删除 /clr 选项。我将不得不摆脱代码作为一个类,因为我只需要它的 1 个实例。但是下次需要实现类结构时会参考这些信息。谢谢,
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多