小编Fra*_*ank的帖子

模式,以避免dynamic_cast

我有一节课:

class A 
{
public:
  virtual void func() {...}
  virtual void func2() {...}
};
Run Code Online (Sandbox Code Playgroud)

还有一些来自这个的派生类,比方说B,C,D ...在95%的情况下,我想要遍历所有对象并调用func或func2(),因此我将它们放在向量中,如:

std::vector<std::shared_ptr<A> > myVec;
...
for (auto it = myVec.begin(); it != myVec.end(); ++it)
  (*it).func();
Run Code Online (Sandbox Code Playgroud)

但是,在剩下的5%的情况下,我想根据它们的子类做一些不同的类.我的意思完全不同,比如调用带有其他参数的函数或者根本不为某些子类调用函数.我想到了一些解决这个问题的方法,我都不喜欢这个方案:

  • 使用dynamic_cast来分析子类.不好,太慢,因为我经常在有限的硬件上打电话
  • 在每个子类中使用一个标志,如枚举{IS_SUBCLASS_B,IS_SUBCLASS_C}.不好,因为它没有感觉到OO.
  • 还将类放在其他向量中,每个向量用于其特定任务.这也不觉得OO,但也许我错了.喜欢:

    std::vector<std::shared_ptr<B> > vecForDoingSpecificOperation;
    std::vector<std::shared_ptr<C> > vecForDoingAnotherSpecificOperation;
    
    Run Code Online (Sandbox Code Playgroud)

那么,有人可以建议一种能达到我想要的风格/模式吗?

c++ oop c++11

18
推荐指数
2
解决办法
9374
查看次数

#if在#define里面?

我坐在一些遗留代码上,通过#defines生成大量代码.现在我知道不可能有一个#ifdef内部#define,但#if可能吗?我想为特定类型添加一些特化.(没有像使用模板那样进行重大更改).以下示例给出了隐秘错误,因此不是这样的:

#define MK_GET(type) \
  type get_ ## type (int index) \
  { \
    #if type == double \  <-- what i want to add
      specialized code... \
    #endif
    ...
  } \

MK_GET(double);
MK_GET(int);
MK_GET(string);
Run Code Online (Sandbox Code Playgroud)

c++ c-preprocessor preprocessor-directive

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

C++:路由到成员函数的静态函数包装器?

我尝试过各种各样的设计方法来解决这个问题,但我似乎无法做到这一点.

我需要公开一些静态函数来用作C lib的回调函数.但是,我希望实际的实现是非静态的,所以我可以使用虚函数并在基类中重用代码.如:

class Callbacks {
  static void MyCallBack() { impl->MyCallBackImpl(); }
  ...

class CallbackImplBase {
   virtual void MyCallBackImpl() = 0;
Run Code Online (Sandbox Code Playgroud)

但是我尝试解决这个问题(Singleton,让回调包含在实现者类中,等等).我最终陷入了死胡同(impl通常最终指向基类,而不是派生类).

我想知道它是否完全可能,或者我是否坚持创建某种辅助函数而不是使用继承?

c++ design-patterns callback

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

将字符串正确转义为PHP中的JSON数据

我有一些相当长的字符串,其中包含我想要从PHP转换为JSON的任何内容.有一个简单的方法吗?例如,我希望这个JSON输出工作:

<?php
   $var = "hel\"lo";
   $var2 = "hel\nlo";
   echo "[\"".$var."\", \"".$var2."\"]"; // should give me the data: hel"lo and hel<new line>lo
?>
Run Code Online (Sandbox Code Playgroud)

php json

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

为什么不能以与指针相同的方式返回const const引用?

如果我们从函数返回指针,我们可以写任何一个

const X* f();
Run Code Online (Sandbox Code Playgroud)

要么

X* const f();
Run Code Online (Sandbox Code Playgroud)

,以这种方式控制是否可以重新分配指针或是否可以在内部修改类.但是当返回引用时,这两个似乎具有相同的含义:

const X& f();
X& const f();
Run Code Online (Sandbox Code Playgroud)

似乎不可能返回一个你可以修改X的引用,但不能重新分配它?如果它确实不可能,为什么我们应该在指针在这个区域看起来有效时返回引用?

更新:正如已经指出的那样,不能重新分配引用.然而,这让我更加困惑,因为下面的代码打印33 55,而不是33 33,正如我所料.如何匹配该引用无法重新分配?

struct X
{
   X(int i_) { i = i_;} 
   int i;
};

struct Y
{
    X& get2() {tmp2 = new X(55); return *tmp2;} 
    X& get() {tmp = new X(33); return *tmp;}    
    void print () {cout << tmp->i << endl;}
    X* tmp;
    X* tmp2;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Y y;    
    X& tmp2 = y.get2();
    X& tmp = y.get();       
    y.print(); …
Run Code Online (Sandbox Code Playgroud)

c++ pointers

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