在类中创建对象

Posted

技术标签:

【中文标题】在类中创建对象【英文标题】:Creating object(s) within a Class 【发布时间】:2019-10-26 00:20:48 【问题描述】:

我有这个问题:

问题:

我正在尝试创建一个库 (ard33WiFi) 来管理和处理 其他几个库(例如 WiFiServer 库) 我需要创建服务器对象,然后在我的库 (ard33WiFi) 中的函数中使用它:

WiFiServer myServer(iPort);

问题是当我在类的成员中调用 myServer 时,我得到:

'myServer' was not declared in this scope

在哪里/如何声明 myServer 以便整个班级都可以使用 (ard33WiFi)?我已经取消了任何声明,因为无论我尝试什么都是错误的。我在下面粘贴了一个骨架代码。

// HEADER FILE (.h)
// ----------------------------------------------------------------------------------------------
#ifndef Ard33WiFi_h
#define Ard33WiFi_h

#include <WiFiNINA.h>
#include <WiFiUdp.h>

class ard33WiFi
  public:
    ard33WiFi(int iPort)

    void someFunction();
    void serverBegin();

  private:
    int _iPort;

;
#endif

// ----------------------------------------------------------------------------------------------
// C++ FILE (.cpp)
// -----------------------------------------------------------------------------------------------
#include <Ard33Wifi.h>

ard33WiFi::ard33WiFi(int iPort)
  _iPort = iPort;

void ard33WiFi::someFunction()
  // code here required to prepare the server for initializing
  // but ultimately not relevant to the question

void ard33WiFi::serverBegin()
  myServer.begin();
  Serial.println("Server Online");

我在 UDP 库中遇到了同样的问题,因为我需要在各种函数中调用 UDP 对象来做 UDP 事情。

任何帮助将不胜感激。

【问题讨论】:

我在您提供的代码中看不到 WiFiServer myServer(iPort);。我看到的只是myServer,它没有按照错误指示声明。 WiFiServer myServer;放在int _iPort;之后。并使用您的ard33WiFi 的初始化列表来初始化端口 这就是为什么你需要在构造函数的初始化列表中初始化。幸好它有你需要的端口。 【参考方案1】:

我想你正在使用这个:

https://www.arduino.cc/en/Reference/WiFiServer

我可以看到您没有在您的班级中声明 myServer;我猜是你的代码中的错误。如果我没记错的话,应该是这样的:

#ifndef Ard33WiFi_h
#define Ard33WiFi_h

#include <WiFiNINA.h>
#include <WiFiUdp.h>
#include <WiFi.h>  // Not sure if you have to append this include

class ard33WiFi
  public:
    ard33WiFi(int iPort)

    void someFunction();
    void serverBegin();

  private:
    int _iPort;
    WiFiServer myServer;

;
#endif

实现,你需要初始化实例:

#include <Ard33Wifi.h>

ard33WiFi::ard33WiFi(int iPort):myServer(iPort), _iPort(iPort) 


void ard33WiFi::someFunction()
  // code here required to prepare the server for initializing
  // but ultimately not relevant to the question

void ard33WiFi::serverBegin()
  myServer.begin();
  Serial.println("Server Online");


【讨论】:

请注意,成员是按照它们定义的顺序初始化的,所以myServer(iPort), _iPort(iPort)首先初始化_iPort,即使它在列表中是第二个。在这里没关系,但记住这一点是件好事,因为当它确实重要时,它可能会导致一些微妙的 ups。 @alejandro。谢谢您的回答。正如我在问题简介中提到的,我故意将 myServer 的减速排除在外,因为我尝试将它放在哪里都是错误的。关于你的回答。这看起来与我尝试过的任何声明都非常不同,我将在今天晚些时候尝试。非常感谢你。如果有效,我会及时通知您。 感谢您的解决方案。我将不得不对构造函数的初始化做更多的研究。如果您有任何关于此步骤背后的语法的有用信息的重要链接? ard33WiFi::ard33WiFi(int iPort):myServer(iPort), _iPort(iPort) 上面的链接是一个例子,也许对你有帮助,我在这里再次粘贴链接只是为了澄清:arduino.cc/en/Reference/WiFiServer

以上是关于在类中创建对象的主要内容,如果未能解决你的问题,请参考以下文章

在类中创建多维 STL 向量

在类中创建对象的最佳实践

在类中创建一个向量,然后在函数中使用类对象不起作用

如何在 n 层架构中创建集线器对象

python进阶三(面向对象编程基础)3-1 python中创建类属型

Java学习之单例模式