如何使用带有需要参数的构造函数的类来声明对象? [英] How to just declare an object using a class with a constructor requiring parameters?
问题描述
我在 Openmp for 循环中有以下非线程安全代码
I have the following non thread safe code inside an Openmp for loop
bneijt::MetalinkFile record(filename, &mirrorList);
因为构造函数同时更新mirrorList
,它是循环后使用的向量,因此必须在所有线程之间共享.MetalinkFile
类在哪里
because the constructor at the same time updates mirrorList
which is a vector used after the loop and thus has to be shared among all threads.
Where the MetalinkFile
class is
class bneijt::MetalinkFile : public std::string {
private:
std::string d_filename;
std::vector<std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char const>> d_paths;
const bneijt::MirrorList *d_ml;
bool d_sizeSet;
unsigned long long d_size;
std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >> d_vers;
std::vector<std::string> d_verificationLines;
public:
MetalinkFile(const std::string &, const bneijt::MirrorList *);
void setSize(unsigned long long);
std::string size(void) const;
void addVerification(const std::string &);
void addVerification(const std::string &, const std::string &);
void addPath(const std::string &, const std::string &);
void addPath(const std::string &, const std::string &, unsigned char);
void addPath(const std::string &, const std::string &, const std::string &);
void finalize(void);
}
当然,我想过使用
#pragma omp critical
{
bneijt::MetalinkFile record(filename, &mirrorList);
}
之后在并行区域调用记录当然不行了
which of course doesn’t work when the record is called in the parallel region after
In function 'int main(int, char**)':
src/main.cc:379:17: error: 'record' was not declared in this scope.
379 | record.setSize(size);
自从做了
bneijt::MetalinkFile record;
#pragma omp critical
{
bneijt::MetalinkFile record(filename, &mirrorList);
}
也不是正确答案
In function 'int main(int, char**)':
src/main.cc:287:30: error: no matching function for call to 'bneijt::MetalinkFile::MetalinkFile()'
287 | MetalinkFile record;
| ^~~~~~
In file included from src/Metalink/Metalink.hh:29,
from src/metalink.cc:49:
src/Metalink/../MetalinkFile/MetalinkFile.hh:55:17: note: candidate: 'bneijt::MetalinkFile::MetalinkFile(const string&, const bneijt::MirrorList*)'
55 | MetalinkFile(std::string const &filename, MirrorList const *ml)
| ^~~~~~~~~~~~
src/Metalink/../MetalinkFile/MetalinkFile.hh:55:17: note: candidate expects 2 arguments, 0 provided
声明变量的正确方法是什么,该变量使用带有需要参数的构造函数的类?我的意思是,如何在不调用 MetalinkFile 构造函数的情况下声明记录?
推荐答案
您可以延迟构建并保持退出作用域后销毁";std::unique_ptr
(将实例存储在指针后面)或 std::optional
(像普通实例一样存储对象)等类型的语义.
You can delay construction and keep the "destroyed after exits scope" semantics with types like std::unique_ptr
(stores the instance behind a pointer) or std::optional
(stores the object just like a normal instance).
unique_ptr 是这样的
So something like this with unique_ptr
std::unique_ptr<bneijt::MetalinkFile> record;
#pragma omp critical
{
record.reset(new bneijt::MetalinkFile (filename, &mirrorList));
}
//example usage
record->setSize(500);
或者这个带有 std::optional .
or this with std::optional.
std::optional<bneijt::MetalinkFile> record;
{
record.emplace(filename, &mirrorList);
}
//example usage
record->setSize(500);
这篇关于如何使用带有需要参数的构造函数的类来声明对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!