在C++中,我有一个A类,它是B类的朋友.
我看起来像继承的B类不是A类的朋友.
我这是C++的限制还是我的错误?
这是一个例子.编译时,我收到一行"返回新纪念品"的错误:
纪念品::纪念品:无法访问纪念品中宣布的私人会员.
class Originator;
class Memento
{
friend class Originator;
Memento() {};
int m_Data;
public:
~Memento() {};
};
class Originator
{
public:
virtual Memento* createMemento() = 0;
};
class FooOriginator : public Originator
{
public:
Memento* createMemento()
{
return new Memento; // Impossible to access private member of Memento
}
};
void main()
{
FooOriginator MyOriginator;
MyOriginator.createMemento();
}
Run Code Online (Sandbox Code Playgroud)
我当然可以添加FooOriginator作为Memento的朋友,但是,这意味着我必须添加所有Originator继承的类作为Memento的朋友,这是我想要避免的.
任何的想法 ?
我正在尝试为小型Qt应用程序找到跨平台安装程序.
看起来最受欢迎(功能强大?)是BitRock Install Builder,但由于安装程序将在学校使用(我是老师),我正在寻找免费/开源解决方案.
我想在Windows,Mac和Linux OS上为一个简单的应用程序生成一个安装程序.
我在Windows 8.1中使用Qt 5.2.1.
我QTimer在Windows 8.1上面临着关于准确性的奇怪行为.
我正在启动一个计时器,它应该每20毫秒超时一次.为了检查这一点,我还使用QTime对象来测量两个滴答之间的经过时间.
如果我以20ms的间隔启动计时器,我测量的有效间隔为30ms.如果我以19ms的间隔启动定时器,我测量的有效间隔为19ms!
这是一个产生问题的小项目:
main.cpp:
#include "mainfrm.h"
#include <QApplication>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainFrm w(20);
w.setMinimumSize(400,50);
w.show();
MainFrm w2(19);
w2.setMinimumSize(400,50);
w2.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
为MainFrm.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QLabel>
#include <QTime>
#include <QTimer>
class MainFrm : public QLabel {
Q_OBJECT
public:
explicit MainFrm(int TimerInterval = 20, QWidget *parent = 0);
private:
QTime m_LastUpdateTime;
QTimer m_TickTimer;
unsigned int m_ElapsedSum;
unsigned int m_TickCount;
private slots:
void onTick();
};
#endif …Run Code Online (Sandbox Code Playgroud) 使用PowerShell V4,我可以Format-Table使用通配符显示多个属性,例如:
PS C:\powershell> gci | Format-Table -Property PS*
PSPath PSParentPath PSChildName PSDrive PSProvider PSIsContainer
------ ------------ ----------- ------- ---------- -------------
Microsoft.PowerShell... Microsoft.PowerShel... test1.txt C Microsoft.PowerShel... False
Microsoft.PowerShell... Microsoft.PowerShel... test2.txt C Microsoft.PowerShel... False
Microsoft.PowerShell... Microsoft.PowerShel... test3.txt C Microsoft.PowerShel... False
Run Code Online (Sandbox Code Playgroud)
现在,使用PowerShell V5,我无法使用相同的命令得到相同的结果:
PS C:\powershell> gci | Format-Table -Property PS*
PSPath PSParentPath
------ ------------
Microsoft.PowerShell.Core\FileSystem::C:\powershell\test1.txt Microsoft.PowerShell.Co...
Microsoft.PowerShell.Core\FileSystem::C:\powershell\test2.txt Microsoft.PowerShell.Co...
Microsoft.PowerShell.Core\FileSystem::C:\powershell\test3.txt Microsoft.PowerShell.Co...
Run Code Online (Sandbox Code Playgroud)
仅显示两个属性。
为什么是新行为?有没有办法将其更改为 V4 的行为?
使用C++(和Qt),我需要处理大量的3D坐标.
具体来说,当我收到一个3D坐标(由3个双打组成)时,我需要检查列表是否已经处理了这个坐标.如果没有,那么我处理它并将其添加到列表(或容器).
坐标量可能变得非常大,因此我需要将处理过的坐标存储在容器中,以确保检查容器中是否已经包含3D坐标的速度很快.
我正在考虑使用地图地图的地图,存储x坐标,然后是y坐标,然后存储z坐标,但是这使得使用起来非常繁琐,所以我实际上希望有更好的方法来这是我无法想到的.
我正试图找到一种方法来改变使用Qt Creator(1.3.0)和MinGW开发的项目的警告级别(我相信默认值为3,我想将其更改为4).
可能吗 ?
我正在尝试以正确的(或至少是最好的)方式开始使用命名空间.
我试图做的第一件事是避免放在using namespace xxx;我的文件的开头.相反,我希望using xxx::yyy尽可能在本地.
这是一个小程序,说明了这一点:
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
using std::cout;
using std::endl;
srand(time(0));
for(int i=0; i<10;++i)
cout << rand() % 100 << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我省略了行,using std::cout;或者using std::endl编译器会在我尝试使用cout或时抱怨endl.
但为什么不需要这个srand,rand而且time?我很确定他们在std,因为如果我试着专门倒std::在他们面前,我的代码工作正常.
我刚刚开始使用Qt Creator,我想编写UI.
我的问题是:写它的最佳方式是什么?通过从小部件框拖放或编写代码?
我已经拖了一些小部件,我看到了,并不是所有的建设QWidget一样QIcon,并QMultiLineEdit在小部件盒.如何添加它们?
谢谢!
在VBA中是否有一种方法可以以编程方式获取数值类型的限制(最小值,最大值)(Long例如)?
像numeric_limits<long>::min()C++中的东西.
我的问题很简单.
如何添加Windows资源管理器中显示的图标?
不是特定的窗口我希望整个应用程序如命令提示符在图标上有C:\.
有没有办法在不创建文件并将其链接到.pro文件的情况下做到这一点?
我可以在Qt Creator中更改基本图标吗?
如果是这样,怎么样?如果不是我怎么办呢?
谢谢
PS我已经尝试了其他问题,但根本没有问题
c++ ×4
qt ×4
qt-creator ×2
class ×1
formatting ×1
friend ×1
icons ×1
installer ×1
mingw ×1
namespaces ×1
open-source ×1
performance ×1
powershell ×1
std ×1
timer ×1
vba ×1