编写库时,最重要的规则和最佳实践之一是将库的所有符号放入特定于库的命名空间.由于namespace关键字,C++使这很容易.在C中,通常的方法是在标识符前面加上一些特定于库的前缀.
C标准的规则放在那些一些限制(安全编译):AC编译器可以看只是一个标识符的前8个字符,所以foobar2k_eggs并foobar2k_spam可能被解释为有效相同标识符-但是每一个现代的编译器允许任意长标识符所以在我们这个时代(21世纪),我们不应该为此烦恼.
但是如果你面对一些你无法改变符号名称/标识符的库呢?也许你只有一个静态二进制文件和标题或者不想要,或者不允许自己调整和重新编译.
我有一个GLSurfaceView设置和渲染预期使用a GLSurfaceView.Renderer.我的应用程序使用Android支持包中的片段.当我导航到一个新的片段surfaceDestroyed被调用但是当我通过backstack回到片段时GLSurfaceView将不会呈现,调用requestRender不会导致onDraw调用.
我知道我需要调用onResume和onPause表面视图,我从托管片段做这个,但它似乎没有解决问题.关于htis方法的所有例子都参考了活动,这可能是问题吗?如果是这样,你如何使用GLSurfaceView片段内部.
非常感谢任何见解,我很高兴发布代码,但它似乎更像是一个普遍的问题,
谢谢
因此,使用constexpr,MSVC(Visual Studio 2012)在尝试constexpr使用此简单程序(包括省略)使用关键字限定我的函数时给了我一个错误:
constexpr int factorial(int n)
{
return n <= 1 ? 1 : (n * factorial(n-1));
}
int main(void)
{
const int fact_three = factorial(3);
std::cout << fact_three << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
constexpr 带有以下消息的红色下划线:
错误:此声明没有存储类或类型说明符
并尝试编译该程序给出了以下输出:
1> main.cpp(5):错误C2144:语法错误:'int'前面应加';'
1> main.cpp(5):错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int
它真的让我感到困惑,因为它是Cppreference 用来说明其使用constexpr的一个例子.起初我使用了一个返回文字的简单函数,即constexpr int func(){return 5;}但产生了同样的错误.我将第一条消息解释为"它应该是结构或类的成员函数",但Cppreference的示例显示它显然不是必需的.
那么,我在这里明显缺少什么?
我有一个C++学校的项目,我被困在一个部分:我必须重载运算符+和*来处理几何图形.这没有问题,但在这里它不起作用:我必须将操作符声明为纯虚方法,在所有其他类派生自的抽象类中.
#include<iostream>
using namespace std;
class Figabs {
protected:
int fel;
public:
int getFEL() { return fel; }
virtual Figabs operator +()=0; /*this is where I get an error: function returning abstract class “Figabs” is not allowed : function Figabs::operator+ is a pure virtual function */
};
class Coord {
public:
int cx, cy;
public:
Coord (){
cx = cy = 0;
}
Coord (const int x, const int y) {
cx = x;
cy = y;
}
Coord (const …Run Code Online (Sandbox Code Playgroud) 所以我搜索了这个主题,发现没有什么真正相关的.
我试着看看这个简单代码背后的程序集:
int main(int argc, char *argv[])
{
double d = 1.0;
float f = static_cast<float>(d);
system("PAUSE");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是(使用Visual Studio 2012):
15: double d = 1.0;
000000013FD7C16D movsd xmm0,mmword ptr [__real@3ff0000000000000 (013FD91AB0h)]
000000013FD7C175 movsd mmword ptr [d],xmm0
16: float f = static_cast<float>(d);
000000013FD7C17B cvtsd2ss xmm0,mmword ptr [d]
000000013FD7C181 movss dword ptr [f],xmm0
Run Code Online (Sandbox Code Playgroud)
我对组装不太满意,但无论如何都试图分析它.所以前两行似乎将双精度值移动3ff0000000000000到寄存器中,然后将寄存器的内容移动到d的内存地址.
然后,我只是不确切知道下一行是什么.该cvtsd2ss操作显然是一个将双精度浮点值转换为单精度浮点值的指令,但我无法找到该指令实际执行的操作.(然后将转换后的值移动到f)的存储空间.
所以我的问题是,这个转换实际上是如何完成的?我知道C++演员会在另一种类型中产生最接近的值,但除此之外,我不知道所执行的实际操作......
在C++中,匿名命名空间等同于:
namespace $$$$ {
//something
}
using namespace $$$$;
Run Code Online (Sandbox Code Playgroud)
其中$$$$是某种唯一标识符.然后,匿名命名空间对于不应在编译单元外看到的代码很有用.
到目前为止一直很好,但是最近我开始用模板编写一些代码,这样的代码必须在头文件中,因此使用匿名命名空间没有多大意义,因为仅仅包含头将使隔离效果无效.
那么问题是,在这种情况下建议的方式是什么?我开始使用名为Private的命名空间.它并没有真正阻止任何想要在里面使用标识符的人,但至少它将名称冲突减少为id"Private".
还有更好的方法吗?建议?
我正在尝试重构我的代码,以便我使用前向声明而不是包含大量的标头.我是新手,对boost :: shared_ptr有疑问.
说我有以下界面:
#ifndef I_STARTER_H_
#define I_STARTER_H_
#include <boost/shared_ptr.hpp>
class IStarter
{
public:
virtual ~IStarter() {};
virtual operator()() = 0;
};
typedef boost::shared_ptr<IStarter> IStarterPtr;
#endif
Run Code Online (Sandbox Code Playgroud)
然后我在另一个类中有一个函数,它将一个IStarterPtr对象作为参数,比如说:
virtual void addStarter(IStarterPtr starter)
{
_starter = starter;
}
...
IStarterPtr _starter;
Run Code Online (Sandbox Code Playgroud)
如何在不包含IStarter.h的情况下转发声明IStarterPtr?
我正在使用C++ 98,如果这是相关的.
在解释我想要标记的问题之前,我知道给出的例子是错误的代码.我已经在std::shared_ptr考虑以更合理的方式实现我的目标.这篇文章的原因只是我的好奇心和学习新东西的愿望.提前感谢您的帮助!
我今天有点搞乱我的解析器代码.优化化的东西等我专注于几个对象的实例,这些实例在解析过程中一直克隆得不必要.我没有那么慎重的想法来创建几个全局实例并通过静态方法访问它们.无论如何(强烈简化)我结束了这个有点有趣的案例:
class class_a
{
class_a();
class_a& referenceToObject;
};
class_a& getGlobalObject();
class_a::class_a()
:referenceToObject(getGlobalObject())
{}
class_a object;
class_a object2;
class_a& getGlobalObject()
{
return object2;
}
Run Code Online (Sandbox Code Playgroud)
这显然意味着我做了很多非常错误的事情,但在这个分支中,优化是最重要的事情.
我感兴趣的是在更广泛的编译器集合中会出现这样的代码.GetGlobalObject()正在返回对没有调用构造函数的对象的引用.它仍然只返回引用 - 这是指向编译时已知的内存空间(数据段或堆上某处,dunno)的指针.
假设没有任何方法可以调用任何方法或任何object2引用成员,这个示例是未定义的行为吗?
当我尝试关闭我的Qt程序时,它只是在后台运行,虽然没有窗口了.
基本上,我想知道我应该做什么,所以当我点击主窗口(没有父窗口)上的红叉时它会正常关闭.
通过这个链接,我尝试了一些事情,如:
QApplication app(argc, argv);
//...
app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
return app.exec();
Run Code Online (Sandbox Code Playgroud)
要么
QApplication app(argc, argv);
//...
app.setQuitOnLastWindowClosed(true);
return app.exec();
Run Code Online (Sandbox Code Playgroud)
但是没有工作,在点击十字架后,该过程仍然留在内存中.
然后,我怎样才能正确关闭我的程序?
我正在尝试使用Open Sans系列中的字体.我将字体添加到我的Xcode项目中,我检查它们是否已添加到我的应用程序资源包中,并将字体添加到我的Info.plist文件中.
当我在Interface Builder中编辑XIB时,我可以UILabel在字体下拉菜单中选择自定义时在s 上使用Open Sans字体.字体在Interface Builder中的预览中正确呈现,但是当我在设备上启动应用程序时,字体不会应用于标签.
我尝试以编程方式设置字体,但这也不起作用.而且我没有收到任何警告或错误.
我忘记了什么能够使用自定义字体?
运行iOS7的iPad Air和运行iOS8的iPhone 6上的行为相同.
c++ ×7
android ×1
anonymous ×1
assembly ×1
c ×1
c++11 ×1
c++98 ×1
collision ×1
constexpr ×1
fonts ×1
header-files ×1
ios ×1
libraries ×1
namespaces ×1
objective-c ×1
opengl-es ×1
pure-virtual ×1
qt ×1
reference ×1
shared-ptr ×1
static ×1
symbols ×1