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

How to call the constructor like a function?

我正在尝试创建一个临时 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: %s\n", s->c_str());
    }
};

//-------------------------------------------------------------------------
int main(int argc)
{
    string_vec_t r;
    r.push_back("1");
    my_visit_items(&r /*, 0 */);

    return -1;
}

如果我让构造函数接受一个额外的参数,那没问题。但就目前而言,它不起作用,我不明白错误:

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

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

的指针

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

但是为什么要有功能就不用功能呢?并非每个编译器都允许在不显式设置某些编译器选项的情况下这样做(例如,gcc 需要 -fpersmissive)。
如果原因是你只想实现你的函数一次,那么从构造函数中调用函数。
如果你想要一个封装在 class 中的函数而不需要 class 的属性,你也可以使用 static class 成员函数。

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;
}

与错误无关。

在我的 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 个问题(使用 class 的地方)。

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

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