草庐IT

c++ - QT/C++ - 从不同的类访问 MainWindow UI

我是C++和Qt的初学者,所以这可能是微不足道的。确实感觉应该很简单,但是我已经寻找了几个小时的答案,但找不到解决方案。我正在制作一个简单的棋盘游戏,其中MainWindow的ui(用QtDesigner制作)包含游戏板的Canvas(QGraphicsView)。现在,main.cpp非常简单:MainWindowGame;intmain(intargc,char*argv[]){QApplicationa(argc,argv);Game.show();returna.exec();}由于我需要从另一个完全不相关的类访问和编辑MainWindow小部件,我认为最简单的方法是将Main

C++ 多个具有相同名称的类

假设我有两个不同的cpp文件。两者都声明了具有相同名称的类,但可能是完全不同的结构(或者可能是相同的结构,不同的实现)。这些类不会出现在头文件中。(例如,假设它们是不同列表类的Node类。)我已经看到这些类发生冲突。这是标准所期望的吗?这个问题有什么解决办法?更新:正如答案/评论所建议的那样,匿名命名空间正是我所寻找的。 最佳答案 解决此问题的标准方法是将类包装在不同的namespaces中。. 关于C++多个具有相同名称的类,我们在StackOverflow上找到一个类似的问题:

c++ - 在从 std::variant 继承的类上使用 std::visit - libstdc++ vs libc++

考虑以下代码片段:structv:std::variant>{};intmain(){std::visit([](auto){},v{0});}clang++7with-stdlib=libc++-std=c++2a编译代码;g++9with-std=c++2a无法编译代码,出现以下错误:/opt/compiler-explorer/gcc-trunk-20180711/include/c++/9.0.0/variant:94:29:error:incompletetype'std::variant_size'usedinnestednamespecifierinlineconstex

c++ - 对 C++ 的哪些更改使复制初始化适用于具有显式构造函数的类?

考虑这段代码:structX{explicitX(){}explicitX(constX&){}};voidfoo(Xa=X()){}intmain(){}使用C++14标准,GCC7.1和clang4.0rejects代码,这是我所期望的。但是,使用C++17(-std=c++1z),theybothaccept编码。改变了什么规则?对于两个编译器都表现出相同的行为,我怀疑这是一个错误。但据我所知,最新的草案仍然说,默认参数使用copy-initialization1的语义。同样,我们知道explicit构造函数将只允许直接初始化2。1:dcl.fct.default/5;2:cla

c++ - 如何编写具有高重载优先级的类标准函数

在一个通用函数中,我使用以下成语,templatevoiddo_something(It1first,It1second,It2d_first){...otherstuffhere...usingstd::copy;copy(first,second,d_first);}do_something是一个通用函数,它不应该知道任何其他库的任何具体信息(可能除了std::)。p>现在假设我的命名空间N中有几个迭代器。namespaceN{structitA{usingtrait=void;};structitB{usingtrait=void;};structitC{usingtrait=v

c++ - 从标记为 final 的类的构造函数中调用虚函数是不好的做法吗

通常从构造函数调用虚函数被认为是不好的做法,因为子对象中的覆盖函数不会被调用,因为对象尚未构造。但是,请考虑以下类:classbase{public:base(){}~base(){}private:virtualvoidstartFSM()=0;};classderivedfinal:publicbase,publicfsm_action_interface{public:derived():base{},theFSM_{}{startFSM();}///FSMinterfaceactionsprivate:virtualvoidstartFSM(){theFSM_.start();

c++ - 我必须初始化简单的类成员变量吗?

这个问题在这里已经有了答案:WhatisthedefaultvalueforC++classmembers(2个回答)关闭6年前。快速初学者的问题:我是否必须初始化简单的类成员变量,或者在任何情况下都保证为它们分配默认值?例子:classFoo{inti;//isi==0ordoIneedthefollowinglineforthat?Foo():i(0){}};谢谢! 最佳答案 DoIhavetoinitializesimpleclassmembervariables,不,您没有有来初始化成员变量。如果你不初始化它们,不要假设它们

c++ - 为什么我不能在 friend 类中实例化一个构造函数是私有(private)的类?

我有两个类;Salary用于保存有关员工薪水的信息和计算,Employee具有classSalary类型的对象和一些成员,例如员工的姓名和地址...我想要做的是防止classSalary被实例化,除了classEmployee。所以我将Salary的构造函数声明为私有(private),并使Employee成为Salary的friend。但我得到错误:classEmployee;classSalary{public:private:Salary():revenue_{},cost_{}{}Salary(intx,inty):revenue_{x},cost_{y}{}intrevenu

c++ - 生成导出包含 ATL::CString 成员的类的 DLL 时出现警告 C4251

我正在将基于ATL的静态库转换为DLL,并且在任何使用ATLCString类(在atlstr.h中找到)的导出类上都收到以下警告:warningC4251:'Foo::str_':class'ATL::CStringT'needstohavedll-interfacetobeusedbyclientsofclass'Foo'我正确地将Foo类声明为通过__declspec(dllexport)导出。这是我可以安全忽略的警告还是我做错了什么?DLL项目设置设置为与ATL动态链接,但这似乎没有任何区别。例如:#ifdefDLLTEST_EXPORTS#defineDLLTEST_API__

c++ - 删除了所有自动生成的构造函数/运算符的类仍然可以从函数返回吗?

最近,我遇到了这个answer它描述了如何初始化非默认可构造元素的std::array。我并不感到惊讶,因为这个答案显然没有做任何默认构造。相反,它使用聚合初始化构造一个临时std::array,然后在函数返回时移动(如果移动构造函数可用)或复制到命名变量中。所以我们只需要移动构造函数或复制构造函数可用。我是这么想的……然后是这段让我困惑的代码:structfoo{intx;foo(intx):x(x){}foo()=delete;foo(constfoo&)=delete;foo&operator=(constfoo&)=delete;foo(foo&&)=delete;foo&op