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

时间:2019-04-08 19:51:41

标签: c++ constructor call

我试图创建一个临时的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;
}

如果我让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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果您要传递参考,则需要致电do_this(r); 通过调用do_this(&r),您正在传递指向r的指针。

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

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

答案 2 :(得分:0)

与错误无关。

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

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

<input autoFocus />

componentDidMount() {
    this.input.focus();
}
render() {
    return <input ref={input => (this.input = input)} />;
}

注意:此警告会引发其他2个问题(使用该类的地方)。

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

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