错误LNK2001在构造函数中实例化带有参数的类
Error LNK2001 when instantiating a class with parameters within a constructor
下午好,
问题# 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
不是指针,因此你不应该使用->
来访问它的成员和方法。accelerometer
是socket_h
的一个实例,所以要访问它的成员和方法,应该使用.
操作符。
socket_h加速度计("192.168.5.100");//你没有一个以字符串作为参数的构造函数
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 如何在模板函数中实例化其长度使用模板参数的数组
- 函数在可变参数模板的实例化期间不可见
- 实例化模板时,我是否必须显式显示参数包中的类型?
- 从模板参数包实例化的访问类实现
- C++ 可变参数模板实例化深度超过最大值 900
- 与参数匹配的友元模板函数实例化
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 在编译时检查未实例化的类模板是否继承自其第一个模板参数
- 如何将包装作为模板参数实例化专用模板类
- 如何在 c++ 中使用枚举参数实例化对象
- 使用NULL参数实例化模板类
- 使用模板参数实例化模板类
- 使用bool非类型参数实例化类模板时出错
- 从类别上防止或阻止使用特定参数实例化对象
- 如何用不同的参数实例化类
- 模板是否为相同类型的参数实例化多次
- C++:根据一个参数实例化一个模板化的类
- 用Constructor参数实例化类对象和不带参数C++的*运算符之间的区别