我已经开始尝试C++ 11标准,我发现这个问题描述了如何从同一个类中的另一个ctor调用你的ctor以避免使用init方法等.现在我正在使用看起来像这样的代码尝试相同的事情:
HPP:
class Tokenizer
{
public:
Tokenizer();
Tokenizer(std::stringstream *lines);
virtual ~Tokenizer() {};
private:
std::stringstream *lines;
};
Run Code Online (Sandbox Code Playgroud)
CPP:
Tokenizer::Tokenizer()
: expected('=')
{
}
Tokenizer::Tokenizer(std::stringstream *lines)
: Tokenizer(),
lines(lines)
{
}
Run Code Online (Sandbox Code Playgroud)
但是这给了我错误:
In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’:
/path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegation我已经尝试先移动Tokenizer()部分,然后在列表中移动,但这并没有帮助.
这背后的原因是什么,我应该如何解决?我尝试lines(lines)用this->lines = lines;相反的方式移动到身体,它工作正常.但我真的希望能够使用初始化列表.
提前致谢!
class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
Run Code Online (Sandbox Code Playgroud)
第一个构造函数可以调用第二个构造函数吗?
在我写的一个小游戏中,我有一个Weapon带有两个构造函数的类,一个用于获取一些参数来生成一个自定义武器,另一个用于获取一个默认武器CHAIN_GUN:
Weapon::Weapon (void) {
// Standard weapon
*this = getWeapon(CHAIN_GUN);
return;
}
Run Code Online (Sandbox Code Playgroud)
问题:使用*this和operator=初始化课程是否会产生任何负面影响?
我的C++重载不起作用,因为我认为它应该:
#include "Node.h"
#include <iostream>
Node::Node()
{
cout << "1" << endl;
Node(Game(), 0.0);
}
Node::Node(double v)
{
cout << "2" << endl;
Node(Game(),v);
}
Node::Node(Game g, double v)
{
cout << "3" << endl;
numVisits = 0;
value = v;
game = g;
}
Run Code Online (Sandbox Code Playgroud)
而输出来自:
Node n(16);
cout << n.value << endl;
Run Code Online (Sandbox Code Playgroud)
是0,应该是16.
我做错了什么?
是否有可能重载的构造函数以某种方式调用类中的另一个构造函数,类似于下面的代码?
class A {
public:
A(std::string str) : m_str(str) {}
A(int i) { *this = std::move(A(std::to_string(i))); }
std::string m_str;
};
Run Code Online (Sandbox Code Playgroud)
上面的代码有效,但我担心在构造函数中调用它可能会导致未定义的行为.
如果确实如此,请解释原因并提出更好的选择?
我在代码库中看到了一些我正在研究的代码,如下所示:
ZfooName::ZfooName(int magoo)
: ZfooName()
{
fGoo = magoo;
}
Run Code Online (Sandbox Code Playgroud)
我假设这是一个C++ 11功能,因为它在VS2012中断了,但它是什么意思?
在这个响应中,tloveless指出在MSVC中可以使用this->foo::foo(42); 构造函数委托来直接调用构造函数:
#include <iostream>
struct foo
{
int m;
foo(int p) : m(p) { std::cout << "foo("<<p<<")\n"; }
foo()
: m(0)
{
this->foo::foo(42);
std::cout << "foo(), " << m << "\n";
}
};
int main()
{
foo f;
std::cin.ignore();
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶这甚至在MSVC中编译; clang ++,g ++和我同意它是非法的,例如[class.ctor]/2"因为构造函数没有名称,所以在名称查找期间永远找不到它们"
但是,在MSVC12 Update 1(2013)和MSVC10 SP1(2010)中,MSVC甚至不会发出带有/Wall和不带语言扩展的警告/Za.
输出是:
foo(42) foo(), 42
在两个版本中.所以没有临时创建,但是一个名为的构造函数.
问题:
/Za并且扩展列表似乎不这么认为)(我用[delegating-constructors]标签标记了这个问题,因为它让我想起了这个功能)
meta-info:我几乎可以肯定这个问题是重复的,因为这个功能在某种程度上是已知的.例如,请参阅"类似问题"的答案.如果您能找到描述此功能的答案,请不要犹豫,将其作为副本关闭.
我知道在纯C++中没有办法做到这一点,但我想知道是否可以从C++/CLI中的另一个构造函数的初始化列表中调用构造函数,就像在C#中可以这样做一样.
例:
ref class Foo {
Foo() {}
Foo(int i) : Foo() {}
}
Run Code Online (Sandbox Code Playgroud) 我的代码:
#include <iostream>
using namespace std;
class Foo
{
public:
int bar;
Foo()
{
bar = 1;
cout << "Foo() called" << endl;
}
Foo(int b)
{
bar = 0;
Foo();
bar += b;
cout << "Foo(int) called" << endl;
}
};
int main()
{
Foo foo(5);
cout << "foo.bar is " << foo.bar << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Foo() called
Foo(int) called
foo.bar is 5
Run Code Online (Sandbox Code Playgroud)
为什么foo.bar价值不是6?Foo()被调用但未设置bar为1.为什么?
我正在尝试用C++创建一个需要多个对象构造函数的对象.说Foo()和Foo(int)地方Foo(int)然后调用Foo().简化代码如下:
#include <iostream>
class Foo{
private:
int iX;
public:
void printX(string sLabel){
cout << sLabel << " : " << " Foo::iX = " << Foo::iX << endl;
};
void setX(int iX){
Foo::iX = iX;
Foo::printX("setX(void) Method");
};
Foo(){
Foo::iX = 1;
Foo::printX("Foo(void) Constructor");
};
Foo(int iX){
Foo::setX(iX);
Foo::printX("Foo(int) Constructor");
Foo::Foo();
Foo::printX("Foo(int) Constructor");
};
};
int main( int argc, char** argv ){
Foo bar(2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其输出是
setX(void) Method : Foo::iX …Run Code Online (Sandbox Code Playgroud) c++ ×9
constructor ×4
c++11 ×2
this ×2
visual-c++ ×2
c++-cli ×1
class ×1
gcc ×1
methods ×1
object ×1
overloading ×1
rvalue ×1