我有一个值数组,从程序的不同部分传递给我的函数,我需要存储以供以后处理.因为我不知道有多少次之前,它是时间来处理数据我函数将被调用做什么,我需要一个动态的存储结构,所以我选择了一个std::vector
.我不想push_back
单独对所有值进行标准循环,如果我可以使用类似的东西复制它,那将是很好的memcpy
.
我很好奇C++中不同的常量声明和定义选项的好处/坏处.在最长的时间内,我刚刚在类定义之前将它们声明为头文件的顶部:
//.h
const int MyConst = 10;
const string MyStrConst = "String";
class MyClass {
...
};
Run Code Online (Sandbox Code Playgroud)
虽然这污染了全局命名空间(我知道这是一件坏事,但从来没有找到一个清单,说明为什么它不好),常量仍将限定在各个翻译单元,因此不包含此标题的文件将无法访问这些常量.但是如果其他类定义了一个同名的常量,你就可以获得名称冲突,这可能是一件坏事,因为它可能是一个可以重构的区域的良好指示.
最近,我决定在类定义本身内部声明类特定常量会更好:
//.h
class MyClass {
public:
static const int MyConst = 10;
...
private:
static const string MyStrConst;
...
};
//.cpp
const string MyClass::MyStrConst = "String";
Run Code Online (Sandbox Code Playgroud)
常量的可见性将根据常量是仅在类的内部使用还是使用该类的其他对象所需来调整.这就是我现在认为是最好的选择,主要是因为你可以将内部类常量保持为类的私有,而使用公共常量的任何其他类都可以更详细地引用常量的来源(例如MyClass: :MYCONST).它也不会污染全局命名空间.虽然它确实不利于在cpp文件中要求非整数初始化.
我还考虑将常量移动到它们自己的头文件中并将它们包装在命名空间中,以防其他类需要常量,而不是整个类定义.
只是寻找意见和可能还有其他选择我尚未考虑过.
我正在研究一段代码,它有许多可能的故障点,导致它提前退出函数.我正在与之交互的库要求将C样式的数组传递给函数.所以,我没有在每个出口点调用数组上的delete,而是这样做:
void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength]);
pArray = raiiArray.get();
if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }
//etc.
}
Run Code Online (Sandbox Code Playgroud)
我想使用unique_ptr
,但我当前的编译器不支持它,并且引用计数开销在这种情况下并不重要.
我只是想知道在与遗留代码接口时是否有人对这种做法有任何想法.
更新 我完全忘了shared_ptr
呼叫delete
而不是delete []
.我刚看到没有内存泄漏,并决定采用它.甚至没想过用矢量.因为我最近一直在钻研新的(对我来说)C++我认为我有一个案例"如果你拥有的唯一工具是锤子,那么一切看起来都像钉子一样." 综合征.感谢您的反馈.
UPDATE2我想我会改变这个问题并提供一个答案,让那些犯了同样错误的人更有价值.虽然有类似的替代方案scoped_array
,shared_array
并且vector
,您可以使用a shared_ptr
来管理数组的范围(但在此之后我不知道为什么我会想要):
template <typename T>
class ArrayDeleter
{
public:
void operator () (T* d) const
{
delete [] d;
}
};
void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength], ArrayDeleter<char>());
pArray = raiiArray.get();
if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }
//etc. …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个通用函数,从std :: vector中删除重复项.由于我不想为每个矢量类型创建一个函数,我想让它成为一个可以接受任何类型矢量的模板函数.这是我有的:
//foo.h
Class Foo {
template<typename T>
static void RemoveVectorDuplicates(std::vector<T>& vectorToUpdate);
};
//foo.cpp
template<typename T>
void Foo::RemoveVectorDuplicates(std::vector<T>& vectorToUpdate) {
for(typename T::iterator sourceIter = vectorToUpdate.begin(); (sourceIter != vectorToUpdate.end() - 1); sourceIter++) {
for(typename T::iterator compareIter = (vectorToUpdate.begin() + 1); compareIter != vectorToUpdate.end(); compareIter++) {
if(sourceIter == compareIter) {
vectorToUpdate.erase(compareIter);
}
}
}
}
//SomeOtherClass.cpp
#include "foo.h"
...
void SomeOtherClass::SomeFunction(void) {
std::vector<int> myVector;
//fill vector with values
Foo::RemoveVectorDuplicates(myVector);
}
Run Code Online (Sandbox Code Playgroud)
我一直收到链接器错误,但它编译得很好.关于我做错了什么的任何想法?
更新:基于Iraimbilanja给出的答案,我去重写了代码.但是,万一有人想要使用代码来执行RemoveDuplicates函数,这里是:
//foo.h
Class Foo {
template<typename T>
static void RemoveVectorDuplicates(T& …
Run Code Online (Sandbox Code Playgroud) 所以我读过Joel的文章,并查看了SO,似乎从ASCII切换到Unicode的唯一原因是国际化.作为一项政策,我所工作的公司只会发布英文软件,即使我们的客户遍布全球.由于我们所有的客户都是科学家,因此他们具有足够的英语功能,可以将我们的软件用作非母语人士.或者逻辑如此.由于此策略,没有迫切需要切换到Unicode以支持其他语言.
但是,我正在开始一个新项目,并希望使用Unicode(因为这是一个负责任的程序员应该做的,对吧?).为此,我们必须开始将我们编写的所有库转换为Unicode.这不是一项小任务.
如果程序本身的国际化不被认为是一个正当的理由,那么如何将重新编码库和程序所花费的时间用于转换为Unicode?
这可能是重复的,但到目前为止我还没有找到任何答案.我的公司通过了一项决议,所有文件都需要有一个样板注释标题,其中包含文件名和版权日期.我希望有一个简单的方法来创建一个标题模板,该标题模板被添加到添加到项目中的每个新类(.cpp和.h文件)的顶部,并带有几个基于日期替换的变量,文件名等
不幸的是,似乎这应该是一项更大的任务.我已经研究过使用Visual C++代码模型和手动创建项模板操作代码,但似乎无法让他们做任何我想做的事情.
对不起,如果这听起来像是"为我做我的工作"的帖子,但对我而言,这不值得花费那么多时间.如果要花一天的时间来弄清楚扩展Visual Studio的细微之处,我可以手动添加和编辑每个新文件的标题,因为它不经常这样做.有没有比我看到的方法更简单的方法,或者是如何将这些方法用于我的目的的简单示例?
我找不到一个列表,描述Windows中视频捕获的所有不同选项.我想将此列表保留给非专有SDK(即ImageSource有自己的SDK,仅适用于ImageSource捕获卡).要设置建议的年龄限制,一切都应该能够在Windows XP或更高版本上运行.包含您想要的有关您的建议的信息.只是为了开始:
我正在查看DirectX March 2009 SDK附带的DXUTCore项目,并注意到它们不是使用普通的访问器方法,而是使用宏来创建通用访问器,类似于以下内容:
#define GET_ACCESSOR( x, y ) inline x Get##y() { DXUTLock l; return m_state.m_##y;};
...
GET_ACCESSOR( WCHAR*, WindowTitle );
Run Code Online (Sandbox Code Playgroud)
似乎##运算符只是将第二个参数中的文本插入到宏中,以使用该文本创建对变量进行操作的函数.这是C++中的标准内容(即不是Microsoft特定的)吗?它的使用被认为是好的做法吗?那个运营商叫什么?
我有一个程序仍然必须针对Windows XP(_WIN32_WINNT 0x501),因为我们的大多数客户仍然使用XP.但是,我们已经推出Vista一段时间了,现在推动Windows 7升级.为使软件在较新的操作系统上正常工作,有一些操作需要UAC提升.我有提升代码工作,但希望在启动UAC进程的按钮上显示UAC图标.不幸的是,Microsoft的UAC UI文档中定义的所有选项都需要_WIN32_WINNT 0x600或更新版本.
是否有任何方法可以在按钮上显示相应的UAC图标(Vista和7使用不同的图标),同时仍能够定位XP(不显示图标)?我正在使用C++,但可能能够适应.NET解决方案.
有问题的软件是本机C++/MFC应用程序,它通过UDP接收大量数据,然后处理数据以进行显示,声音输出和写入磁盘等.当应用程序的CHM帮助文档从其帮助菜单启动时,我第一次遇到问题,然后在从硬件收集数据时单击帮助文档.为了复制它,使用AutoHotkey脚本在应用程序运行时快速单击帮助文档.一旦系统发生任何声音,我就开始收到错误.
如果我完全禁用声卡,一切都处理正常,没有错误,但声音输出明显禁用.但是,如果我有声音播放(在这个应用程序中,一个不同的应用程序,甚至只是消息框中的蜂鸣声)我得到数千个丢弃的数据包(我们知道这是因为每个数据包都有时间戳).作为第二个测试,我根本没有使用我的应用程序,只是使用Wireshark来监视来自硬件的传入数据包.果然,无论何时在Windows中播放声音,我们都丢弃了数据包.实际上,声音甚至不必主动播放以引起错误.如果我只是创建一个缓冲区(使用DirectSound8)并且从不开始播放,我仍然会遇到这些错误.
这种情况发生在具有多种网卡组合(光纤和RJ45)和声卡(集成卡和单独卡)的多台PC上.我还为每个NIC和声卡尝试了不同的驱动程序版本.所有测试都在Windows 7 32位上进行.由于我的应用程序使用DirectSound音频,我尝试了不同的CooperativeLevels(正常操作是DSSCL_PRIORITY)没有成功.
在这一点上,我非常确信它与我的应用程序无关,并且想知道在我开始与硬件供应商和/或微软打交道之前是否有人知道是什么原因导致了这个问题.
c++ ×6
stl ×2
templates ×2
vector ×2
windows-7 ×2
c ×1
constants ×1
copy ×1
declaration ×1
directsound ×1
frameworks ×1
icons ×1
macros ×1
raii ×1
sdk ×1
shared-ptr ×1
uac ×1
udp ×1
unicode ×1
windows ×1
windows-xp ×1