如何像函数一样调用构造函数

How to call the constructor like a function?

本文关键字:一样 调用 构造函数 何像 函数      更新时间:2023-10-16

我正在尝试创建一个临时C++对象,以便在构造函数中快速调用,仅此而已。

出于某种原因,这不起作用

代码如下:

typedef std::vector<std::string> string_vec_t;
//-------------------------------------------------------------------------
struct visit_items
{
    virtual void action(std::string *s) = 0;
};
void items_visitor(visit_items *v)
{
    string_vec_t l = { "1", "2", "3", "4" };
    for (auto &s: l)
        v->action(&s);
}
struct my_visit_items: visit_items
{
public:
    string_vec_t *r;
    my_visit_items(string_vec_t *r /*, int */): r(r)
    {
        items_visitor(this);
    }
    virtual void action(std::string *s) override
    {
        r->push_back(*s);
        printf("visited: %sn", s->c_str());
    }
};
//-------------------------------------------------------------------------
int main(int argc)
{
    string_vec_t r;
    r.push_back("1");
    my_visit_items(&r /*, 0 */);
    return -1;
}

如果我让 ctor 采取额外的参数,那么没问题。但就目前而言,它不起作用,我不明白错误:

1>error C2040: 'r': 'my_visit_items &' differs in levels of indirection from 'string_vec_t'
1>error C2530: 'r': references must be initialized

my_visit_items(&r /*, 0 */);my_visit_items引用r的声明,就像my_visit_items &r;一样。请尝试统一初始化。您还应该尽量避免传递指向字符串和向量的指针。您显示的代码在没有指针的情况下可以正常工作:

#include <iostream>
#include <vector>
#include <string>
typedef std::vector<std::string> string_vec_t;
//-------------------------------------------------------------------------
struct visit_items {
    virtual void action(const std::string& s) = 0;
    virtual ~visit_items() = default;
};
void items_visitor(visit_items& v) {
    string_vec_t l = {"1", "2", "3", "4"};
    for(auto& s : l) v.action(s);
}
struct my_visit_items : visit_items {
    string_vec_t& r;
    my_visit_items(string_vec_t& r) :
        visit_items{},
        r(r)
    {
        items_visitor(*this);
    }
    virtual void action(const std::string& s) override {
        r.push_back(s);
        std::cout << "Visited: " << s << "n";
    }
};
//-------------------------------------------------------------------------
int main() {
    string_vec_t r;
    r.push_back("1");
    my_visit_items{r};    //   { } instead of ( )
    return 1;
}

当你想传递一个引用时,你需要调用do_this(r); 通过调用do_this(&r),您将传递指向r 的指针。

此外,您可以直接调用构造函数(理论上( do_this::do_this(r);

但是,当您想要一个函数时,为什么不使用函数呢?并非每个编译器都允许这样做,而无需显式设置一些编译器选项(例如,gcc 需要 -fpersmissive(。
如果原因是您只想实现一次函数,则从构造函数调用该函数。
如果希望函数封装在类中而不需要类的属性,则还可以使用 static 类成员函数。

与错误无关。

在我的 Linux 上,g++-v7:

如果打开足够多的编译器标志,您可能会发现编译器正在警告以下结构:

struct visit_items
{
    virtual void action(std::string *s) = 0;
};

// warning: ‘struct visit_items’ has virtual functions and 
// accessible non-virtual destructor [-Wnon-virtual-dtor]

注意:此警告会触发其他 2 个问题(使用类时(。

当您提供虚拟默认 dtor 时,这一切都会清除

struct visit_items  
{
   virtual ~visit_items() = default;
   virtual void action(std::string *s) = 0;
};