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