我有一个IInventory*的向量,我正在使用C++ 11范围循环遍历列表,以便对每个进行处理.
在做了一些东西之后,我可能想要从列表中删除它并删除对象.我知道我可以随时调用delete指针来清理它,但是在范围for循环中,从矢量中删除它的正确方法是什么?如果我从列表中删除它将使我的循环失效?
std::vector<IInventory*> inv;
inv.push_back(new Foo());
inv.push_back(new Bar());
for (IInventory* index : inv)
{
// Do some stuff
// OK, I decided I need to remove this object from 'inv'...
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用计时库来定时器和持续时间.
我希望能够Duration frameStart;(从app开始)和a Duration frameDelta;(帧之间的时间)
我需要能够以frameDelta毫秒和浮点秒的形式获得持续时间.
你如何使用新的c ++ 11 <chrono>库做到这一点?我一直在努力和谷歌搜索(信息稀疏).代码是模板化的,需要特殊的演员和东西,我无法弄清楚如何正确使用这个库.
我想做的事情如下:
#ifdef GCC
#define GetFunctionName() string("My function name is ") + __PRETTY_FUNCTION__;
#endif
Run Code Online (Sandbox Code Playgroud)
由于我想使用漂亮的PRETTY_FUNCTION,据我所知只有gnu支持所以我需要检测我是否正在编译g ++和MinGW,我该怎么做?我猜我需要知道的是编译器的预处理器定义,就像我在下面为Microsoft做的那样.
#ifdef WIN32
#define LogFuncBegin() gLogger.FuncBegin( __FUNCTION__ );
#define LogFuncEndSuccess() gLogger.FuncEndSuccess( __FUNCTION__ );
#endif
Run Code Online (Sandbox Code Playgroud)
如何在C++预处理器中检测g ++和MinGW?
可能重复:
C++ 11 rvalues并且移动语义混乱
我认为是正确的
std::string GetLine()
{
std::string str;
std::getline(std::cin, str);
return std::move(str);
}
Run Code Online (Sandbox Code Playgroud)
但是在这个链接http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html (检查标题部分返回一个明确的右值引用功能)
这是#1谷歌搜索命中移动语义显示类似的功能签名
int&& GetInt()
{
int x = 0;
// code here
return std::move(x);
}
Run Code Online (Sandbox Code Playgroud)
从我在其他地方读到的&&表示右值引用,所以在这种情况下它返回对不存在的对象的引用.
那是哪个呢?
(是的,我知道移动一个int没有真正的好处,但问题是在第一个函数中是否使用std :: string或std :: string &&的返回类型.如果这是应该对所有类型执行的方式.)
我正在写一些简单的win32内容,我正在使用以下wWinMain
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
Run Code Online (Sandbox Code Playgroud)
VS2012快递代码分析说
C28251函数的注释不一致:此实例有一个错误'wWinMain'的不一致注释:此实例没有注释.请参阅c:\ program files(x86)\ windows kits\8.0\include\um\winbase.h(2201).LeesSpaceShip main.cpp 6
我不清楚注释是什么.那么什么是注释?哪些部分在我的代码中出错?
谢谢.
编辑:是的,代码编译并运行得很好.
这是一个两部分问题.可以将函数的返回值赋给引用吗?如
Foo FuncBar()
{
return Foo();
}
// some where else
Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)
这个可以吗?我的理解是FuncBar()返回一个Foo对象,现在myFoo是对它的引用.
问题的第二部分.这是优化吗?因此,如果你在一个循环中这样做很多时候做得更好
Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)
要么
Foo myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)
并且考虑到变量的使用,不会使用ref需要更慢的解引用?
在State.h我有
enum class StateID : unsigned int;
Run Code Online (Sandbox Code Playgroud)
在State.cpp我有
enum class StateID : unsigned int
{
NullID = 0,
MainMenuID,
GamePlayID,
};
Run Code Online (Sandbox Code Playgroud)
问题是任何包含的类State.h都有前向声明,但我不能enum在任何cpp文件中使用任何值,除了States.cpp(定义它),比如StateID::MainMenuID.错误说......
/home/lee/Projects/SuddenAwakening/Source/Game.cpp:24:错误:'MainMenuID'不是'StateID'的成员
我正在运行LinuxMint15KDE,g ++ 4.7,我在其他部分使用c ++ 11功能,如nullptr,unique_ptr,ect ......,所以我不会忘记c ++ 11的编译器标志.
为了查看weak_ptr是否指向有效对象,创建临时shared_ptr似乎效率低下.我甚至不想访问该对象.这是因为我有一个从shared_ptr的向量返回weak_ptr的函数,如果它返回一个空的weak_ptr,那么这意味着该对象不存在该GUID.
所以我只是测试对象是否存在.
有没有另一种方法来检查weak_ptr是否为空,而不创建shared_ptr?
使用安全吗?
vector.emplace_back( new MyPointer() );
Run Code Online (Sandbox Code Playgroud)
或者,向量中抛出异常或某些失败会导致内存泄漏吗?
是否更好地执行以下某种形式,首先将指针放在临时的unique_ptr中.
vector.emplace_back( std::unique_ptr<MyPointer>( new MyPointer() ) );
Run Code Online (Sandbox Code Playgroud)
因此,如果发生向量故障,临时unique_ptr仍将清理内存?
这些函数是我的大多数程序对象将使用的实用程序类型的东西.我希望将它们放在命名空间中并使它们具有全局性.此命名空间在标头中定义,然后添加到我的预编译标头中.但是到目前为止,我已经在2个不同的对象中使用了这个命名空间中的函数,并且编译器在这两个对象上抛出了多次定义的符号错误.
命名空间文件
#ifndef UTILS_H
#define UTILS_H
#include <random>
#include <cmath>
namespace Utils
{
extern int GetRandomBetween(int low, int high)
{
if (low < 0 || low >= high)
return 0;
int seed = high - low;
return (rand() % seed) + low;
}
};
#endif
Run Code Online (Sandbox Code Playgroud)
和我的precomp标题
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
//#define WIN32_LEAN_AND_MEAN // Exclude …Run Code Online (Sandbox Code Playgroud) c++ ×10
c++11 ×5
annotations ×1
c++-chrono ×1
enum-class ×1
for-loop ×1
g++ ×1
gnu ×1
memory-leaks ×1
mingw ×1
reference ×1
return ×1
shared-ptr ×1
stdvector ×1
timer ×1
vector ×1
visual-c++ ×1
weak-ptr ×1
winapi ×1