0
나는 C++을 배우고 있으며, 내가하고 싶은 것을 대략 알지만 잘못된 길로하고있어 매우 피곤하다. 가장 좋은 방법은 이런 식으로 뭔가를하고의 (우선 올바른 방법)의 새로운 기능 : 첫째템플릿 및 상속을 사용하여이 C++ 코드를 수정하고 개선하는 방법은 무엇입니까?
// Query.hpp
class Query {
public:
Query();
template<typename T>
std::vector<boost::shared_ptr<BaseResult> > run();
private:
std::string sql;
};
// Firstly, something like this:
// I would like to do the equivalent of passing in a type T that would be
// derived from BaseResult and create a new instance of it when adding
// to vector of BaseResult:
template<typename T>
std::vector<boost::shared_ptr<BaseResult> > Query::run() {
std::vector<boost::shared_ptr<BaseResult> > results;
// ResultSet is from the mysql c++ connector
boost::shared_ptr<sql::ResultSet> res(stmt->executeQuery(this->sql));
// I want to add a new T to results here
while (res->next()) {
results.push_back(new T(res));
}
// RVO prevents copy in release - yes?
return results;
}
// Query.cpp
Query::Query() {
}
// main.cpp
void foo(const std::vector<boost::shared_ptr<BaseResult> >& results) {
// loop through calling virtual method on each item
}
int main(int argc, char* argv[])
// Determine query type
ProgramOptions opts(argc, argv);
// Should this indeed be a pointer because
// of code below or is it wrong?
std::vector<boost::shared_ptr<BaseResult> >* results;
// Secondly, something like this:
if (opts.getquerytype() == "type1") {
// I'd like to get a
// std::vector<boost::shared_ptr<BaseResult> > returned here
// containing many instances of a
// type derived from BaseResult
// I'd like to be able to do something like this
// Is this assignment correct?
*results = getQuery().run<DerivedResult>();
}
else {
// I'd like to get a
// std::vector<boost::shared_ptr<BaseResult> > returned here
// containing many instances of a
// different type derived from BaseResult
// I'd like to be able to do something like this
// Is this assignment correct?
*results = getQuery().run<DifferentDerivedResult>();
}
foo(results);
}