我有一些目前使用原始指针的代码,我想改为智能指针.这有助于以各种方式清理代码.无论如何,我有返回对象的工厂方法,以及调用者管理它们的责任.所有权不是共享的,所以我unique_ptr认为这是合适的.我返回的对象通常都来自一个基类Object.
例如,
class Object { ... };
class Number : public Object { ... };
class String : public Object { ... };
std::unique_ptr<Number> State::NewNumber(double value)
{
return std::unique_ptr<Number>(new Number(this, value));
}
std::unique_ptr<String> State::NewString(const char* value)
{
return std::unique_ptr<String>(new String(this, value));
}
Run Code Online (Sandbox Code Playgroud)
经常返回的对象需要传递给另一个函数,该函数对类型的对象Object(基类)进行操作.没有任何智能指针,代码就是这样.
void Push(const Object* object) { ... } // push simply pushes the value contained by object onto a stack, which makes a copy of the value
Number* number = NewNumber(5);
Push(number); …Run Code Online (Sandbox Code Playgroud) 我有一个我想要模板的功能,目前我有两个不同的版本std::string和std::wstring.
功能(剥离)是这样的
template <class T, class _Tc>
std::vector<T> TokenizeArgs(const T& in) {
const T tofind = T("\"' ");
.. do stuff ..
}
Run Code Online (Sandbox Code Playgroud)
T或者是std::string或std::wstring并且_Tc要么是char或wchar_t.我遇到一个问题,即我定义的常量字符串在模板版本中工作.上面的代码适用std::string但不适用,std::wstring因为没有构造函数std::wstring接受char*数组.通常要解决这个问题,我const T tofind = L"\"' "会将常量字符串声明为,但是它不能用于std::string.
我对模板没有太多经验,所以我真的不知道如何解决这个问题.
我想要衡量人们对使用静态类而不是命名空间的看法.我来自C++背景,我非常喜欢它的语法以及它如何让你构建代码.我最近决定将代码分组为逻辑单元而不仅仅是文件.例如,我更喜欢User :: login to user_login之类的调用.所以,我做了一些谷歌搜索,并松了一口气,发现PHP有名称空间.我的解脱并没有持续多久,我真的不喜欢语法; 它为我的函数调用增加了更多的混乱.所以,目前我正在使用静态类来模拟命名空间.这有什么缺点吗?
我在PHP Namespaces vs Classes中发现了一个类似的问题,但是没有进行大量的讨论.
还有,有办法避免以下情况:
class Test {
public static void myFunc() {
Test::myOtherFunc();
}
public static void myOtherFunc() {
}
}
Run Code Online (Sandbox Code Playgroud)
我假设可以在不指定名称的情况下调用同一类中的函数,但显然不是.是否有任何变通方法(例如在C++中有using关键字).
我正在使用Lua,它有一个C API,它的错误提升功能使用longjmps.在提出错误时,我首先构建一条描述错误的消息然后告诉Lua引发错误.例如
std::stringstream ss;
ss << "'" << function->cb->name << "' expects at most " << maxargs_all
<< " argument(s) and received " << nargs;
luaL_error(L, ss.str().c_str());
Run Code Online (Sandbox Code Playgroud)
我的理解是longjmp不会展开堆栈,所以我的stringstream对象不会被破坏.如果我没记错的话,stringstream其他C++库类通常会在堆上分配数据,当对象被销毁时会释放这些数据.但是,析构函数不会在这里调用,所以我认为这会导致内存泄漏.根据编写脚本的人,我可能会引发很多错误,从而泄漏大量内存.
我相信其他人需要解决类似的问题,但我找不到任何我想要的东西.很多地方说对象不会被破坏,但我认为必须有一种方法来确保释放内存?
我正在使用OpenCV并且正在读取数十亿字节的图像 - 太多而无法一次装入内存.但是,我需要初始化一些需要图像尺寸的基本结构.目前我正在使用imread然后立即释放图像,这实在是效率低下.
有没有办法在不读取整个文件的情况下使用opencv获取图像尺寸?如果没有,你能否建议另一个可以解析标题的库(最好是轻量级的,可以看作是它的全部内容)?理想情况下,它至少支持与OpenCV一样多的格式.
我得到了一些意想不到的行为,这可能意味着我并不完全理解编译器在做什么.考虑以下人为的程序:
#include <stdio.h>
#pragma pack(push, 1)
struct A {
unsigned short a;
unsigned short b;
explicit A() {
printf("construct\n");
}
~A() {
printf("destruct\n");
}
};
#pragma pack(pop)
static_assert(sizeof(A) == 4, "sizeof(A) != 4");
A __stdcall f(int p1, A p2, int p3, int p4) {
printf("%08X %08X %08X %08X\n", p1, p2, p3, p4);
return p2;
}
int main() {
__asm {
push 4
push 3
push 2
push 1
call f
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上述程序会崩溃,但如果我删除的定义A(),并~A()从struct …
通常当我使用非本地范围内的STL对象时,我存储指向我想要存储的数据的指针.例如
std::vector<MyStruct*>
Run Code Online (Sandbox Code Playgroud)
当我需要清理矢量时,我会通过并删除所有内容.我最近注意到这没有必要像我想的那样.无论出于何种原因,我认为STL类将数据存储在堆栈中,而我现在认为它在堆上分配它.它是否正确?将对象存储为指针以减少复制时间是唯一真正的好处吗?
我是Objective-C的新手,但我对C/C++很有经验,所以有些事情对我来说很奇怪.我正在阅读一个教程,其中显示了Objective-C的基础知识,作者警告我忘记@在我的字符串之前包含它.所以,例如
"Hello" VS @"Hello"
但是,作者没有解释为什么@需要它或它的语法意义是什么.那就是我现在要问的,@做什么呢?
c++ ×6
assembly ×1
c++11 ×1
image ×1
ios ×1
longjmp ×1
lua ×1
namespaces ×1
objective-c ×1
opencv ×1
php ×1
static-class ×1
stl ×1
templates ×1
visual-c++ ×1