gpt4 book ai didi

c++ - 为什么我们在这里需要一个 "friend"? (C++)

转载 作者:太空狗 更新时间:2023-10-29 23:52:57 26 4
gpt4 key购买 nike

qml 查看器(4.8 和 5.0)是这样实现的:

在 .h(eader) 中我们有:

class QtQuick2ApplicationViewer : public QQuickView
{
Q_OBJECT

...

private:
class QtQuick2ApplicationViewerPrivate *d;
};

然后在.CPP文件中:

class QtQuick2ApplicationViewerPrivate
{
QString mainQmlFile;
friend class QtQuick2ApplicationViewer;
static QString adjustPath(const QString &path);
};

QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
: QQuickView(parent)
, d(new QtQuick2ApplicationViewerPrivate())
{
connect(engine(), SIGNAL(quit()), SLOT(close()));
setResizeMode(QQuickView::SizeRootObjectToView);

#ifdef Q_OS_ANDROID
engine()->setBaseUrl(QUrl::fromLocalFile("/"));
#endif
}

为什么这里需要使用friend?我看不出任何人为什么会使用 friend 类。 friend classes 有什么真正的用处吗(除了任何人都可以没有的异国情调)?

.h #包括

class QtQuick2ApplicationViewer : public QQuickView
{
Q_OBJECT

public:
explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
virtual ~QtQuick2ApplicationViewer();

void setMainQmlFile(const QString &file);
void addImportPath(const QString &path);

void showExpanded();

private:
class QtQuick2ApplicationViewerPrivate *d;
};

.cpp

#include "qtquick2applicationviewer.h"

#include <QtCore/QCoreApplication>
#include <QtCore/QDir>
#include <QtQml/QQmlEngine>

class QtQuick2ApplicationViewerPrivate
{
QString mainQmlFile;
friend class QtQuick2ApplicationViewer;
static QString adjustPath(const QString &path);
};

QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
{
#ifdef Q_OS_UNIX
#ifdef Q_OS_MAC
if (!QDir::isAbsolutePath(path))
return QString::fromLatin1("%1/../Resources/%2")
.arg(QCoreApplication::applicationDirPath(), path);
#elif !defined(Q_OS_ANDROID)
const QString pathInInstallDir =
QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
if (QFileInfo(pathInInstallDir).exists())
return pathInInstallDir;
#endif
#endif
return path;
}

QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
: QQuickView(parent)
, d(new QtQuick2ApplicationViewerPrivate())
{
connect(engine(), SIGNAL(quit()), SLOT(close()));
setResizeMode(QQuickView::SizeRootObjectToView);

#ifdef Q_OS_ANDROID
engine()->setBaseUrl(QUrl::fromLocalFile("/"));
#endif
}

QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
{
delete d;
}

void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
{
d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
setSource(QUrl::fromLocalFile(d->mainQmlFile));
}

void QtQuick2ApplicationViewer::addImportPath(const QString &path)
{
engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
}

void QtQuick2ApplicationViewer::showExpanded()
{
#if defined(Q_WS_SIMULATOR)
showFullScreen();
#else
show();
#endif
}

最佳答案

friend 检查 friend 的隐私。您当然可以完全不受访问限制,但一旦您使用它,在亲密的情况下保持友好会有所帮助。

关于c++ - 为什么我们在这里需要一个 "friend"? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com