我正在尝试为基于Phalcon的webapp构建一个基本的"JSON getter",类似于:
function getJson($url, $assoc=false)
{
$curl = curl_init($url);
$json = curl_exec($curl);
curl_close($curl);
return json_decode($json, $assoc);
}
Run Code Online (Sandbox Code Playgroud)
当然,我想将这些东西全球化,可能作为注射服务.什么是最好的方法呢?我应该实施Phalcon\DI\Injectable吗?然后,我如何包含新课程并将其提供给DI?
谢谢!
我有一个用RAII编写的Array类(为了这个例子的目的,超简化):
struct Array
{
Array(int size) {
m_size = size;
m_data = new int[m_size];
}
~Array() {
delete[] m_data;
}
int* m_data = nullptr;
int m_size = 0;
};
Run Code Online (Sandbox Code Playgroud)
然后我有一个函数,它接受一个数组的引用并对它进行一些操作.我使用临时数组temp来执行处理,因为有几个原因我不能直接使用引用.完成后,我想将数据从临时数据传输到真实数据:
void function(Array& array)
{
Array temp(array.m_size * 2);
// do heavy processing on `temp`...
array.m_size = temp.m_size;
array.m_data = temp.m_data;
}
Run Code Online (Sandbox Code Playgroud)
显而易见的问题是temp在函数末尾超出范围:它的析构函数被触发,而后者又删除了内存.这种方式array将包含不存在的数据.
那么将数据所有权从一个对象"移动"到另一个对象的最佳方法是什么?
我有以下课程:
class Thing
{
public:
Thing() {};
virtual ~Thing() {}
};
class MyOwnThing : public Thing
{
public:
std::vector<int> m;
MyOwnThing() {};
void init()
{
m.push_back(0);
m.push_back(0);
m.push_back(0);
m.push_back(0);
m.push_back(0);
m.push_back(0);
m.push_back(0);
m.push_back(0);
m.push_back(0);
m.push_back(0);
m.push_back(0);
puts("done");
}
};
Run Code Online (Sandbox Code Playgroud)
到目前为止没有什么不寻常的,除了基类中的虚拟析构函数.现在,这就是我在main函数中所做的:
int main()
{
MyOwnThing *t = (MyOwnThing *) new Thing(); // (1)
t->init();
delete t;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在第二次调用时生成了一个很好的段错误push_back.如果我从中删除虚拟析构函数,一切都会顺利运行Thing.怎么了?
1)我怀疑这个演员可能是问题的根源.
模板新手在这里。我正在玩以下测试课程:
template<typename T>
class Container
{
public:
Container(T t) : m_t(t) {}
T clone()
{
return m_t;
}
private:
T m_t;
};
Run Code Online (Sandbox Code Playgroud)
该clone()方法返回成员变量的副本。显然,如果T是一个指针,这将无法正常工作,例如:
Container<SomeClass*> container(new SomeClass());
Run Code Online (Sandbox Code Playgroud)
该clone()方法只会返回一个指针,而不是完整的克隆。我知道if constexprC ++ 14编译器的优点,但是很不幸。我想让我的类通用,以便它也可以与指针一起使用。我应该创建两种不同的方法吗?SFINAE可以帮上什么忙吗?