【问题标题】:Trying to setup a global Redis connection in a class using Redispp尝试使用 Redispp 在类中设置全局 Redis 连接
【发布时间】:2015-10-15 11:32:32
【问题描述】:

我是一个完整的 C++ 菜鸟。我正在尝试设置 Redis 连接并能够使用 c++ 方法将密钥设置为 redis。 c++ 代码很长,所以我只包括相关部分: webpage.h

#ifndef WEBPAGE_H #define WEBPAGE_H #包括 #包括 #包括 #包括 #include "cookiejar.h" #include “redispp.h” 类配置; 类自定义页面; 类网页回调; 类网络访问管理器; 类 QWebInspector; WebPage 类:公共 QObject,公共 QWebFrame::PrintCallback { Q_OBJECT Q_PROPERTY(QString 标题 READ 标题) Q_PROPERTY(QString frameTitle READ frameTitle) Q_PROPERTY(QString content READ content WRITE setContent) Q_PROPERTY(QString frameContent READ frameContent WRITE setFrameContent) Q_PROPERTY(QString url READ url) Q_PROPERTY(QString frameUrl READ frameUrl) Q_PROPERTY(bool loading READ loading) Q_PROPERTY(int loadingProgress READ loadingProgress) Q_PROPERTY(bool canGoBack READ canGoBack) Q_PROPERTY(bool canGoForward READ canGoForward) Q_PROPERTY(QString plainText READ plainText) Q_PROPERTY(QString framePlainText READ framePlainText) Q_PROPERTY(QString libraryPath READ libraryPath WRITE setLibraryPath) Q_PROPERTY(QString offlineStoragePath READ offlineStoragePath) Q_PROPERTY(int offlineStorageQuota READ offlineStorageQuota) Q_PROPERTY(QVariantMap viewportSize READ viewportSize WRITE setViewportSize) Q_PROPERTY(QVariantMap paperSize READ paperSize WRITE setPaperSize) Q_PROPERTY(QVariantMap clipRect READ clipRect WRITE setClipRect) Q_PROPERTY(QVariantMap scrollPosition READ scrollPosition WRITE setScrollPosition) Q_PROPERTY(bool navigationLocked READ navigationLocked WRITE setNavigationLocked) Q_PROPERTY(QVariantMap customHeaders READ customHeaders WRITE setCustomHeaders) Q_PROPERTY(qreal zoomFactor READ zoomFactor WRITE setZoomFactor) Q_PROPERTY(QVariantList cookies READ cookies WRITE setCookies) Q_PROPERTY(QString windowName READ windowName) Q_PROPERTY(QObjectList pages READ pages) Q_PROPERTY(QStringList pagesWindowName READ pagesWindowName) Q_PROPERTY(bool ownsPages READ ownsPages WRITE setOwnsPages) Q_PROPERTY(QStringList framesName READ framesName) Q_PROPERTY(QString frameName READ frameName) Q_PROPERTY(int framesCount READ framesCount) Q_PROPERTY(QStringfocusedFrameName 读取focusedFrameName) Q_PROPERTY(QObject* cookieJar READ cookieJar WRITE setCookieJarFromQObject) Q_PROPERTY(QStringList captureContent READ captureContent WRITE setCaptureContent) 民众: WebPage(QObject* parent, const QUrl& baseUrl = QUrl()); 虚拟〜网页(); QWebFrame* mainFrame(); QString 内容()常量; QString frameContent() 常量; 无效 setContent(const QString& 内容); 无效 setFrameContent(const QString& 内容); QString title() 常量; QString frameTitle() 常量; QString url() 常量; QString frameUrl() 常量; 布尔加载()常量; int loadingProgress() 常量; QString plainText() 常量; QString framePlainText() 常量; QString libraryPath() 常量; void setLibraryPath(const QString& dirPath); QString 离线存储路径()常量; int offlineStorageQuota() 常量; 无效 setViewportSize(const QVariantMap& 大小); QVariantMap viewportSize() const; void setClipRect(const QVariantMap& size); QVariantMap clipRect() const; void setScrollPosition(const QVariantMap& size); QVariantMap scrollPosition() const; void setPaperSize(const QVariantMap& size); QVariantMap paperSize() const; 无效 setNavigationLocked(布尔锁); 布尔导航锁定(); void setCustomHeaders(const QVariantMap& headers); QVariantMap customHeaders() const; }

webpage.cpp

# 包括“webpage.h” # 包括“networkaccessmanager.h” # 包括“utils.h” # 包括“config.h” # 包括“consts.h” # 包括“callback.h” # 包括“cookiejar.h” # 包括“system.h” # 包括“redispp.h” # ifdef Q_OS_WIN32 # 定义 STDOUT_FILENAME "/dev/stdout" # 定义 STDERR_FILENAME "/dev/stderr" /** * @class 自定义页面 */ 类 CustomPage:公共 QWebPage { Q_OBJECT 无效网页::connectRedis() { this->redis = redispp::Connection conn("127.0.0.1", "6379", "password", false); } void WebPage::redisSet(const QString& key,const QString& value) { this->redis.set(key, value); } int WebPage::offlineStorageQuota() 常量 { return m_customWebPage->settings()->offlineStorageDefaultQuota(); } void WebPage::showInspector(const int port) { m_customWebPage->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); m_inspector = 新的 QWebInspector; m_inspector->setPage(m_customWebPage); 如果(端口 == -1){ m_inspector->setVisible(true); } 别的 { m_customWebPage->setProperty("_q_webInspectorServerPort", 端口); } } 无效网页::applySettings(const QVariantMap& def) { QWebSettings* opt = m_customWebPage->settings(); opt->setAttribute(QWebSettings::AutoLoadImages, def[PAGE_SETTINGS_LOAD_IMAGES].toBool()); opt->setAttribute(QWebSettings::JavascriptEnabled, def[PAGE_SETTINGS_JS_ENABLED].toBool()); opt->setAttribute(QWebSettings::XSSAuditingEnabled, def[PAGE_SETTINGS_XSS_AUDITING].toBool()); opt->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, def[PAGE_SETTINGS_LOCAL_ACCESS_REMOTE].toBool()); opt->setAttribute(QWebSettings::WebSecurityEnabled, def[PAGE_SETTINGS_WEB_SECURITY_ENABLED].toBool()); opt->setAttribute(QWebSettings::JavascriptCanOpenWindows, def[PAGE_SETTINGS_JS_CAN_OPEN_WINDOWS].toBool()); opt->setAttribute(QWebSettings::JavascriptCanCloseWindows, def[PAGE_SETTINGS_JS_CAN_CLOSE_WINDOWS].toBool()); 如果(def.contains(PAGE_SETTINGS_USER_AGENT)){ m_customWebPage->m_userAgent = def[PAGE_SETTINGS_USER_AGENT].toString(); } if (def.contains(PAGE_SETTINGS_USERNAME)) { m_networkAccessManager->setUserName(def[PAGE_SETTINGS_USERNAME].toString()); } if (def.contains(PAGE_SETTINGS_PASSWORD)) { m_networkAccessManager->setPassword(def[PAGE_SETTINGS_PASSWORD].toString()); } if (def.contains(PAGE_SETTINGS_MAX_AUTH_ATTEMPTS)) { m_networkAccessManager->setMaxAuthAttempts(def[PAGE_SETTINGS_MAX_AUTH_ATTEMPTS].toInt()); } 如果(def.contains(PAGE_SETTINGS_RESOURCE_TIMEOUT)){ m_networkAccessManager->setResourceTimeout(def[PAGE_SETTINGS_RESOURCE_TIMEOUT].toInt()); } } QString WebPage::userAgent() 常量 { 返回 m_customWebPage->m_userAgent; } void WebPage::setNavigationLocked(bool lock) { m_navigationLocked = 锁; } 布尔网页::navigationLocked() { 返回 m_navigationLocked; } void WebPage::setViewportSize(const QVariantMap& 大小) { int w = size.value("宽度").toInt(); int h = size.value("height").toInt(); 如果 (w > 0 && h > 0) { m_customWebPage->setViewportSize(QSize(w, h)); } } QVariantMap WebPage::viewportSize() 常量 { QVariantMap 结果; QSize 大小 = m_customWebPage->viewportSize(); 结果[“宽度”] = size.width(); 结果[“高度”] = size.height(); 返回结果; } }

编译错误

网页.cpp:950:11:错误:“网页”中没有名为“redis”的成员 this->redis = redispp::Connection conn("127.0.0.1", "6379", "password", false); ~~~~ ^ 网页.cpp:950:39:错误:预期为“(”用于函数式强制转换或类型构造 this->redis = redispp::Connection conn("127.0.0.1", "6379", "password", false); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 网页.cpp:955:7:错误:“网页”中没有名为“redis”的成员 this->redis.set(key, value); ~~~~ ^

我使用的这个 c++ Redis 库是 https://github.com/brianwatling/redispp

注意** *我尝试在示例中使用 Redispp 命名空间,但连接类会与其他类发生冲突。 https://github.com/brianwatling/redispp/blob/master/test/multi.cpp *

整个 webpage.cpp 文件都在 pastebin 中。该文件超过了 StackOverflow 字符限制 http://pastebin.com/fUhRwy0R
任何帮助将不胜感激。

【问题讨论】:

  • 所有空的#include 语句是怎么回事?
  • Stackoverflow 无法正确呈现它,所以我删除了它们。包含的内容无关紧要。该脚本工作正常,我似乎无法全球化连接。

标签: c++ redis c++14


【解决方案1】:

您的课程名为CustomPage,但出于某种原因您正在WebPage 中实现功能。

把你的函数定义改成这样:

void connectRedis()

还有……

void redisSet(const QString & key, const QString & value)

此外,由于您可能来自 Java 或 C#,因此在 C++ 中执行操作的标准方法是将类定义与实现分开(到 .h/.hpp 和 .cpp 文件中),请参阅here了解更多信息。

【讨论】:

  • 我开始获取webpage.cpp:949:1: error: expected unqualified-id public: void CustomPage::connectRedis() ^ pages.cpp:954:1: error: expected unqualified-id public : void CustomPage::redisSet(const QString& key,const QString& value) ^
  • 所以customPage类调用WebPage中的函数是因为WebPage类中发生了一些额外的抽象逻辑。无论如何,我只是想创建一种方法来设置 redis 连接并以类似的方式进行插入。
  • WebPage 定义在哪里?
  • 我为webpage.h添加了定义。它是一个很长的文件,所以我省略了一些部分。如您所见,我在 pages.h 文件中所做的唯一相关的事情是包括 redispp.h。
  • 为什么要在CustomPage的类范围内定义函数?
猜你喜欢
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 2020-08-02
  • 2017-03-24
  • 2015-02-13
相关资源
最近更新 更多