如何使用带有需要参数的构造函数的类来声明对象? [英] How to just declare an object using a class with a constructor requiring parameters?

查看:90
本文介绍了如何使用带有需要参数的构造函数的类来声明对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆