相关疑难解决方法(0)

使用委托构造函数时的成员初始化

我已经开始尝试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;相反的方式移动到身体,它工作正常.但我真的希望能够使用初始化列表.

提前致谢!

c++ gcc ctor-initializer c++11

87
推荐指数
1
解决办法
3万
查看次数

构造函数可以在c ++中调用另一个构造函数吗?

class A{
  A(int a = 5){
    DoSomething();
    A();
  }
  A(){...}
}
Run Code Online (Sandbox Code Playgroud)

第一个构造函数可以调用第二个构造函数吗?

c++ constructor

36
推荐指数
3
解决办法
4万
查看次数

使用*this初始化一个类有什么后果吗?

在我写的一个小游戏中,我有一个Weapon带有两个构造函数的类,一个用于获取一些参数来生成一个自定义武器,另一个用于获取一个默认武器CHAIN_GUN:

Weapon::Weapon (void) {
    // Standard weapon
    *this = getWeapon(CHAIN_GUN);
    return;
}
Run Code Online (Sandbox Code Playgroud)

问题:使用*thisoperator=初始化课程是否会产生任何负面影响?

c++ initialization this

30
推荐指数
3
解决办法
1488
查看次数

构造函数在C++中重载

我的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.

我做错了什么?

c++

29
推荐指数
2
解决办法
8万
查看次数

C++中是否有一个方便的构造函数?

是否有可能重载的构造函数以某种方式调用类中的另一个构造函数,类似于下面的代码?

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)

上面的代码有效,但我担心在构造函数中调用它可能会导致未定义的行为.

如果确实如此,请解释原因并提出更好的选择?

c++ constructor this rvalue constructor-overloading

14
推荐指数
1
解决办法
1332
查看次数

什么:className()在className的构造函数中是什么意思?

我在代码库中看到了一些我正在研究的代码,如下所示:

 ZfooName::ZfooName(int magoo)
    : ZfooName()
 {
    fGoo = magoo;
 }
Run Code Online (Sandbox Code Playgroud)

我假设这是一个C++ 11功能,因为它在VS2012中断了,但它是什么意思?

c++ c++11

11
推荐指数
1
解决办法
490
查看次数

MSVC直接构造函数调用扩展

这个响应中,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

在两个版本中.所以没有临时创建,但是一个名为的构造函数.

问题:

  1. 这个扩展名是什么?
  2. 它不被视为延伸吗?(/Za并且扩展列表似乎不这么认为)
  3. 是否有关于此功能的/官方说明的文档?

(我用[delegating-constructors]标签标记了这个问题,因为它让我想起了这个功能)


meta-info:我几乎可以肯定这个问题是重复的,因为这个功能在某种程度上是已知的.例如,请参阅"类似问题"的答案.如果您能找到描述此功能的答案,请不要犹豫,将其作为副本关闭.

c++ visual-c++ language-extension delegating-constructor

8
推荐指数
1
解决办法
228
查看次数

如何在C++/CLI中将重载的构造函数调用转发给另一个构造函数

我知道在纯C++中没有办法做到这一点,但我想知道是否可以从C++/CLI中的另一个构造函数的初始化列表中调用构造函数,就像在C#中可以这样做一样.

例:

ref class Foo {
  Foo() {}
  Foo(int i) : Foo() {}
}
Run Code Online (Sandbox Code Playgroud)

c++-cli visual-c++ delegating-constructor

7
推荐指数
1
解决办法
5982
查看次数

构造函数不设置成员变量

我的代码:

#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++ constructor class

7
推荐指数
1
解决办法
657
查看次数

如何从另一个构造函数调用C++类构造函数

我正在尝试用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++ methods constructor overloading object

5
推荐指数
3
解决办法
2万
查看次数