我有一节课:
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%的情况下,我想根据它们的子类做一些不同的类.我的意思完全不同,比如调用带有其他参数的函数或者根本不为某些子类调用函数.我想到了一些解决这个问题的方法,我都不喜欢这个方案:
还将类放在其他向量中,每个向量用于其特定任务.这也不觉得OO,但也许我错了.喜欢:
std::vector<std::shared_ptr<B> > vecForDoingSpecificOperation;
std::vector<std::shared_ptr<C> > vecForDoingAnotherSpecificOperation;
Run Code Online (Sandbox Code Playgroud)那么,有人可以建议一种能达到我想要的风格/模式吗?
我坐在一些遗留代码上,通过#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 lib的回调函数.但是,我希望实际的实现是非静态的,所以我可以使用虚函数并在基类中重用代码.如:
class Callbacks {
static void MyCallBack() { impl->MyCallBackImpl(); }
...
class CallbackImplBase {
virtual void MyCallBackImpl() = 0;
Run Code Online (Sandbox Code Playgroud)
但是我尝试解决这个问题(Singleton,让回调包含在实现者类中,等等).我最终陷入了死胡同(impl通常最终指向基类,而不是派生类).
我想知道它是否完全可能,或者我是否坚持创建某种辅助函数而不是使用继承?
我有一些相当长的字符串,其中包含我想要从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) 如果我们从函数返回指针,我们可以写任何一个
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)