小编Guy*_*ham的帖子

25
推荐指数
2
解决办法
2万
查看次数

如何使用std :: string替换所有出现的两个字符的一个字符?

是否有一个很好的简单的方法,以取代所有出现"/"std::string"\/"逃脱的所有斜线std::string

c++ replace escaping stdstring

24
推荐指数
2
解决办法
3万
查看次数

共享的指针传染媒介,在清除传染媒介以后的记忆问题

我意识到在调用vector.clear()哪个持有共享指针之后,shared_ptr没有释放拥有的对象的析构函数.

代码示例如下所示.即使vector.clear()被调用,在共享指针之后调用的析构函数超出了范围.我的问题是 - 我是否必须通过重置它们来手动删除向量内的所有智能指针?有没有更简单的方法可以提供建议?

Output :   

constructor
I am here
destructor

Code:

#include <vector>
#include <iostream>
#include <memory>

using namespace std;

class A
{
public:
    A(){cout << "constructor" << endl;};
    ~A(){cout << "destructor"  << endl;};
};

int main( )
{
    shared_ptr<A> sharedptr (new A);
    std::vector<shared_ptr<A> > test;
    test.push_back(sharedptr);

    test.clear();
    cout << "I am here" << endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ memory smart-pointers vector

23
推荐指数
2
解决办法
4万
查看次数

如何在C++中抽象出重复的try catch模式

我有一个模式,重复几个成员函数,如下所示:

int myClass::abstract_one(int sig1)
{
  try {
    return _original->abstract_one(sig1);
  } catch (std::exception& err) {
    handleException(err);
  } catch (...) {
    handleException();
  }
}

bool myClass::abstract_two(int sig2)
{
  try {
    return _original->abstract_two(sig2);
  } catch (std::exception& err) {
    handleException(err);
  } catch (...) {
    handleException();
  }
}

[...]

int myClass::abstract_n(bool sig3a, short sig3b)
{
  try {
    return _original->abstract_n(sig3a, sig3b);
  } catch (std::exception& err) {
    handleException(err);
  } catch (...) {
    handleException();
  }
}
Run Code Online (Sandbox Code Playgroud)

其中抽象一个到n是纯虚拟抽象接口用于其的方法myClass_original是具体实现.

我不喜欢这个模式在代码中重复,并希望找到一种方法来消除重复try/ catch模式和代码作为单个抽象,但我想不出一个在没有宏的情况下在C++中执行此操作的好方法.我认为有一种方法可以让模板更好地完成这项工作.

请建议一种简洁的方法来重构此代码以抽象出重复的模式.

c++ refactoring templates exception

22
推荐指数
2
解决办法
6317
查看次数

单线程与多线程

在一次采访中询问了这个问题.第一部分是编写单例类:

class Singleton
{
    static Singleton *singletonInstance;
    Singleton() {}

  public:
    static Singleton* getSingletonInstance()
    {
        if(singletonInstance == null)
        {
            singletonInstance = new Singleton();
        }
        return singletonInstance;
    }
};
Run Code Online (Sandbox Code Playgroud)

然后我被问到如何getSingletonInstance()在多线程情况下处理这个问题.我不太确定,但我修改为:

class Singleton 
{
    static Singleton *singletonInstance;
    Singleton() {}
    static mutex m_;

  public:
    static Singleton* getSingletonInstance()
    {
        m_pend();
        if(singletonInstance == null)
        {
            singletonInstance = new Singleton();
        }
        return singletonInstance;
    }

    static void releaseSingleton()
    {
        m_post();
    }
};
Run Code Online (Sandbox Code Playgroud)

然后有人告诉我,虽然需要一个互斥锁,但挂起和发布互斥锁效率不高,因为需要时间.并且有一种更好的方法来应对这种情况.

有没有人知道在多线程情况下处理单例类的更好,更有效的方法?

c++ singleton multithreading synchronization mutex

22
推荐指数
2
解决办法
2万
查看次数

用户和内核空间之间的共享信号量

精简版

是否可以在用户空间和内核空间之间共享信号量(或任何其他同步锁)?命名的POSIX信号量具有内核持久性,这就是为什么我想知道是否有可能从内核上下文创建和/或访问它们.

由于有关正常使用POSIX信号量的大量信息,搜索互联网并没有多大帮助.

长版

我正在为实时系统开发一个统一的界面,我在其中添加了一些书籍,由信号量保护.这些书籍保留是在资源分配和解除分配上完成的,这是在非实时环境中完成的.

使用RTAI,等待和发布信号量的线程需要处于实时上下文中.这意味着使用RTAI的命名信号量意味着在用户空间中的每个等待/发布之间切换实时和非实时上下文,更糟糕的是,为内核空间中的每个sem/wait创建一个短实时线程.

我正在寻找的是一种在内核和用户空间之间共享正常Linux或POSIX信号量的方法,这样我就可以安全地在非实时环境中等待/发布它.

任何有关此主题的信息将不胜感激.如果这是不可能的,你还有其他任何想法如何完成这项任务?1

1一种方法是添加系统调用,在内核空间中具有信号量,并让用户空间进程调用该系统调用,并且信号量将全部在内核空间中进行管理.如果我不是因为这个而不必修补内核,我会更高兴.

c semaphore linux-kernel

21
推荐指数
2
解决办法
7217
查看次数

Python类继承:AttributeError:'[SubClass]'对象没有属性'xxx'

我有以下基类和子类:

class Event(object):
    def __init__(self, sr1=None, foobar=None):
        self.sr1 = sr1
        self.foobar = foobar
        self.state = STATE_NON_EVENT

# Event class wrappers to provide syntatic sugar
class TypeTwoEvent(Event):
    def __init__(self, level=None):
        self.sr1 = level
        self.state = STATE_EVENT_TWO
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我正在检查TypeTwoEvent类的实例,检查我知道在基类中存在的字段 - 我希望它默认值为None.但是,我的代码引发了以下异常:

AttributeError:'TypeTwoEvent'对象没有属性'foobar'

我的印象是基类字段将由子类继承,并且创建子类的实例将实例化基类(从而调用其构造函数)...

我在这里失踪了什么?为什么TypeTwoEvent没有一个None属性-当其所来源的基本类有一个TypeTwoEvent属性?

python inheritance class-attributes

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

可以从 int 转换为 enum 类类型吗?

我有一个使用 C++ 语言的情况,在那里我得到了从 1 到 7 的整数值,用于输入到工作日的方法中。因为我可以很容易地将枚举类类型static_cast转换为整数,但从整数转换为枚举是一个问题。引发的问题 - 是否可以将数字转换为枚举类类型?因为在另一种生成整数的方法中,必须调用 enum 类基于工作日输入的方法进行工作日更新。该更新方法仅采用 enum 类类型,即 enum class weekday { Monday =1, 。. 星期日 }

方法是void updateWeekday(weekday e)

有人可以帮忙吗?

c++ casting strongly-typed-enum

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

对类的'typeinfo'的未定义引用

可能重复:
g ++未定义的typeinfo引用
未定义的符号"vtable for ..."和"typeinfo for ..."?

我不能用我的班级.

class Accel {
public:
    virtual void initialize(void);
    virtual void measure(void);
    virtual void calibrate(void);
    virtual const int getFlightData(byte);
};
class Accel_ad : public Accel {
public:
    Accel_ad() : Accel(){}
    void initialize(void) {/*code code code...*/}
    void measure(void) {/*measure code*/}
    const int getFlightData(byte axis){/*getting data*/}
    void calibrate(void) {
        int findZero[FINDZERO];
        int dataAddress;
        uint8_t  data[2];
        for (byte calAxis = XAXIS; calAxis < ZAXIS; calAxis++) {
            if (calAxis == YAXIS) dataAddress = 0x32;
            if (calAxis == …
Run Code Online (Sandbox Code Playgroud)

c++ virtual g++ linker-errors typeinfo

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

'operator new':函数不带2个参数

由于某些原因,我似乎无法将我的展示位置新工作.基于这个问题,我已经正确设置了这个问题.

但是,我继续得到错误:

'operator new':函数不带2个参数

这是我的代码:

char * p = new char [sizeof(Node) * 5];
Node* node = new(p) Node();
Run Code Online (Sandbox Code Playgroud)

其中Node是链表节点.我试图根据其他堆栈溢出问题简化此问题,我仍然得到相同的错误:

char *buf  = new char[sizeof(int)]; // pre-allocated buffer
int *p = new (buf) int;
Run Code Online (Sandbox Code Playgroud)

有谁知道我为什么会遇到这个问题?

任何帮助是极大的赞赏!

PS,这个有效:

Node* node = new Node();
Run Code Online (Sandbox Code Playgroud)

c++ placement-new

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