我已经创建了一个列表类作为替换我的程序中的可变参数函数的方法,该程序用于初始化需要包含更改的元素列表的对象.list类有一个我非常喜欢的用法语法.但是我之前没有看过它,所以我想知道我是不是因为这个事实而不应该使用它?列表类的基本实现看起来像这样......
#include <list>
#include <iostream>
template<typename T>
struct list
{
std::list<T> items;
list(const list&ref):items(ref.items){}
list(){}
list(T var){items.push_back(var);}
list& operator,(list add_){
items.insert(items.end(),add_.items.begin(), add_.items.end());
return *this;
}
list& operator=(list add_){
items.clear();
items.insert(items.end(),add_.items.begin(), add_.items.end());
return *this;
}
list& operator+=(list add_){
items.insert(items.end(),add_.items.begin(), add_.items.end());
return *this;
}
};
Run Code Online (Sandbox Code Playgroud)
这允许我在代码中使用它,如此...
struct music{
//...
};
struct music_playlist{
list<music> queue;
//...
};
int main (int argc, const char * argv[])
{
music_playlist playlist;
music song1;
music song2;
music song3;
music song4;
playlist.queue = song1,song2; // The queue now …
Run Code Online (Sandbox Code Playgroud) 在各种代码中,我已经看到调试版本中的内存分配NULL
...
memset(ptr,NULL,size);
Run Code Online (Sandbox Code Playgroud)
或者0xDEADBEEF
......
memset(ptr,0xDEADBEEF,size);
Run Code Online (Sandbox Code Playgroud)
0xDEADBEEF
,是否仍然不符合有效数据?在什么情况下我想在OpenGL FBO中使用renderbuffer附件,而不是纹理附件,除了默认的帧缓冲区?因为,纹理附件看起来更加通用.
如果我使用iPhoneOS中包含的音频解码库(例如AVAudioPlayer).我还需要支付Thomson或VIA Licensing的许可证才能合法解码我的应用程序中的AAC或MP3文件吗?
编辑:
我无法找到ADC的确切答案(他们不知道),我也对其他平台上的音频库感到好奇(Windows,Mac,Android ......)所以我在这个问题上添加了一笔赏金.
现在我正在开发一款针对iOS的Black Jack游戏,并希望有一个排行榜,显示哪些玩家目前拥有最多的"钱".因此,如果他们获得高分然后失去"钱",它将更新他们的高分以匹配用户当前的金额,这将比以前少.有什么方法可以用Game Center做到这一点吗?
与这个问题联合起来.我无法为以下看似基本的问题提出一个良好的类型安全解决方案.我有一个类music_playlist,它有一个应该播放的歌曲列表.看起来非常简单,只需创建队列中所有歌曲的std :: list,并将其提供给用户.然而,出于必要,音频解码和音频呈现发生在不同的线程上.因此列表需要受互斥保护.很多时候,使用我的库的其他程序员忘记了互斥锁.这显然导致了"奇怪"的问题.
所以起初我只是为班级编写了setter.
struct music{};
class music_playlist{
private:
std::list<music> playlist;
public:
void add_song(music &song){playlist.push_back(song);}
void clear(){playlist.clear();}
void set_list(std::list<music> &songs){playlist.assign(songs.begin(),songs.end());}
//etc
};
Run Code Online (Sandbox Code Playgroud)
这导致用户代码如下...
music song1;
music song2;
music song3;
music song4;
music song5;
music song6;
music_playlist playlist1;
playlist1.add_song(song1);
playlist1.add_song(song2);
playlist1.add_song(song3);
playlist1.add_song(song4);
playlist1.add_song(song5);
playlist1.add_song(song6);
//or
music_playlist playlist2;
std::list<music> songs;
songs.push_back(song1);
songs.push_back(song2);
songs.push_back(song3);
songs.push_back(song3);
songs.push_back(song5);
songs.push_back(song6);
playlist2.set_list(songs);
Run Code Online (Sandbox Code Playgroud)
虽然这是有效的,但非常明确.输入是非常繁琐的,并且由于实际工作周围的所有残余而容易出错.为了证明这一点,我实际上故意在上面的代码中添加了一个错误,这样的东西很容易制作,并且可能不会触及代码评论,而song4永远不会在播放列表2中播放.
从那里我开始研究可变函数.
struct music{};
class music_playlist{
private:
std::list<music> playlist;
public:
void set_listA(music *first,...){
//Not guaranteed to work, but usually does... bleh
va_list Arguments; …
Run Code Online (Sandbox Code Playgroud) 现在,我正在为我正在开发的游戏编写物理引擎.通常,当您将物理引擎与游戏引擎结合使用时,会有许多重复值.例如表示对象的位置和旋转的变量.对于大多数物理引擎,您必须遍历所有对象并根据物理引擎的对象位置更新其位置.所以我认为最好让物理引擎对象中的位置和旋转值引用游戏引擎对象处理旋转和位置的变量.但是,有时您希望物理引擎中的对象不直接与游戏引擎中的对象相关联.(隐形墙,关节).因此,您需要将对象视为常规成员变量......所以这就是我所拥有的.
struct object{
float & xPosition;
float & yPosition;
float & zPosition;
...
object(float & xPos, float& yPos, float& zPos):xPosition(xPos), yPosition(yPos), zPosition(zPos){}
object():xPosition(*new float(0.0f)), yPosition(*new float(0.0f)), zPosition(*new float(0.0f)){}
};
Run Code Online (Sandbox Code Playgroud)
但是,这将导致内存泄漏,因为这些浮动没有被删除.对于如何在没有内存泄漏的情况下实现所需行为,您有什么建议吗?
编辑
我宁愿不使用boost.但是,我并不反对需要模板的解决方案.此外,这部分是性能优化,boost :: shared_ptr,似乎不是正确的解决方案.
如果我有代码:
uint64_t a = 0x1111222233334444;
uint32_t b = 0;
b = a;
printf("a is %llx ",a);
printf("b is %x ",b);
Run Code Online (Sandbox Code Playgroud)
输出是:
a is 1111222233334444 b is 33334444
Run Code Online (Sandbox Code Playgroud)
问题:
大端机器上的行为是否相同?
如果我在b中指定一个值或者进行类型转换,那么大端的结果是否相同?