我总是试图在头文件之外保持实现,所以对于模板和内联函数,我通常会这样做
// File.h
inline bool foo()
#include "File.hpp"
Run Code Online (Sandbox Code Playgroud)
// File.hpp
inline bool foo()
{
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,C++规范对于为函数的实际实现重复内联关键字有什么作用?(如本例所示)
我真的不想这样做,因为它弄乱了很多很多函数,虽然我的编译器没有抱怨,但我想知道编译器是否仍然接受内联提示.
谁知道?
我想知道是否有任何类型的便携式(Mac和Windows)读取和写入硬盘驱动器的方法超出了iostream.h,特别是获取文件夹中所有文件的列表,移动文件等等功能.
我希望周围会有类似SDL的东西,但到目前为止我还没有找到太多东西.
有任何想法吗??
我在想,为什么不能有一个不是指针的void数据类型?
当然,你可以通过拥有可以超越整个确定尺寸的东西
void4
void8
void32
Run Code Online (Sandbox Code Playgroud)
然后只允许将一个void数据类型"强制转换"为另一个类,如果它的大小等于或小于类的大小.
有什么东西我不知道,或者C++委员会只是认为它是不好的做法?
编辑:
我没有很好地解释自己,所以我将举例说明它的用法:
main()
{
/*
Lets make a list of unknown elements
std::string is 8 bytes, and float is 4
bytes, so we'll reserve 8 byte sequences
*/
vector<void8> elements;
elements.push_back((void8) string("First string element"));
elements.push_back((void8) float(5.76) );
elements.push_back((void8) string("Third string element"));
// Ect.
cout << (string) elements[0];
cout << (float) elements[1];
cout << (string) elements[2];
cout << (float) elements[2]; // Garbage
void1 data;
data = (void1) bool(1);
data = (void1) unsigned int(80094); // …
Run Code Online (Sandbox Code Playgroud) 我对C++和虚拟继承感到好奇 - 特别是在低音和子类之间解决vtable冲突的方式.我不会假装了解它们如何工作的具体细节,但到目前为止我发现的是由于该分辨率使用虚拟函数导致的延迟很小.我的问题是基类是否为空 - 即,其虚函数定义为:
virtual void doStuff() = 0;
Run Code Online (Sandbox Code Playgroud)
这是否意味着分辨率不是必需的,因为只有一组函数可供选择?
如果这是一个愚蠢的问题,请原谅我 - 正如我所说的,我不明白vtable是如何运作的,所以我真的不知道更好.
编辑
所以,如果我有一个带有两个单独子类的抽象类:
A
/ \
/ \
B C
Run Code Online (Sandbox Code Playgroud)
从子类调用函数时,没有性能损失,比如说,只有一个继承自由类?
我想知道,我通常使用std :: string作为我的代码,但是当你在一个参数中传递一个字符串进行简单的比较时,最好只使用一个文字吗?
考虑这个功能:
bool Message::hasTag(string tag)
{
for(Uint tagIndex = 0; tagIndex < m_tags.size();tagIndex++)
{
if(m_tags[tagIndex] == tag)
return 0;
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
尽管它正在进行比较的属性是一个向量,并且无论使用这个函数可能会将字符串传递给它,使用const char*来避免创建一个新的字符串仍然会更好一个字符串文字呢?
考虑一下这段代码:
Uint counter = 0;
int* p1;
int* p2;
deque<int> dequeInstance;
vector<int> vectorInstance;
dequeInstance.push_back(3);
dequeInstance.push_back(7);
p1 = &dequeInstance.back();
dequeInstance.push_back(17);
p2 = &dequeInstance.back();
if(*p1 == !7)
++counter;
if(*p2 == !17)
++counter;
vectorInstance.push_back(3);
vectorInstance.push_back(7);
p1 = &vectorInstance.back();
vectorInstance.push_back(17);
p2 = &vectorInstance.back();
if(*p1 == !7)
++counter;
if(*p2 == !17)
++counter;
return counter;
Run Code Online (Sandbox Code Playgroud)
我本来期望当我将第三个元素推到向量的后面时,指向第二个元素的指针将被无效,因为我对std :: vector的理解是它是一个直的数组,每次擦除并重新创建它的修改.到这段代码结束时,'counter'等于零.
我在这里错过了什么?
我对这段代码有点问题:
string StringServices::ToStringf(float value)
{
char buffer[10];
sprintf (buffer, "%f", value);
return (string) buffer; // signal SIGABRT
}
Run Code Online (Sandbox Code Playgroud)
它以前一直在工作,并继续为其他调用工作,但我现在得到一个SIGABRT返回,当函数通过-211.0
缓冲区加载很好,我真的不确定为什么这不起作用.能理解std :: string和c字符串的人能帮到我吗?
我对 OpenGL 渲染的理解是,如果没有深度测试,对象将按顺序绘制,因此您调用的最后一个渲染函数将在已绘制的任何内容之上绘制其形状。我发现情况似乎并非如此:
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_QUADS);
{
glVertex2f(50, 50);
glVertex2f(100, 50);
glVertex2f(100, 100);
glVertex2f(50, 100);
}
glEnd();
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_QUADS);
{
glVertex2f(30, 60);
glVertex2f(110, 60);
glVertex2f(110, 90);
glVertex2f(30, 90);
}
glEnd();
Run Code Online (Sandbox Code Playgroud)
而不是我所期望的蓝色方块下方的红色方块,这些调用会给我一个蓝色方块上的红色方块!
我不明白 OpenGL 渲染是如何工作的吗?或者我只是缺少某种不会让蓝色方块渲染的选项或配置?我正在使用自定义(但非常简单)着色器,这会改变什么吗?
这个问题的未被接受的答案似乎暗示顺序渲染实际上并没有发生并且是特定于实现的,但其接受的答案暗示事实确实如此。
在顶部进行第二次调用的最佳方法是什么?我真的不想拥有某种在整个程序中不断增加的全局 z 值。