如何像函数一样调用构造函数
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: %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;
};
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何绕过 << 调用,就好像"#ifndef DEBUG" c++ 中的宏一样?
- 方法调用意外地像 l 值一样起作用
- 如何像函数一样调用构造函数
- 是一个 for 循环,最终甚至不会运行一次,就像调用 if 语句以首先检查大小一样快
- 可以像'funs[1]();'一样调用的函数数组
- 有没有办法像我的代码一样在C++中调用多形反射
- 使用发出与调用信号,就好像它是Qt中的常规函数一样
- 你能像调用成员函数一样调用朋友函数吗?
- 如何像普通 C 函数一样使用正确的 'this' 指针调用 C++ 类成员函数?(指向类成员函数的指针)
- 像调用普通方法一样调用构造函数和析构函数的注意事项和风险
- 如何在c++中动态调用属性名,就像JS中的方括号符号一样
- 多次调用同一对象的析构函数,其结果与标准中描述的不一样
- C++:"such strings"类型。使像 fun( "str" ) 一样的函数调用工作
- 调用函数就像声明变量一样