小编use*_*427的帖子

unique_ptr和多态

我有一些目前使用原始指针的代码,我想改为智能指针.这有助于以各种方式清理代码.无论如何,我有返回对象的工厂方法,以及调用者管理它们的责任.所有权不是共享的,所以我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)

c++ smart-pointers c++11

14
推荐指数
1
解决办法
1万
查看次数

模板和常量字符串

我有一个我想要模板的功能,目前我有两个不同的版本std::stringstd::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::stringstd::wstring并且_Tc要么是charwchar_t.我遇到一个问题,即我定义的常量字符串在模板版本中工作.上面的代码适用std::string但不适用,std::wstring因为没有构造函数std::wstring接受char*数组.通常要解决这个问题,我const T tofind = L"\"' "会将常量字符串声明为,但是它不能用于std::string.

我对模板没有太多经验,所以我真的不知道如何解决这个问题.

c++ templates

6
推荐指数
1
解决办法
703
查看次数

PHP静态类或命名空间

我想要衡量人们对使用静态类而不是命名空间的看法.我来自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关键字).

php namespaces static-class

5
推荐指数
1
解决办法
3049
查看次数

使用longjmp的C++和C库

我正在使用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++库类通常会在堆上分配数据,当对象被销毁时会释放这些数据.但是,析构函数不会在这里调用,所以我认为这会导致内存泄漏.根据编写脚本的人,我可能会引发很多错误,从而泄漏大量内存.

我相信其他人需要解决类似的问题,但我找不到任何我想要的东西.很多地方说对象不会被破坏,但我认为必须有一种方法来确保释放内存?

c++ lua longjmp

5
推荐指数
1
解决办法
453
查看次数

OpenCV图像尺寸无需读取整个图像

我正在使用OpenCV并且正在读取数十亿字节的图像 - 太多而无法一次装入内存.但是,我需要初始化一些需要图像尺寸的基本结构.目前我正在使用imread然后立即释放图像,这实在是效率低下.

有没有办法在不读取整个文件的情况下使用opencv获取图像尺寸?如果没有,你能否建议另一个可以解析标题的库(最好是轻量级的,可以看作是它的全部内容)?理想情况下,它至少支持与OpenCV一样多的格式.

c++ opencv image

5
推荐指数
1
解决办法
1238
查看次数

使用struct参数从程序集调用C++函数

我得到了一些意想不到的行为,这可能意味着我并不完全理解编译器在做什么.考虑以下人为的程序:

#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 …

c++ assembly visual-studio-2010 visual-c++

3
推荐指数
1
解决办法
461
查看次数

C++ STL内存管理:堆栈还是堆?

通常当我使用非本地范围内的STL对象时,我存储指向我想要存储的数据的指针.例如

std::vector<MyStruct*> 
Run Code Online (Sandbox Code Playgroud)

当我需要清理矢量时,我会通过并删除所有内容.我最近注意到这没有必要像我想的那样.无论出于何种原因,我认为STL类将数据存储在堆栈中,而我现在认为它在堆上分配它.它是否正确?将对象存储为指针以减少复制时间是唯一真正的好处吗?

c++ memory-management stl

1
推荐指数
1
解决办法
4632
查看次数

初始化一个字符串,为什么需要`@`?

我是Objective-C的新手,但我对C/C++很有经验,所以有些事情对我来说很奇怪.我正在阅读一个教程,其中显示了Objective-C的基础知识,作者警告我忘记@在我的字符串之前包含它.所以,例如

"Hello" VS @"Hello"

但是,作者没有解释为什么@需要它或它的语法意义是什么.那就是我现在要问的,@做什么呢?

objective-c ios

1
推荐指数
1
解决办法
299
查看次数